【C++ 哈希应用】

server/2024/9/24 23:24:07/

文章目录

  • 位图
    • 概念
    • 代码实现
    • 海量数据处理
  • 布隆过滤器
    • 概念
    • 代码实现
    • 海量数据处理
  • 哈希切割海量数据处理

位图

概念

一个值在给定的集合中有两种状态,在或不在,要表示这种状态,最少可以用一个比特位,比特位为1表示在,比特位为0表示不在。
位图中的比特位的位置表示编号,比特位的内容表示是否存在。

代码实现

	template<size_t N>class bitset{public:bitset():_bits(N / 32 + 1){}//设置某一位为1void set(size_t pos){size_t x = pos / 32;size_t y = pos % 32;_bits[x] |= (1 << y);}//设置某一位为0void reset(size_t pos){size_t x = pos / 32;size_t y = pos % 32;_bits[x] &= ~(1 << y);}//检测某一位的值bool test(size_t pos){size_t x = pos / 32;size_t y = pos % 32;return _bits[x] & (1 << pos);}private:vector<int> _bits;};

海量数据处理

  1. 给定100亿个整数,设计算法找到只出现一次的整数?
    使用两个位图标记出现的次数,(0, 0)表示出现0次,(0, 1)表示出现1次,(1,0)表示出现了两次及以上。
  2. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
    整形最多有UINT_MAX个数,按照一个数一个比特位来算,差不多需要512MB,所以只需要使用两个位图标记出现的次数,最后依次遍历每一位,如果都为1,就是交集
  3. 1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数?
    结合题1和题2的思路,用1G内存创建两个位图,(0, 0)表示出现0次,(0, 1)表示出现1次,(1,0)表示出现了两次及以上。

布隆过滤器

概念

位图的位置表示编号,内容表示是否存在这个值。那如果我们想用位图来标示某一个字符串的存在呢,我们可以用字符串hash函数将字符串转换为对应的整型值,但是这个hash值可能会产生冲突。这时,有人提出一种思路,既然一个hash函数不能标定一个字符串是否存在,那么如果字符串用多个字符串hash函数映射在位图中,如果一个字符串的所有hash值在位图中都存在(对应值为1),也不能肯定这个字符串真的存在,但如果有一个hash值在位图中不存在(对应值为0),那么可以肯定这个字符串一定不存在
通过加入更多的字符串hash函数,可以使得每个字符串即使冲突,也可以通过找不在位图中的hash值来快速判断一个字符串一定不存在
注意:布隆过滤器一般不提供删除接口,因为删除之后可能存在冲突

代码实现

template<size_t N, class HashFun1 = BKDRHash, class HashFun2 = APHash, class HashFun3 = DJBHash>
class BloomFilter
{
public:BloomFilter():_bs(new bitset<N>){}void set(const string& s){size_t hash1 = HashFun1()(s) % N;_bs->set(hash1);size_t hash2 = HashFun2()(s) % N;_bs->set(hash2);size_t hash3 = HashFun3()(s) % N;_bs->set(hash3);}bool test(const string& s){size_t hash1 = HashFun1()(s) % N;if (!_bs->test(hash1))return false;size_t hash2 = HashFun2()(s) % N;if (!_bs->test(hash2))return false;size_t hash3 = HashFun3()(s) % N;if (!_bs->test(hash3))return false;return true;}private:bitset<N>* _bs;
};

海量数据处理

  1. 给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法
    近似算法:使用布隆过滤器,将一个文件映射到布隆过滤器中,再遍历另一个文件,查找是否存在布隆过滤器中。这种方法存在误判。
    精确算法:哈希切分使用统一的字符串hash函数,分别将两个文件的所有字符串转换为对应的hash值,对于其中一个文件,创建N 个小文件,假设N = 10000,用字符串hash值 % N,最终将字符串写入对应的文件中,另一个文件也是同样的操作,这样相同的query一定会进入到相同编号的文件中,最后将相同编号的文件读入内存中,用set进行求交集。
    如果文件太大,有两种可能:a.文件中重复query太多,此时不需要处理,set自动去重 b.文件中不同的query太多,这是可以换一个字符串hash函数,再创建文件,将字符串映射到不同的文件中,进行操作。
  2. 如何扩展BloomFilter使得它支持删除元素的操作?
    每个位位置上不再存储比特位,而是存储一个整形,当插入一个元素时,将其映射到的位的位置上的计数器加一;当删除一个元素时,将其映射到的位的位置上的计数器减一。

哈希切割海量数据处理

给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?
哈希切分使用统一的字符串hash函数,分别将两个文件的所有字符串转换为对应的hash值,对于其中一个文件,创建N 个小文件,假设N = 1000,用字符串hash值 % N,最终将字符串写入对应的文件中,另一个文件也是同样的操作,这样相同的IP一定会进入到相同编号的文件中,最后将相同编号的文件读入内存中,用map进行记数求出出现次数最多的IP地址
如果文件太大,有两种可能:a.文件中重复IP太多,此时不需要处理,map自形解决即可 b.文件中不同的IP太多,这是可以换一个字符串hash函数,再创建文件,将字符串映射到不同的文件中,进行操作。
与上题条件相同,如何找到top K的IP?
维护一个小根堆即可


http://www.ppmy.cn/server/16688.html

相关文章

价值创造未来:财务规划与资源管理

对于企业来说&#xff0c;无论其财务转型是大胆前沿还是缓慢稳定的&#xff0c;都被期望能够创造更多的价值。这种价值为导向的模式却经常会被包括技术不匹配、流程错位、数据孤岛、系统不可访问以及缺乏自动化在内的各种障碍阻碍。同时&#xff0c;近年来随着技术革命产生的快…

vue3前端调用后端接口实现批量删除

//批量删除 let selection ref([]) const handleSelectionChange(val: any)>{ selection.value val } const delOne (id: string)>{ if (selection.value.length 0) { ElMessageBox.confirm("确定要删除这条数据吗&#xff1f;&#xff1f;&#xff1f;&qu…

x86_64 CPU的指令集

2024年4月26日&#xff0c;周五上午 x86_64 CPU的指令集&#xff0c;也称为x86-64或AMD64&#xff08;由AMD最初设计并命名&#xff09;&#xff0c;是一种广泛使用的64位微处理器架构。这种架构是传统32位x86指令集的扩展&#xff0c;为现代计算提供了增强的性能和能力。 以下…

热力膨胀阀的调节步骤

热力膨胀阀的调节步骤 (一)调节前提条件 在对热力膨胀阀进行开度调整前,需确保以下条件满足: 1.系统制冷剂充注量适当,无泄漏。 2.蒸发器进出口无杂质堵塞,气液两相分离良好。 3.冷凝器冷凝压力和出口过冷度正常。 4.压缩机吸排气压力和温度正常,无喘振。 5.膨胀阀感温包与蒸发…

制造型企业 如何实现便捷的机台文件统一管理?

机台文件统一管理&#xff0c;这是生产制造型企业都需要去做的&#xff0c;机台文件需要统一管理的原因主要包括以下几点&#xff1a; 1、提高效率&#xff1a;统一管理可以简化文件的访问和使用过程&#xff0c;提高工作效率&#xff0c;尤其是在需要频繁访问或更新机台文件的…

【白盒测试】单元测试的理论基础及用例设计技术(6种)详解

目录 &#x1f31e;前言 &#x1f3de;️1. 单元测试的理论基础 &#x1f30a;1.1 单元测试是什么 &#x1f30a;1.2 单元测试的好处 &#x1f30a;1.3 单元测试的要求 &#x1f30a;1.4 测试框架-Junit4的介绍 &#x1f30a;1.5 单元测试为什么要mock &#x1f3de;️…

LINUX基础培训三十之理论基础知识自测题(附答案)

一、单选题(50题) 1. Linux是一套类( )操作系统。 A、 POSIX B、 BSD C、 WINDOWS D、 UNIX 2. Linux系统中,所提供的安装软件包,默认格式为( )。 A、 .tar B、.tar.gz C、.rpm D、 .zip 3. Linux系统中,以下哪个是管道符( )。 A、| B、> …

excel文件导入dbeaver中文乱码

1.将excel文件进行另存为&#xff0c;保存类型选择【CSV】 2.选择【工具】–>【web选项】–> 【编码】–> 【简体中文&#xff08;GB18030&#xff09;】 3.在DBeaver进行数据导入 直接导入应该就可以&#xff0c;如果不行的话按下面处理。 选择【导入数据——选择cs…