计算布隆过滤器中正确的位数

时间:2012-02-07 14:19:41

标签: math bloom-filter

我正在尝试制作可配置的布隆过滤器。在构造函数中,您可以设置过滤器的预测必要容量(n),所需的错误率(p)以及散列函数列表(大小为k)。

According to Wikipedia,以下关系成立(m是位数):

p = (1 - k * n / m) ** k

由于我将pnk作为参数,我需要求解m;我得到以下内容:

m = k * n / (1 - p ** (1 / k))

然而,有一些事情让我觉得我做错了什么。首先,p ** (1 / k)会向1倾向于k,这意味着整个分数定义不明确(因为您可以想象除以0)。

您可能会注意到另一件事是,p(允许的最大错误率)会增长,m也会增长,这完全是倒退。

我哪里出错了?

1 个答案:

答案 0 :(得分:4)

你确实正确地解决了这个等式,但请注意维基百科说:

The probability of all of them being 1, which would cause
the algorithm to erroneously claim that the element is in
the set, is often given as:

p ~= (1 - (1 - 1 / m) ** (k * n)) ** k ~= (1 - Exp(-k * n / m)) ** k

这与你所说的非常不同:

p = (1 - k * n / m) ** k

所以你真正想要的是

p = (1 - (1 - 1 / m) ** (k * n)) ** k

我这样做是为了

(1 - 1 / m) ** (k * n) = 1 - p ** (1 / k)
1 - 1 / m = (1 - p ** (1 / k)) ** (1 / (k * n))
m - 1 = m * (1 - p ** (1 / k)) ** (1 / (k * n))
m - m * (1 - p ** (1 / k)) ** (1 / (k * n)) = 1
m * (1 - (1 - p ** (1 / k)) ** (1 / (k * n))) = 1
m = 1 / (1 - (1 - p ** (1 / k)) ** (1 / (k * n)))