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。

154953219.jpg

为了表示S={x1,x2,...,xn}这样一个含有n个元素的集合,Bloom Filter使用k个相互独立的哈希函数(Hash Function)将每个元素映射到{1,...,m}之间的范围中。对于任意一个元素x,第i个哈希函数映射的位置为hi(x)就会被置为1(1=

160032877.jpg

在判断y是否属于S集合时,我们对y使用k次哈希函数,如果所有的hi(y)的位置都是1(1=


160456678.jpg

错误率估计

假定Bloom Filter有m位,里面有n个元素,使用k个哈希函数。

因为插入第一个元素时,每一个哈希函数将{1,...,m}范围中的每一位被置为1的概率为1/m,那么该位仍然为0的概率为(1-1/m),所以应用k个哈希函数后该位仍然为0的概率为:


在插入第二个元素时,某个特定的位置仍然为0的概率为:

在插入了n个元素后该位置仍然为0的概率为:

布隆过滤器_第1张图片

根据以上得出:一个特定的位置在插入了n个元素后,被设置为1的概率则是:


布隆过滤器_第2张图片

在将n个元素插入Bloom Filter之后判断某个新元素y是否在Bloom Filter中(确实在或者误判)的概率时,需要hi(y)都为1(1=

根据计算e常用的极限公式:

得出以下概率表达式:

布隆过滤器_第3张图片


根据以上概率表达式,假定一个元素使用16bit表示,k=8,那么误判率为万分之五,关于在不同m/n和k的情况下,布隆过滤器的误识别率的参考数据大家可以查阅这个地址:

http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html

最优的哈希函数个数

根据上面得出的误判率公式很容易进行估计最优的哈希函数个数:

k=(m/n)*ln2