【算法】大数据查重

大数据查重

哈希表

找出第一个出现重复的数字 || 找所有重复出现的数字

#include <iostream>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <stdlib.h>
#include <time.h>
#include <string>
using namespace std;#if 0
int main()
{vector<int> vec;srand(time(NULL));for(int i = 0; i < 10000; i++){vec.push_back(rand() % 10000);}// 找出第一个出现重复的数字 || 找所有重复出现的数字unordered_set<int> s1;for(auto key : vec){auto it = s1.find(key);if(it == s1.end()){s1.insert(key);}else{cout << "key:" << key << endl;break;}}统计重复数字以及出现的次数unordered_map<int, int> m1;for(auto key : vec){auto it = m1.find(key);if( it == m1.end()){m1.emplace(key, 1);}else{it->second += 1;}}for(auto pair : m1){if(pair.second > 1){cout << "key:" << pair.first << "cnt:" << pair.second << endl;}}// 一组数据有些数据是重复的,把重复的数据过滤掉unordered_set<int> s2;for(auto key : s2){s2.emplace(key);}return 0;
}

问题描述:有两个文件a和b,里面放了ip地址(URL,email)找出两个文件重复的ip,小于100M

分治思想,把大文件分成小文件,1-10,然后分别查重

位图算法

        位图法:就是用一个位(0或者1)来存储数据的状态,比较适合状态简单,数据量比较大,要求内存使用率低的问题场景。位图法解决问题,首先需要知道待处理数据中的最大值,然后按照size=(maxNumber/32)+1的大小来开辟一个char类型的数组,当需要在位图中查找某个元素是否存在时,首先需要计算该数字对应的数组中的比特位,然后读取值,0表示不存在,1表示已存在。

 

题目描述:有一亿个整数,最大不超过一亿,问哪些元素重复了,谁是第一个重复的,内存限制100M

        char数组就是8位,short就是16位,int就是32位

如何获取该位的值?

        bitmap[index] & (1 << offset) 就是1左移offset位,然后和bitmap[index]相与&,00000000 & 10000000 结果就是00000000,即就是没出现过

如何把这个位置置成1?

        即就是bitmap[index] | (1 << offset),10000000 | 00000000 = 10000000

int main()
{vector<int> vec = {12, 78, 90, 12, 8, 9};// 定义位图数组int max = vec[0];for (int i = 1; i < vec.size(); i++){if (vec[i] > max){max = vec[i];}}cout << max << endl;int *bitmap = new int[max / 32 + 1]();unique_ptr<int> ptr(bitmap);for (auto key : vec){int index = key / 32;int offset = key % 32;if (0 == (bitmap[index] & (1 << offset))){bitmap[index] |= (1 << offset);}else{cout << key << "key是第一个重复出现的数字。" << endl;return 0;}}return 0;
}

布隆过滤器

布隆过滤器是一种更高级的“位图法”解决方法,之所以它更高级,是因为他没有上面位图法所说的缺陷。

1.Bloom Filter是通过一个位数组和k个哈希函数构成的。

2.Bloom Filter的空间和时间利用率都很高,但它有一定的错误率,虽然错误率很低,他判断一个元素不在一个集合中,那么它一定不在,它判断某个元素在一个集合中,那么该元素可能在,也可能不在。

3.Bloom Filter的查找错误率,当然和位数组大小以及哈希函数的个数有关,具体的错误率计算有相应公式。

4.Bloom Filter默认只支持add和query操作,不支持delete操作(因为存储的状态为有可能也是其他数据的状态为,删除后导致其他元素查找判断出错)

场景一:提示过滤一些非法的网站,或者钓鱼网站等。

把所有可能怀疑有问题的网站的URL添加到布隆过滤器中https://www.xxx.com查找当前访问的网址URL是否在黑名单中,

如果网址URL不存在,那肯定在白名单中的合法的网址,可以访问;如果存在(有误判率),会进行提示网站有风险,禁止访问。

场景二:redis缓存中的应用

 

        查key到底在不在,而且效率要求高,最好还省内存。

        如果key不再,那么直接去db层mysql里面去查询,如果显示在,那么就在redis里面查,如果出现误判,则继续去mysql中查询。

        setBit(key)

        getBit(key) => key不存在 => DB => 缓存redis => return

        getBit(key) => key存在 => redis中找key

/** @Author: jyx* @Date: 2025-03-09 13:35:39* @LastEditors: jyx* @Description:*/
#include <iostream>
#include <vector>
#include <string>
using namespace std;class BloomFilter
{
private:/* data */int bitSize_;vector<int> bitMap_;
public:BloomFilter(int bitsize = 1471): bitSize_(bitsize){bitMap_.resize(bitSize_ / 32 + 1);}~BloomFilter(){}void setBit(const char* str){// 计算k组哈希函数的值int idx1 = BKDHash(str) % bitSize_;int idx2 = RHash(str) % bitSize_;int idx3 = JSHash(str) % bitSize_;// 把相应的idx1,idx2,idx3这几个位全部置1int index = 0;int offset = 0;index = idx1 / 32;offset = idx1 % 32;bitMap_[index] |= ( 1 << offset);index = idx2 / 32;offset = idx2 % 32;bitMap_[index] |= (1 << offset);index = idx3 / 32;offset = idx3 % 32;bitMap_[index] |= (1 << offset);}bool getBit(const char* str){int idx1 = BKDHash(str) % bitSize_;int idx2 = RHash(str) % bitSize_;int idx3 = JSHash(str) % bitSize_;int index = 0;int offset = 0;index = idx1 / 32;offset = idx1 % 32;if(0 == (bitMap_[index] = (1 << offset))){return false;}index = idx2 / 32;offset = idx2 % 32;if (0 == (bitMap_[index] = (1 << offset))){return false;}index = idx3 / 32;offset = idx3 % 32;if (0 == (bitMap_[index] = (1 << offset))){return false;}return true;}};class BlackList
{
private:/* data */BloomFilter blackList_;
public:BlackList(/* args */){}~BlackList(){}void add(string url){blackList_.setBit(url.c_str());}bool query(string url){return blackList_.getBit(url.c_str());}
};int main()
{BlackList list;list.add("https://www.baidu.com");list.add("https://www.taobao.com");list.add("https://www.jingdong.com");list.add("https://www.leetcode.com");string url = "https://www.jingdong.com";list.query(url);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30841.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网格图学习(附题单与做题思路)

文章目录 一、DFS 经典题型695. 岛屿的最大面积 二、BFS 经典题型994. 腐烂的橘子**算法选择对照表** 一、DFS 经典题型 岛屿的最大面积 LeetCode 695描述&#xff1a;求网格中最大的陆地连通区域面积解题&#xff1a;DFS 遍历所有相邻陆地&#xff0c;标记已访问关键点&#…

安装树莓派3B+环境(嵌入式开发)

一、环境配置 1、下载树莓派镜像工具 点击进入下载连接 进入网站&#xff0c;点击下载即可。 2、配置wifi及ssh 将SD卡插入读卡器&#xff0c;再接入电脑&#xff0c;随后打开Raspberry Pi Imager下载工具&#xff0c; 选择Raspberry Pi 3 选择64位的操作系统 选择SD卡 选择…

Leetcode 刷题记录 06 —— 矩阵

本系列为笔者的 Leetcode 刷题记录&#xff0c;顺序为 Hot 100 题官方顺序&#xff0c;根据标签命名&#xff0c;记录笔者总结的做题思路&#xff0c;附部分代码解释和疑问解答。 目录 01 矩阵置零 方法一&#xff1a;标记数组 方法二&#xff1a;两个标记变量 02 螺旋矩阵…

前端 | 向后端传数据,判断问题所在的调试过程

目录 ​编辑 1. 在 vue 文件中&#xff0c;在调用函数之前 先打印传入的数据 2. 在 js 文件中&#xff0c;打印接收到的数据 3. 在浏览器 Network 面板查看请求数据 4. 在 server.js 中查看请求数据 5. 确保 JSON 格式正确 知识点&#xff1a;JSON.stringify(req.body, …

江科大51单片机笔记【11】AT24C02(I2C总线)

一、存储器 1.介绍 RAM的特点是存储速度特别快&#xff0c;但是掉电会丢失&#xff1b;ROM的特点是存储速度特别慢&#xff0c;但是掉电不会丢失 SRAM是所有存储器最快的&#xff0c;一般用于电脑的CPU高速缓存&#xff0c;容量相对较少&#xff0c;成本较高&#xff1b;DRAM…

Python绘制数据分析中经典的图形--列线图

Python绘制数据分析中经典的图形–列线图 列线图是数据分析中的经典图形&#xff0c;通过背后精妙的算法设计&#xff0c;展示线性模型&#xff08;logistic regression 和Cox&#xff09;中各个变量对于预测结果的总体贡献&#xff08;线段长短&#xff09;&#xff0c;另外&…

Golang学习笔记_44——命令模式

Golang学习笔记_41——观察者模式 Golang学习笔记_42——迭代器模式 Golang学习笔记_43——责任链模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 事务管理系统2. 多媒体遥控器3. 操作审计系统 四、Go语言实现示例五、高级应用…

致同报告:香港财政赤字加剧,扩大税基与增收迫在眉睫

2月26日香港政府2025-26年度财政预算案&#xff0c;&#xff08;以下简称“预算案”&#xff09;发布&#xff0c;香港财政司司长陈茂波提出一系列旨在减少开支并振兴香港经济的措施&#xff0c;以应对日益增长的财政赤字。主要提案包括对所有公务员实施冻薪、针对性税务宽减措…

计算机网络笔记(二)——1.2互联网概述

1.2.1网络的网络 起源于美国的互联网现已发展成为世界上最大的覆盖全球的计算机网络。 下面&#xff0c;我们先来看看关于网络、互连网、互联网(因特网)的一些基本概念。为了方便&#xff0c;后面我们所称呼的"网络"往往就是"计算机网络",而不是电信网或有…

小程序开发总结

今年第一次帮别人做小程序。 从开始动手到完成上线&#xff0c;一共耗时两天。AI 让写代码变得简单、高效。 不过&#xff0c;小程序和 Flutter 等大厂开发框架差距实在太大&#xff0c;导致我一开始根本找不到感觉。 第一&#xff0c;IDE 不好用&#xff0c;各种功能杂糅在…

DeepSeek开启AI办公新模式,WPS/Office集成DeepSeek-R1本地大模型!

从央视到地方媒体&#xff0c;已有多家媒体机构推出AI主播&#xff0c;最近杭州文化广播电视集团的《杭州新闻联播》节目&#xff0c;使用AI主持人进行新闻播报&#xff0c;且做到了0失误率&#xff0c;可见AI正在逐渐取代部分行业和一些重复性的工作&#xff0c;这一现象引发很…

IntelliJ IDEA 2021版创建springboot项目的五种方式

第一种方式&#xff0c;通过https://start.spring.io作为spring Initializr的url来创建项目。 第二种方式&#xff0c;通过https://start.spring.io官网来直接创建springboot项目压缩包&#xff0c;然后导入至我们的idea中。 点击generate后&#xff0c;即可生成压缩包&#xf…

IDEA与Maven使用-学习记录(持续补充...)

1. 下载与安装 以ideaIU-2021.3.1为例&#xff0c;安装步骤&#xff1a; 以管理员身份启动ideaIU-2021.3.1修改安装路径为&#xff1a;D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾选【创建桌面快捷方式】&#xff08;可选&#xff09;、【打开文件夹作为项目】&…

MySQL入门手册

MySQL入门手册&#xff1a;从零开始掌握数据库管理 &#x1f4d6; 一、MySQL是什么&#xff1f; MySQL 是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典MySQL AB公司开发&#xff0c;现隶属于Oracle旗下。它使用**结构化查询语言&#xff…

从0到1入门RabbitMQ

一、同步调用 优势&#xff1a;时效性强&#xff0c;等待到结果后才返回 缺点&#xff1a; 拓展性差性能下降级联失败问题 二、异步调用 优势&#xff1a; 耦合度低&#xff0c;拓展性强异步调用&#xff0c;无需等待&#xff0c;性能好故障隔离&#xff0c;下游服务故障不影响…

行业案例:10Wtps超高并发“某节跳动”钱包架构与落地方案

1. 项目背景与挑战 1.1 项目背景 &#xff08;1&#xff09;八端支持&#xff1a; 2022年&#xff0c;字节系产品在春节活动中面临的挑战是支持八个不同的APP产品&#xff08;包括抖音、抖音火山版、抖音极速版、西瓜视频、头条、头条极速版、番茄小说、番茄畅听&#xff09;…

C++入门——引用

C入门——引用 一、引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。这就好比《水浒传》中&#xff0c;一百零八位好汉都有自己的绰号。通过&…

基于YOLO11深度学习的电瓶车进电梯检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

PH热榜 | 2025-03-09

1. ResumeUp 2.0 标语&#xff1a;聊聊&#xff0c;几分钟内就能帮助你打造完美的ATS简历。 介绍&#xff1a;告别为写完美简历而烦恼的日子吧&#xff01;只需与人工智能聊天&#xff0c;回答几个简单的问题&#xff0c;就能在几分钟内生成强有力的简历&#xff0c;不仅能通…

嘉立创修改的值不在drc范围内

我是因为画电源线线宽比较大&#xff0c;超出了DRC检查范围。 解决办法&#xff1a; 改这里就好了