使用范围:实现数据字典,进行数据的判重,集合求交集
基本原理:基于bitmap,bitmap中用一个bit位来表示一个数字,而Bloom filter是用多个bit位是否同时存在来判定元素是否存在。它的实现用到了位数组和k个hash函数,存入一个元素时,用k个hash函数分别求值,并将相应的bit位置1,当查找的时候,根据k个hash值,到k个位置查找,如果k个位置都存在,表明该元素存在,如果有一个bit位不存在表明元素不存在。很明显这个过程并不保证查找结果是百分百正确。同时它也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动其它的关键字,一个简单的改进是使用counting bloom filter,用一个counter数组来替换位数组,就可以支持删除了。还有一个比较重要的问题,如何根据输入元素个数n,确定位数组m的大小以及 hash函数个数k. 当hash函数个数k=(ln2)*(m/n)时错误率最小,在错误率不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合,因为要保证bit数组里至少一半为0,则应该满足m>=n*lg(1/E) * lge,大概就是n*lg(1/E)的1.44倍(lg表示以2为底的对数)
举个例子,我们假设错误率为0.01,则此时m应该大概是n的13倍,k大概是8个
注意m是以bit为单位,而n则是以元素个数为单位,通常单个元素的长度都是有很多bit的,所以使用Bloom filter通常很节省内存
扩展:Counting bloom filter将数组中的每一位扩展为一个counter,从而支持了元素的删除操作,而Spectral Bloom Filter将其与几何元素的出现次数惯量,
SBF采用counter中的最小值来近似表示元素出现的频率