Bloom Filter是一种空间利用率很高的随机数据结构,它用位数组很简洁地表示一个集合,并能判断一个元素是否包含于该集合。Bloom Filter用一定的代价换取这种高效:在判断一个元素是否包含于该集合时,有一定的几率(即误判率 false positive rate)产生误判(false positive)。因此,Bloom Filter不合适那些“零错误”的应用场合。
在能容忍低错误率的应用场合,Bloom Filter通过极少的错误换取了存储空间的极大节省(只占hash table的1/4甚至1/8)。
集合表示与元素查询
下面我们看Bloom Filter是如何用位数组表示集合的。初始状态:Bloom Filter是一个包含m位的位数组,每一位都置0。
为了表示S={x1,x2,...,xn}这样一个含有n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function)将每个元素映射到{1,...,m}之间的范围中。对于任意一个元素x,第i个哈希函数映射的位置为hi(x)就会被置为1(1=<i<=k)。在下图中k=3(即使用3个哈希函数),且只有两个哈希函数选中同一位置。
在判断y是否属于S集合时,我们对y使用k次哈希函数,如果所有的hi(y)的位置都是1(1=<i<=k),那么我们认为y就属于集合S或者是一次误判(false positive)。下图中y1不属于这个集合而y2属于这个集合。
错误率估计
假定Bloom Filter有m位,里面有n个元素,使用k个哈希函数。
因为插入第一个元素时,每一个哈希函数将{1,...,m}范围中的每一位被置为1的概率为1/m,那么该位仍然为0的概率为(1-1/m),所以应用k个哈希函数后该位仍然为0的概率为:
在插入第二个元素时,某个特定的位置仍然为0的概率为:
在插入了n个元素后该位置仍然为0的概率为:
根据以上得出:一个特定的位置在插入了n个元素后,被设置为1的概率则是:
在将n个元素插入Bloom Filter之后判断某个新元素y是否在Bloom Filter中(确实在或者误判)的概率时,需要hi(y)都为1(1=<i<=k),所以y在Bloom Filter中的概率为:
根据计算e常用的极限公式:
得出以下概率表达式:
根据以上概率表达式,假定一个元素使用16bit表示,k=8,那么误判率为万分之五,关于在不同m/n和k的情况下,布隆过滤器的误识别率的参考数据大家可以查阅这个地址:
http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html
最优的哈希函数个数
根据上面得出的误判率公式很容易进行估计最优的哈希函数个数:
k=(m/n)*ln2
转载于:https://blog.51cto.com/paladinapple/1305892