关于布隆过滤器的本质

最早在吴军博士的《数学之美》上了解到布隆过滤器(Bloom Filter),它能以O(1)的时间代价完成集合元素的检索和插入,并以最小的空间代价保证了假正例(False Positive)概率不大于给定阈值。当时感觉得这东西是一个加强版的哈希表,后来算了一下发现确实如此:布隆过滤器的本质就是利用若干个哈希表的检索结果进行投票表决。

我们先来看一个普通哈希表做集合元素检索的效率。设全集为S={a1,a2,...,an},h(x):S{0,1,...,m1}为某哈希函数将S映到一个长为m的数组A上,满足A[h(ai)]=1.A中的其他元素均置0.

现在有一个新元素b,我们想知道它是否也在集合S中。要下这个判断,我们只需计算h(b),然后看A[h(b)]是否为0就行了。

然而这样会出现问题。当b和某个ajb的哈希地址发生冲撞时,我们会错误地判定bS,这就是假正例。我们可以计算一下这种情况发生的概率。假设我们的哈希函数h取得足够好,其值域在{0,1,...,m1}中几乎分布均匀。那么h(b)和某个h(aj)不发生冲撞的概率为(11m)和任一h(aj)都不发生冲撞的概率为(11m)n,于是出错的概率为

P1=1(11m)n

注意到上式中n为定值,出错概率P1为空间开销m的减函数。为让P1(m)尽可能小,只能让m取得更大。由此可见出错概率和空间开销这两者是一对此消彼长的矛盾关系。

那么,通过牺牲空间代价来换取更小的出错率,除了把m取得更大,有没有其他更好的办法呢?显然是有的。我们可以取多个彼此独立的哈希函数hi(x),i=1,2,...,k,如法炮制出k个这样的数组A1,A2,...,Ak.新来一个b,每一个Ai均会对b是否属于S下一个判断。显然,只要有一个Ai表示bS,那么b就一定不属于S.出错的情况只可能有一种,就是A1,A2,...,Ak在检测b时均发生了地址冲撞。这件事情的概率是

P2=[1(11m)n]k
.

好了,若现在就断言第二种方法要优于第一种,我们并一定买账。为证明这一点,我们不妨比较一下在同样空间开销O(km)下两个模型的出错概率:

P1(km)=1(11km)n1enkm,

P2(km)=[1(11m)n]k(1enm)k.

下图显示了在不同的参数下P1(km)P2(km)的关系。其中横坐标为k,纵坐标为m/n,黄色区域表示P1(km)>P2(km),蓝色区域表示P1(km)P2(km).在实际中k>1是显然成立的,因此只需要保证k>1.5我们就能断定第二种方法的效率要高于第一种。

不难看出,将k个bit array连起来,第二种方法正是一个典型的布隆过滤器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值