前面提到了Bloom Filter用于存储并且搜索数据,但是前提是可以估计出插入的元素大小n,从而得到k和m。但是如果是动态插入元素,无法预知n的大小时,还采用标准的Bloom Filter将导致bit数组趋近于满负荷,会导致哈希函数的冲突显著增加,最直接的影响就是false positive显著上升。而Scalable Bloom Filter(SBT)就是为了解决这个问题,保证Bloom Filter的总的false positive保持在一定的可接受范围内,不至于无限制增加。
Scalable Bloom Filter是对标准的Bloom Filter的扩展,SBT由多个标准的Bloom Filter组成。初始的时候,SBT只有一个标准的Bloom Filter(BF0),它的false positive为P0,哈希函数个数为K0。将SBT的最后一个Bloom Filter记做BFi,那么当BFi被填满的时候(填充达到1/2),将新的BFi+1添加到SBT中。添加的规则是:false positive Pi+1 = Pi * r,哈希函数个数为Ki+1。
假设,当前Bloom Filter的总个数为l。此时,一连串的Bloom Filter的false positive为P0,P0 * r,P0 * r ^ 2, P0 * r ^ 3 ...... ,P0 * r ^ (l - 1)。那么混合的false positive(SBT的false positive)为,
根据下面的公式,
可以得出false positive的上届,
所以可以得出,
由于k = (m/n) * ln2,同时m= ( -n * lnp ) / (ln2 * ln2),所以k = - lnp / ln2。
所以可以推出,
同时,
为了使每一个k都是正整数,先假设r = 1 / 2。然后将r带入上面的公式,得到,
由于
可以得出, P0 = 1 / (2 ^ k0),则,
上面给出了综合false positive的上界2P0。
下面来看看每个Bloom Filter的大小以及可以存储的元素个数之间的关系。
SBT设置各个Bloom Filter的大小为m0,m0 * s,m0 * (s^2),......,m0 * (s ^ ( i -1))。为了方便计算,假设s = 2,也就是每添加一个Bloom Filter,新加入的都是它前面的Bloom Filter大小的2倍。
在这种情况下,可以得到SBT可以容纳的最大元素数(在保证bit位中0和1各占一半)为(2 ^ (i + 1 )- 1) * n0。其中n0表示第一个Bloom Filter中可以容纳的元素。
下面给出了证明的步骤:
前提:
证明: