布隆过滤器+哈希切分

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HaloTrriger/article/details/79825437

  1.首先了解下什么是布隆过滤器,它实际上是一个很长的二进制向量和一系列随机映射函数。
如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。
  2.不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit array)中的一个点。这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了,这就是布隆过滤器的基本思想。
  3.而布隆过滤器正是通过多个不同哈希函数算法将一个数映射到位阵列的多个点上,由多个点表示一个数。但布隆过滤器却无法保证一个数绝对存在,因为有可能某个数字将一个点置为1,而在检测目标值发现这个点恰巧为1,这就会造成误判。因此,布隆过滤器只能作为近似算法。
  4.但它的优势是可以准确判定一个数不存在。因为通过一种哈希算法得出该点为0,那就可以肯定这个数一定不在表中。且布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。

例题1:
给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法
和近似算法

近似算法
100亿个query,先将一个文件100亿的query,使用布隆过滤器通过多个哈希算法映射,然后用另一个文件通过同样的多个哈希算法进行比较,即可找到交集。
精确算法
两个文件,都分成1000份。怎么分呢?将query转换成整型然后对1000求模运算,这样100亿个query就分到了1000个文件,每个文件内用位图存储,并对这1000个文件编号,用编号相同的文件进行比较,找出交集。
这里写图片描述

例题2:
如何扩展BloomFilter使得它支持删除元素的操作,如何扩展BloomFilter使得它支持计数操作

布隆过滤器的删除和计数差不多类似,需要将它该进成用两多个bit表示一个哈希算法的结果。和位图key-value模型一样,存出一次,value加一次,删除就让value减一次。00表示0次,01一次,10两次,11三次,如果多的话就需要增加bit位表示。
这里写图片描述

这篇博客其实理解起来有点绕,不懂的童鞋欢迎提问。

猜你喜欢

转载自blog.csdn.net/HaloTrriger/article/details/79825437