其他分享
首页 > 其他分享> > BloomFilter原理

BloomFilter原理

作者:互联网

1、Bloom Filter的核心是一个【m】位的bitset和【k】个hash函数。

初始时bitset中所有位的值都设置为0,假设取【m = 10】,【k = 3】,用蓝色表示某位为0,红色表示为1

 

 

 2、插入数据

  插入元素的过程是三步走:

  (1)计算k个hash值

  (2)将k个hash值对m取模得到k个下标

  (3)将bitset中k个下标对应的位设置为1

   例:比如向的Bloom Filter插入元素“Alice”。

  分别用3个hash函数计算“Alice”的hash值,将hash值对10取模,得到在[0, 10)范围内的r1、r2、r3,

  假设计算结果为:

  r1 = h1("Alice") % m = 1

  r2 = h2("Alice") % m = 3

  r3 = h3("Alice") % m = 5

  于是将bitset中第1位、第3位和第5位的值置为1

 

 

 

  再插入元素“Bob”的过程还是一样的,假设:

  r1 = h1("Bob") % m = 8

  r2 = h2("Bob") % m = 2

  r3 = h3("Bob") % m = 3

  那就将bitset中第2位、第3位、第8位的值置为1(值已经为1的第3位不动):

  图形化思考的话就是,Bloom Filter运行过程中不断插入新元素,bitset里的0逐渐被翻转成1。

3、查询数据

 怎么判断元素“Alice”是否在集合里呢?同样还是三步走:

 (1)计算k个hash值

 (2)将k个hash值对m取模得到k个下标

   (3)检查bitset中k个下标对应的位是否都为1

  如果Bloom Filter里有“Alice”,那bitset中相应的k位值显然都为1。问题是即使Bloom Filter里没有“Alice”,

  还是可能由于之前插入的元素而导致“Alice”对应的k位值都为1,因此会错误地认为集合里已经有“Alice”了,

  这就是Bloom Filter会出错的地方。

  【不支持删除】由于bitset里每位都和多个元素有关,将某个为1的位置为0,涉及到这位的元素都会被认为不属于集合,所以Bloom Filter不支持删除操作。

4、复杂度分析

  空间复杂度方面:Bloom Filter不会动态增长,运行过程中维护的始终只是m位的bitset,所以空间复杂度只有O(m)。

  时间复杂度方面:Bloom Filter的插入与属于操作主要都是在计算k个hash,所以都是O(k)。

  参考链接: https://www.jianshu.com/p/8193d7dc8348

 

标签:hash,Bloom,Alice,Filter,插入,bitset,原理,BloomFilter
来源: https://www.cnblogs.com/robots2/p/15037000.html