C++海量数据处理:位图和布隆过滤器

C++位图及应用 位图 位图是用一个比特位来表示一个数据是否存在这一状态的信息,1表示存在,0表示不存在。常用于海量的数据,没有重复的时候,快速判断某个数据是否存在 1个字节有8个比特位,就能表示8个数据的状态信息,有N个数据,需要N/8+1个字节。 例如,有一个整形数据集合 {1,3,7,4,12,16,19,13,22,18};其中最大数据为22,最小数据为1,首先估算需要大概多少个字节,位图中应包含min到max这个范围中所有数据的状态信息。实际需要22个比特位,需要3个字节的空间。 第二步将集合中的数据向位图中进行 阅读详情
前言

有一道非常经典的题目:给40亿个不重复的无序的无符号整数,再给一个无符号整数,如何快速判断这个数是否在这40亿个数中。

关于这道题目我们首先想到的解法就是排序二分查找,或者借助关联式容器进行求解,但是40亿个数据的数据量是非常巨大的(16G),没有办法放入内存中,所以在面对这种海量数据处理的时候,我们今天来学习位图和布隆过滤器的相关知识,用来解决海量数据处理的问题。

一:位图

位图其实就是哈希结构的变形,同样通过映射来处理数据,采用直接定址法存储数据,只不过位图本身并不存储数据,而是通过存储一个比特位来标记这个数据是否存在,1代表存在,0代表不存在。

位图通常情况下用在海量数据的处理上,且数据不重复的情景下判断某个数据是否存在。

代码实现:

class bitmap{
public:
	bitmap(size_t N){
		_bits.resize(N / 32 + 1, 0); // 多开一个整型32bit
		_num = 0;
	}

	// 标记
	void set(size_t x){
		// 寻找x的标记存放在第几个整型
		size_t index = x / 32;
		// 寻找x的标记在这个整型的第几个位
		size_t pos = x % 32;

		//左移是向高位移动
		_bits[index] |= (1 << pos);
	}

	void reset(size_t x){
		// 寻找x的标记存放在第几个整型
		size_t index = x / 32;
		// 寻找x的标记在这个整型的第几个位
		size_t pos = x % 32;

		// 第pos个位置置为0
		_bits[index] &= ~(1 << pos);
	}

	// 判断x的映射位是否为1
	bool test(size_t x){
		// 寻找x的标记存放在第几个整型
		size_t index = x / 32;
		// 寻找x的标记在这个整型的第几个位
		size_t pos = x % 32;

		return _bits[index] & (1 << pos);
	}

private:
	std::vector<int> _bits;
	size_t _num; // 存储的数据个数
};

位图的应用:

  1. 快速查找某个数据是否在这个集合中
  2. 排序+去重
  3. 求两个集合的交集和并集
  4. 操作系统中的磁盘块标记

位图的优缺点分析:

  1. 节省空间,效率高
  2. 只能处理整型并且不能处理哈希冲突

二:布隆过滤器

布隆过滤器是由布隆提出的 一种概率型的数据结构,布隆过滤器实则就是位图与哈希表的结合,特点是高效地插入和查询,它是用多个哈希函数,将一个数据映射到位图结构中。这种方式不仅可以提升查询效率,还可以节省大量的内存空间。

代码实现:

template<class K = std::string, class Hash1 = HashStr1, class Hash2 = HashStr2, class Hash3 = HashStr3>
class bloomfilter{
public:
	bloomfilter(size_t num){
		_bs(-1);
	}
	void set(const K& key){
		// 通过多个哈希函数将数据映射到位图中
		size_t index1 = Hash1()(key);
		size_t index2 = Hash2()(key);
		size_t index3 = Hash3()(key);

		_bs.set(index1);
		_bs.set(index2);
		_bs.set(index3);
	}

	// 存在误删的问题
	void reset(const K& key){
		// 不支持删除
	}

	bool test(const K& key){
		// 判断在是不准确的,可能存在误判,判断不在是准确的。
		size_t index1 = Hash1()(key);
		if (_bs.test(index1) == false)
			return false;
		size_t index2 = Hash2()(key);
		if (_bs.test(index2) == false)
			return false;
		size_t index3 = Hash3()(key);
		if (_bs.test(index3) == false)
			return false;

		return true;
	}
private:
	// 底层其实是一个位图
	bitmap _bs;
	size_t len;
};

布隆过滤器的应用:

  1. 减少磁盘IO或者网络请求(一个值不存在,可以不用进行后续的查询请求)
  2. 客户端内容推荐浏览内容

布隆过滤器的优缺点分析:

  1. 节省空间并且高效
  2. 可能会存在误判,不支持删除。

三:海量数据的处理

3.1 位图的应用

问题:给定100亿个整数,设计算法找到只出现一次的整数。

1G大概是10亿个字节,100亿个整数就是400亿个字节,400亿个字节40G。

方法一:
出现0次的,出现1次的,出现2次及以上的,这里存在3种数据状态,出现0次的标志为00,出现1次的标志为01,出现2次及以上的标志为10。

方法二:
设置两个位图,位图1和位图2的对应位都提供一个位来标记数据。再遍历两个位图找出所有对应位映射为01的整数。

问题:给两个文件分别有100亿个整数,我们只有1G内存,如何找到两个文件的交集。

方法一:
将其中一个文件中的数据放到一个位图当中,读取另一个文件中的整数,判断在不在位图当中,若在就是交集,不在就不是交集。

方法二:
将其中一个文件的整数映射到一个位图种,将另一个文件的整数映射到另一个位图种,再将两个位图中的对应位按位与,与之后位为1的位就是交集。

3.2 布隆过滤器的应用

问题:给两个文件分别有100亿个query(请求),只有1G内存,找到两个文件的交集,分别给出精确算法和近似算法。

方法一:
将一个文件中的query映射到一个布隆过滤器中,读取另一个文件中的query,判断在不在布隆过滤器中,在就是交集,不在就不是交集。

缺陷:布隆过滤器判断数据在可能会存在误判,所以交集中有可能有些数据不准确。

方法二:
将大文件切分成小文件加载到内存中(平均切割),一般切出来的小文件的大小能放进内存就可以,但是这里要不断地进行比较(不是暴力比较,小文件中数据放入set当中,搜索效率还是要高出不少)。

用同一个哈希函数处理query,i = hashstr(query) % 份数,则两个文件中相同的query一定会进入编号相同的小文件,将一个大文件分成的小文件放进一个set中,读取另一个大文件切割成的小文件中对应的小文件中的query,在第一个小文件中就是交集,不在则不是交集。

问题:如何扩展布隆过滤器使得它支持删除元素的操作。

解法一:
每个位标记为计数器
那么到底用几个位来表示计数器呢?若位数太少可能会导致计数器溢出,但如果使用更多的位来映射一个位置,那么空间的消耗就会增大。

一般采用16位来标记计数器

3.3 哈希切割的应用

问题:给一个超过100G大小的log file,log中存着IP地址,设计算法找到出现次数最多的IP地址。

统计次数一般用KV模型的map解决,但是100G大小放不进内存中。
IP有可能出现在不同的小文件当中,平均切分是不合理的。

读取IP用哈希算法计算编号,IP就会进入相同编号的小文件,运用map<string, int> 读取小文件中的IP次数,设置中间变量存储相对出现次数较多的IP地址出现的次数,统计完成则得出结果。

问题:给一个超过100G大小的log file,log中存着IP地址,设计算法找到topK的IP地址,如何直接用Linux系统命令实现。

统计次数一般用KV模型的map解决,但是100G大小放不进内存中。
IP有可能出现在不同的小文件当中,平均切分是不合理的。

读取IP用哈希算法计算编号,IP就会进入相同编号的小文件,出现次数最多的IP,就建小堆进行操作。

布隆过滤器之C++实现 C++实现的布隆过滤器,其中使用到的bitset也是自己简单实现的一个BitContainer。可以处理千万条到亿条记录的存在性判断。做成dll可以在很多场合使用,如自己写爬虫,要判断一个url是否已经访问过,判断一个单词是否在某个字典内,当集合很大的时候,用布隆过滤器很有优势,不过使用前,请了解它的优缺点(缺点是有一定的误判率) 立即下载

相关推荐

位图类操作

本程序代码可以用来完成数字图像处理中的位图类的定义及位图类的操作,为后续的图像处理打基础

C++笔记---布隆过滤器

布隆过滤器(Bloom Filter)是一种空间效率高的概率型数据结构,用于判断一个元素是否在一个集合中。如果判断的结果是不存在,那么该元素一定不存在,如果判断的结果是存在,该元素也有可能不存在。也就是说,布隆过滤器可以过滤掉。布隆过滤器的思路就是把key先映射转成哈希整型值,然后按照与位图相同的方式用bit位进行标记,但由于多个key可能映射出相同的整型值,所以只用一个bit位进行标记的话冲突概率较大。

2302_80372340的博客 1128

C++ 数据结构之布隆过滤器

主要介绍了C++ 数据结构之布隆过滤器的相关资料,需要的朋友可以参考下

【C++】35:位图,布隆过滤器和海量数据处理(哈希扩展)

本文系统讲解了位图和布隆过滤器两种数据结构及其应用。位图通过比特位标记数据存在性,解决了40亿整数查找问题,仅需500MB内存。文章详细介绍了位图的设计实现、接口操作及扩展应用(如统计出现次数)。布隆过滤器则通过多哈希函数映射解决非整型数据判存问题,分析了误判率计算及代码实现,并探讨了删除问题的解决方案。最后,文章给出了海量数据处理方法,包括topK问题、哈希切分技术等。这两种数据结构在爬虫去重、垃圾邮件过滤等场景具有重要应用价值。

qq_62473190的博客 403

【分享】获取微信通讯录python代码形式实现

微信号”, “昵称”, “地区”, “备注”, “标签”, “签名”, “来源”5. 找到最后一个空格所在的位置(后一个就是真正的联系人了)当前微信号与上一个相同的时候,说明到底部了,可以跳出循环。3. 滚动鼠标到最顶部(防止已经滚动了一部分了)7.记录下上一个联系人的微信号。7. 无限循环按键盘下箭头。获取详情中的以下元素内容。6. 点击第一个联系人。4. 获取联系人列表。

程序员老狼专注开发aigc或客服系统应用 2894

DDR核心机制解析:从Burst到Prefetch的性能跃迁

本文深入解析了DDR内存性能跃迁的核心机制,重点阐述了Burst(突发传输)与Prefetch(预取)技术的协同工作原理。Burst机制通过连续传输数据减少访问延迟,而Prefetch则通过内部预取数据提升吞吐量,两者结合完美匹配现代CPU缓存行需求,是DDR3等内存实现高效带宽的关键。

weixin_29232121的博客 135

c++海量数据处理方法

c++海量数据处理方法

2302_80908313的博客 1033

赛灵思KV260视觉AI套件实战:从模型到边缘部署全流程解析

边缘计算与AI推理加速是当前嵌入式系统和物联网领域的关键技术。其核心原理在于将计算任务从云端下沉至网络边缘的设备端,通过专用硬件加速器(如FPGA、ASIC或NPU)执行神经网络推理,从而显著降低延迟、减少带宽消耗并提升数据隐私性。这一技术为实时性要求高的应用场景(如工业视觉检测、智能安防、自动驾驶等)提供了关键支撑。以赛灵思(Xilinx)的Zynq UltraScale+ MPSoC平台为例,其集成了ARM处理器与可编程逻辑,通过预置的深度学习处理器单元(DPU)为卷积神经网络提供高效INT8加速。开发

weixin_28719225的博客 326

位图与布隆过滤器 —— 海量数据处理

详细介绍了位图与布隆过滤器 —— 海量数据处理的方式方法

You build it, you run it 2491

前端监控性能指标

文章目录前端监控性能指标性能指标阶段性指标关键性能指标小程序W3C Level 1兼容性常规用法注意事项1、计算HTML文档请求使用 Nav Timing2、计算静态资源使用 getEntriesByType('resource') 代替 getEntries()3、secureConnectionStart 问题4、跨域资源设置响应头 Timing-Allow-Origin5、注意属性值为 0 ...

foolbird 1348

SAP NetWeaver Business Client (NWBC) 的深入解析

SAP NetWeaver Business Client(NWBC)作为 SAP 提供的一种用户界面,旨在为终端用户提供无缝集成传统 SAP GUI 事务和新开发的基于 Web Dynpro ABAP 的应用程序的体验。SAP NetWeaver Business Client(NWBC)是 SAP 推出的用户界面,旨在为终端用户提供单一入口,集成传统的 SAP GUI 事务和新开发的基于 Web Dynpro ABAP 的应用程序。在实际业务场景中,NWBC 的应用提升了用户的工作效率和体验。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1607

C++哈希应用-位图/布隆过滤器/海量数据处理

C++位图/布隆过滤器/海量数据处理零、前言一、位图1、位图概念2、位图接口的介绍以及实现3、位图的应用二、布隆过滤器1、布隆过滤器概念和介绍2、布隆过滤器的操作及实现3、布隆过滤器的分析三、海量数据处理 零、前言 本章主要讲解C++中对哈希的应用有关方面的内容,位图,布隆,海量数据处理 一、位图 1、位图概念 位图概念: 位图其实就是哈希的变形,同样通过映射来处理数据,只不过位图本身并不存储数据,而是存储标记 通过一个比特位来标记这个数据是否存在,1代表存在,0代表不存在 位图通常情

~ 1486

Palantir如何利用Ontology构建企业级数据地图

Palantir通过"本体论"(Ontology)技术构建动态数据地图,将多源异构数据转化为可操作的业务知识网络。该技术突破传统ETL模式,建立覆盖全组织的语义层,将原始数据映射为"客户""订单"等业务对象及其关联关系,形成可推理的语义网络。核心Foundry平台提供本体管理工具(OMA)和开发套件(OSDK),支持从数据连接到应用开发的全流程。虽然采用专有实现而非标准本体语言,但该架构成功解决了数据孤岛问题,赋能复杂决策分析

Learning 1802

C++进阶——位图+布隆过滤器+海量数据处理

有一些场景下面,有。

博客 | 复习知识点 + 练习 + 最终的领悟 | 全力以赴 965

【第48例】BLM模型之市场洞察-五看工具篇(一)

BLM市场洞察

产品线负责人 2111

使用Python爬取在线图书馆的图书馆藏和阅读记录

通过使用Python编写爬虫程序,我们可以从在线图书馆上获取图书馆藏和阅读记录,帮助人们更好地管理和利用图书馆资源。本文简要介绍了爬虫程序的准备工作、网页解析和数据提取、数据的保存和处理的关键步骤,并提供了一个示例代码。在实际应用中,我们需要注意遵守在线图书馆的使用规则和爬虫道德准则,确保合法、合规地进行爬取操作。以上仅为概述,实际应用的过程中可能需要根据具体需求进行适当的调整和改进。

2201_76125393的博客 729

【C++高阶】哈希之美:探索位图与布隆过滤器的应用之旅

在数据科学的浩瀚星空中,哈希函数犹如一颗璀璨的星辰,以其独特的光芒照亮了数据处理的每一个角落。哈希,这一简单而强大的技术,通过将任意长度的输入(如字符串、数字等)映射到固定长度的输出(即哈希值),实现了数据的快速定位与索引。然而,哈希的魅力远不止于此,当它与位图和布隆过滤器相结合时,更是催生出了一系列高效且实用的数据处理方案

EterNity_TiMe_的计算机学习之路 2974

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STL:位图和布隆过滤器

位图和布隆过滤器可以帮助我们解决一些海量数据处理问题!!

weixin_51142926的博客 3241

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【C++杂货铺】海量数据处理(位图、布隆过滤器)

【C++杂货铺】海量数据处理(位图、布隆过滤器)。本期【C++杂货铺】,将介绍关于哈希表的扩展内容,即位图和布隆过滤器,以及如何通过位图和布隆过滤器解决海量数据处理问题。

jupangMZ的博客 1528

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【C++】位图和布隆过滤器

这篇文章详细的介绍了位图与布隆过滤器,位图与布隆过滤器是C++开发者在处理大数据集时常用的优化工具。位图通过每一位表示集合中某元素的存在性,实现空间与查询效率的双赢,特别适用于快速去重和查找。而布隆过滤器则是一种概率型数据结构,利用多个哈希函数降低误判率,适用于判断元素是否“可能”存在于集合中,适合处理大规模数据过滤。尽管布隆过滤器存在删除困难和一定误判率的缺点,但其高效的空间利用率和查询速度,使其成为处理海量数据时的优选方案。掌握位图与布隆过滤器的实现与应用,对于提升C++程序性能至关重要。

是阿建吖! 1534

【C++干货铺】哈希结构的应用:位图 | 布隆过滤器 | 海量数据处理

本篇文章介绍了哈希结构的应用和哈希切割。

qq_55119554的博客 1527

C++拓展:吊打海量数据!哈希扩展之位图与布隆过滤器实战解析

本文介绍了位图和布隆过滤器两种哈希扩展技术,用于高效处理海量数据问题。位图通过比特位映射整数状态,实现快速查重和交集计算,适用于40亿整数查重等场景,空间利用率高但仅支持整数。布隆过滤器则通过多哈希函数映射任意类型数据,支持字符串去重、缓存穿透防护等应用,虽存在误判但可调控。文章详细讲解了两者的原理、实现和应用场景,并提供了C++代码示例。此外还介绍了TopK、大文件交集等海量数据处理技巧,为开发者和面试者提供了一套完整的解决方案。

2301_79248256的博客 1712

C++修炼:位图和布隆过滤器

详细讲解并模拟实现位图和布隆过滤器

但凡的博客 1519

C++ 哈希思想应用:位图,布隆过滤器,哈希切分

C++ 哈希思想应用:位图,布隆过滤器,哈希切分

Wzs040810的博客 3026

【C++】位图/布隆过滤器+海量数据处理

学习位图/布隆过滤器+海量数据处理相关知识

阿润菜菜的博客 2183

C++:位图/布隆过滤器+海量数据处理

构造一个16位的位图,所有位都初始化为0。构造一个16位的位图,根据所给值初始化位图的前n位。构造一个16位的位图,根据字符串中的0/1序列初始化位图的前n位。

2302_79054145的博客 1497
上一篇: STL关联式容器:unordered_map和unordered_set
下一篇: C++11:新特性(右值引用、移动语义、lambda表达式、线程库)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值