Function
- 空间效率高的概率型数据结构,用来检查一个元素是否在一个集合中
- 对于一个元素检测是否存在的调用,BloomFilter会告诉调用者两个结果之一:可能存在或者一定不存在
Theory
BloomFilter通常采用bit array实现,假设其bit总数为m,初始化时m个bit都被置成0。
BloomFilter中插入一个元素,会使用k个hash函数,来计算出k个在bit array中的位置,然后,将bit array中这些位置的bit都置为1。
以一个例子,来说明添加的过程,这里,假设m=19,k=2,如下:
如上图,插入了两个元素,X和Y,X的两次hash取模后的值分别为4,9,因此,4和9位被置成1;Y的两次hash取模后的值分别为14和19,因此,14和19位被置成1。
BloomFilter中查找一个元素,会使用和插入过程中相同的k个hash函数,取模后,取出每个bit对应的值,如果所有bit都为1,则返回元素可能存在,否则,返回元素不存在。
请注意:为什么bit全部为1时,是表示元素可能存在呢?
还是以上图的例子说明
- 假如,要查找一个元素Z,其hash计算出来的位置为9,14,此时,BloomFilter认为此元素存在,但是,Z实际上是不存在的(因为这两个位置因为插入X 和 Y设置成1),此现象称为false positive。
最后,BloomFilter中不允许有删除操作,因为删除后,可能会造成原来存在的元素返回不存在,这个是不允许的,还是以一个例子说明:
当删除X后,会把bit 4和9置成0,这同时会造成查询Z时,报不存在的问题,这对于BloomFilter来讲是不能容忍的,因为它要么返回绝对不存在,要么返回可能存在。
loomFilter中不允许删除的机制会导致其中的无效元素可能会越来越多,即实际已经删除的元素,但在bloomfilter中还认为可能存在,这会造成越来越多的false positive,在实际使用中,一般会废弃原来的BloomFilter,重新构建一个新的BloomFilter。