半岛体育- 半岛体育官方网站- APP下载C++哈希应用之位图哈希切分与布隆过滤器详解
2025-06-24半岛,半岛体育,半岛体育app,半岛官网,半岛电竞,半岛真人,半岛棋牌,半岛体育官网注册,半岛体育官方app下载,半岛体育app下载,半岛体育怎么样,半岛体育官网,半岛体育登录入口,半岛体育官方网站所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是
给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中?
开一个位图,使用哈希的直接定址法,值是几,就把位图中的比特位标记成1,仅占用512M空间。
但我们不能按照比特位来开辟空间,所以使用char或int等内置类型进行空间的开辟:
但个人认为如果将题目要求的40亿数字全部录入位图中,等于遍历了一遍40亿个数字,既然都遍历一遍原数据了,那还不如在遍历的时候直接比对呢,对吧,相比之下直接比对数据连512M的位图都不用开。
可以认为这里的整数的最大值为unsigned int的最大值,一个整数共有三种状态:00,01,02,分别代表不存在,出现一次,出现两次及以上,代码如下:
2、给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
和第一问类似,开两个位图,分别将两组数据映射进位图,两个位图对应的比特位均为1即为交集。
3、位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数
同第一问,开两个位图,00代表不存在,01代表出现一次,10代表出现两次,11代表出现两次以上。
缺点:要求范围相对集中,范围特别分散的,空间消耗大;位图只对整型使用,浮点数、string等其他类型无法使用。
如果要判断其他类型,该类型如果可以使用哈希函数转为整型的,可以考虑下布隆过滤器哈(见下文布隆过滤器的介绍)。
给一个超过100G大小的log fifile, log中存着IP地址, 设计算法找到出现次数最多的IP地址?
直接使用map中的insert将每一个冲突桶的元素插入到map中。情况一:如果insert插入失败,说明空间不足,new节点失败,抛出异常。解决方法是换个哈希函数,递归再次对这个冲突桶进行切分。情况二:map可以正常统计。
布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询。它是用多个哈希函数,将一个数据映射到位图结构中,可以用来告诉你 “某样东西一定不存在或者可能存在”。此种方式不仅可以提升查询效率,也可以节省大量的内存空间。
既然这种方法能判断某个元素一定不存在,那么如何降低“误判”(映射为1的概率)的概率,提升准确判定(映射为0的概率)的概率呢?
解决方法就是对同一个元素使用多组哈希函数进行映射,它能降低误判率,但是增加了空间消耗。使用时需要把控好布隆过滤器的哈希函数的个数和布隆过滤器的长度。公式为k=(m/n)*lg2
【k:哈希函数的个数;m:布隆过滤器的长度;n:插入元素的个数】(选型可参照本文)
1、不需要一定准确的场景,例如个人网站注册时候的昵称判重,使用布隆过滤器可以判断某个昵称一定没有被使用过,但会误判某些造成冲突但没有被使用的昵称。
2、提高效率。例如客户端查找信息时,先用布隆过滤器筛一下,如果不在,则直接将未查到的信息反馈给客户端;如果布隆过滤器发现查找信息与位图匹配,则将需要查找的信息推送给服务器中的数据库进行精确查找。
单纯的布隆过滤器是不支持删除的,因为一个比特位可能被多个元素所映射。如果非要在布隆过滤器中实现reset,那就只能将位图结构修改为计数器结构。数据set时,每被映射一次,计数器加1,reset时,该位计数器-1,直到该位计数器为0。毫无疑问,这种操作所需的空间消耗急剧增加。
增加和查询元素的时间复杂度为:O(K), (K为哈希函数的个数,一般比较小),与数据量大小无关哈希函数相互之间没有关系,方便硬件并行运算布隆过滤器不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势在能够承受一定的误判时,布隆过滤器比其他数据结构有这很大的空间优势数据量很大时,布隆过滤器可以表示全集,其他数据结构不能使用同一组散列函数的布隆过滤器可以进行交、并、差运算
有误判率,即存在假阳性(False Position),即不能准确判断元素是否在集合中(补救方法:再建立一个白名单,存储可能会误判的数据)不能获取元素本身一般情况下不能从布隆过滤器中删除元素如果采用计数方式删除,可能会存在计数回绕问题
给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法
近似算法:使用布隆过滤器,先将其中一个文件set进布隆过滤器中,再将另一个文件的数据进行比对,可以淘汰一定不是交集的那部分,不过余下的那部分数据中,仍会有非交集的存在。
精确算法:使用哈希切分,将两个大文件分别切成一个个小文件A0-A99,B0-B99(单个小文件超过1G参照上文哈希切分对于此问题的解决方法);因为使用的是相同的哈希函数,所以交集必定存在于A0和B0,A1和B1这种相同下标的小文件中。可以先将A0存放至哈希表中,B0去重后与哈希表比对,就能够精确得到交集。
到此这篇关于C++哈希应用之位图,哈希切分与布隆过滤器详解的文章就介绍到这了,更多相关C++哈希内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
大家好,本篇文章主要讲的是C语言互换最大值与最小值的位置,感兴趣的同学赶快来看一看吧,对你有帮助的线
在分析数据时,首先要解决数据的保存问题,下面这篇文章主要给大家介绍了关于如何使用C语言将数字、字符等数据写入、输出到文本文件中的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下