计算布隆过滤器的近似总体

时间:2012-02-01 21:02:36

标签: c++ algorithm probability bloom-filter computation

给定大小为N位和K个散列函数的布隆过滤器,其中设置了滤波器的M位(其中M <= N)。

是否可以估算插入布隆过滤器的元素数量?

简单示例

我一直在考虑以下示例,假设一个100位的BF和5个散列函数,其中设置了10位......

最佳情况:假设散列函数非常完美且唯一地映射了一些X值的值,那么给定10位已设置,我们可以说只有2个元素插入BF

最糟糕的情况:假设哈希函数不好并且一致地映射到相同的位(但彼此之间是唯一的),那么我们可以说已经将10个元素插入到BF中

范围似乎是[2,10],其中这个范围内的大概可能是由过滤器的假阳性概率决定的 - 我现在卡在了这一点。

2 个答案:

答案 0 :(得分:12)

这个问题让我有点担心,因为有better algorithms来计算存储量很少的不同元素的数量。

然而,如果我们必须使用Bloom过滤器,我们假设散列函数是随机的oracles(所有值都是独立选择的,或者“非常完美”,不要与完美散列相混淆)。现在我们有一个球和箱子的问题:鉴于MN箱子里面有球,我们扔了多少个球?让B成为抛出的球的数量;项目数为B/K,因为每个项目我们都会投掷K个球。

球和箱过程的标准近似是将每个箱建模为独立的泊松过程; bin被占用之前的时间是指数分布的。假设1为抛出所有球所需的时间,此指数分布率的最大似然估计λ满足Pr(Exponential[λ] < 1) = M/N,因此1 - exp(-λ) = M/N和{{ 1}}。参数λ = -log(1 - M/N)类似于球的数量,因此项目数的估算值为λ

编辑:有B ≈ -N log(1 - M/N)/K个分区,因此我们需要乘以N

答案 1 :(得分:0)

Wikipedia处的条目为您提供了设置任何特定位的概率的公式,假设散列函数使所有内容都是随机的。这是1 - (1-1/m)^kn。由于过滤器中有m位,这意味着设置的预期/平均位数将为m(1-(1-1/m)^kn)。因此,您可以通过选择使n等于实际设置的位数的n来为Var(X) = E(X^2) - E(X)^2提出合理合理的猜测。

为了了解这种猜测的准确程度,可以了解设置的位数的方差。你可以完全解决这个问题,但这是一个痛苦的问题。您可以使用E(X^2)这一事实。在这种情况下,0主要取决于两个位都将被设置的概率,并且您可以通过考虑诸如“位1之类的语句的设置概率和位{{1}来解决这个问题。 }}清除,所有其他位都清晰“和”位0清除“和”除01之外的所有位都清楚“。