【问题标题】:Calculating the right number of bits in a bloom filter计算布隆过滤器中正确的位数
【发布时间】:2012-02-07 14:19:40
【问题描述】:

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

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

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

由于我得到p、n和k作为参数,我需要求解m;我得到以下信息:

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

但是,有几件事让我觉得我做错了什么。对于初学者来说,p ** (1 / k) 将倾向于1 以获得足够大的k,这意味着整个分数的定义不明确(因为您可以想象除以0)。

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

我哪里做错了?

【问题讨论】:

  • 您的代数运算看起来是正确的,但您确定您开始使用了正确的公式吗?维基百科页面有一些类似于的东西,但与你所拥有的并不完全相同......

标签: math bloom-filter


【解决方案1】:

您确实正确解出了方程式,但请注意 Wikipedia 指出:

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)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    相关资源
    最近更新 更多