使用并集或交集功能时如何获取布隆过滤器集的大小?

时间:2019-04-01 02:36:46

标签: python approximation bloom-filter

我正在尝试将Bloom Bloom过滤器的并集和交集函数与python包(https://github.com/jaybaird/python-bloomfilter.git)结合使用时获得Bloom Bloom过滤器的大小

尽管我在执行了函数“ union”或“ intersection”之后,可以通过添加len()函数来获得结果,但是它只输出“ 0”输出。

from pybloom import BloomFilter
bf1 = BloomFilter(1000)
bf2 = BloomFilter(1000)

# After adding some elements to bf1 and bf2
print(len(bf1.union(bf2)))
# expected max(len(bf1), len(bf2)) but the result was 0

找到文档页面后,我意识到len()选项在'union'函数之后被禁用,其实际结果len()为0。

相反,我想以某种方式近似布隆过滤器集的大小。 您对计算尺寸有任何想法吗?

1 个答案:

答案 0 :(得分:2)

该实现仅复制BloomFilter的bitarray,即self.bitarrayprevious filters中的元素self.count不计在内。

因此它不会合并元素-而是进行位数组or


更新

在大多数情况下,您无需估算计数。调用add时,它提供了precise count个元素,您可以调用len(bf3)。不幸的是,新创建的bf3未被称为add,所以len(bf3) == 0如此。

要使公式近似于元素数,

- m / k * ln(1- n / m)

您有

import math.log as ln

m = bf3.bitarray.length()
n = bf3.bitarray.count()
k = bf3.num_slices

# given m=20, n=8, approximate n elements as 5.89