转自:http://blog.csdn.net/jiaomeng/article/details/1497361
应用Bloom Filter的几个小技巧
焦萌 2007年1月29日
下面列举几个基于标准Bloom Filter的小技巧:
1. 求两个集合的并。假设有两个Bloom Filter分别表示集合S1和S2,它们位数组的大小相同且使用同一组哈希函数,那么要求表示S1和S2并集的Bloom Filter,只要将S1和S2的位数组进行“或”操作即可得到结果。
2. 将Bloom Filter“对折”。如果想将一个Bloom Filter的大小缩小一半,那么只需将Bloom Filter的位数组分成两半进行“或”操作,得到的结果即为所求。在查找某一元素时,需要将哈希后的索引地址的最高位屏蔽掉。
3. 通过0的数目估计集合元素个数。在第一篇文章Bloom Filter概念和原理中,我们提到过:位数组中0的比例非常集中地分布在它的数学期望值m (1 - 1/m)kn的附近,其中m为位数组的大小,k为哈希函数的个数,n为Bloom Filter所表示集合的元素个数。根据上式,知道了0的个数就可以很容易推断n的大小。
4. 通过内积估计集合交集元素个数。假设有两个Bloom Filter分别表示集合S1和S2,它们位数组的大小相同且使用同一组哈希函数,下面我们来看第i位在两个Bloom Filter同时被置为1的概率。要让某一位同时被置为1,只有两种可能:要么它是被S1∩S2中的元素设置的,要么分别是被S1 – (S1∩S2)和S2 - (S1∩S2)中的元素设置的。因此第i位在两个Bloom Filter同时被置为1的概率为:
|S|表示S中元素的个数,k表示哈希函数的个数,m表示位数组的大小。经过化简,再乘以m,得到两个位数组内积的数学期望值为:
如果不知道|S1|和|S2|,可以用3中的方法根据0的个数估计出它们的大小。最后,根据上式,我们在知道内积的情况下就可以很容易推断| S1∩S2|的大小。
5. 表示全集。很简单,将位数组设为全1就可以表示全集了,因为查找任何一个元素都会得到肯定的结果。