Spectral Bloom Filter (4)

membership query上,由于SBFCBF都沿用bloom filter的基本结构,因此很难在membership query上提高查询效率。但在查询元素出现频率(大于1的情况)时,由于SBF采用counter中的最小值来近似表示元素的出现频率,使得各个counter的重要性有所差别,因此CBFcounter一视同仁的做法就有提高的空间。

 

先来看第一种优化算法Minimal Increase。这种算法的思想比较简单,从它的名字大家也能猜出个大概。它的基本思想是:既然在查询元素出现频率时我们只关心counter的最小值,那在增加元素时我们就只增加最小值。如果有多个counter都是最小值,把它们都增加;如果连续加入r个相同的元素,就把最小值(一个或多个counter)加r,其它counter的值或者维持不变,或者设为最小值加r,看哪一个比较大。这种算法是一种聪明的偷工减料:原来增加一个元素时要增加k(哈希函数个数)个counter,现在只需要增加最小值。而counter的增加次数一旦减少,就意味着hashing时碰撞的次数减少,因此查询元素出现频率时出错的可能性也就随之降低。经论文作者证明,Minimal Increase使查询错误率降低了k倍。

 

当然,偷工减料不可能只有好处。Minimal Increase最大的弊端就是不支持删除操作。很明显,由于增加元素时增加的counter不确定,因此删除元素时也无从下手。如果将kcounter都减少,就会造成false negative的出现(查询结果表明集合不包含某元素而实际上包含)。由于这个严重的弊端,Minimal Increase的应用前景被大打折扣。

 

下面我们来看一种既支持增删操作又降低查询错误率的算法Recurring Minimum。这种算法的基本思想是:发现有可能出错的情况,然后将它们单独处理。先解释一下什么是recurring minimumSBF中如果一个元素对应的kcounter中有一个以上都维持最小值,就称它有recurring minimumRM)。我们发现没有RM(即single minimum)的元素出现查询错误的概率很高,而有RM的元素错误概率很低。因此这种算法将没有RM的元素单独处理,在主SBF之外又增加了一个辅助的SBF,专门用来存储这类元素。由于这类元素所占比例不会太大,因此辅SBF可以只分配较小的空间,比如主SBF的一半大小。

 

采用Recurring Minimum增加元素x时,先将x在主SBF对应的kcounter的值增加,然后再判断这kcounter有没有recurring minimum。如果有,就当什么事都没有发生,直接继续;如果没有,就意味着x出错的概率很大,这时我们将x存储在辅SBF上,counter的值设为x在主SBF对应counter的最小值。删除元素和上面的操作类似,由于主SBF没有受算法的影响,所以不会出现false negative。在查询一个元素时,先看它在主SBF中有没有recurring minimum。如果有,就返回counter的最小值;否则检查辅SBF中的counter最小值,如果大于0就返回这个值,否则返回主SBF的值。

 

由于有recurring minimum的情况本来出错概率就很小,而没有recurring minimum的情况又单独处理,也大大降低了出错概率,所以整个算法的错误率得以降低。Recurring Minimum算法的错误率虽然不及Minimum Increase,但比原来的错误率要好很多,可以说是用更多的空间换取了错误率的大幅降低。

你可能感兴趣的:(Bloom,Filter)