应用Bloom Filter的几个小技巧

应用Bloom Filter的几个小技巧

焦萌 2007129

 

下面列举几个基于标准Bloom Filter的小技巧:

 

1.         求两个集合的并。假设有两个Bloom Filter分别表示集合S1S2,它们位数组的大小相同且使用同一组哈希函数,那么要求表示S1S2并集的Bloom Filter,只要将S1S2的位数组进行“或”操作即可得到结果。

 

2.         Bloom Filter“对折”。 如果想将一个Bloom Filter的大小缩小一半,那么只需将Bloom Filter的位数组分成两半进行“或”操作,得到的结果即为所求。在查找某一元素时,需要将哈希后的索引地址的最高位屏蔽掉。

 

3.         通过0的数目估计集合元素个数。在第一篇文章Bloom Filter概念和原理中,我们提到过:位数组中0的比例非常集中地分布在它的数学期望值m (1 - 1/m)kn的附近,其中m为位数组的大小,k为哈希函数的个数,nBloom Filter表示集合的元素个数。根据上式,知道了0的个数就可以很容易推断n的大小。

 

4.         通过内积估计集合交集元素个数。假设有两个Bloom Filter分别表示集合S1S2,它们位数组的大小相同且使用同一组哈希函数,下面我们来看第i位在两个Bloom Filter同时被置为1的概率。要让某一位同时被置为1,只有两种可能:要么它是被S1∩S2中的元素设置的,要么分别是被S1 – (S1∩S2)S2 - (S1∩S2)中的元素设置的。因此第i位在两个Bloom Filter同时被置为1的概率为:

应用Bloom Filter的几个小技巧_第1张图片

|S|表示S中元素的个数,k表示哈希函数的个数,m表示位数组的大小。经过化简,再乘以m,得到两个位数组内积的数学期望值为:

如果不知道|S1||S2|,可以用3中的方法根据0的个数估计出它们的大小。最后,根据上式,我们在知道内积的情况下就可以很容易推断| S1∩S2|的大小。

 

5.         表示全集。很简单,将位数组设为全1就可以表示全集了,因为查找任何一个元素都会得到肯定的结果。

你可能感兴趣的:(filter)