Math 计算bloom过滤器中正确的位数

Math 计算bloom过滤器中正确的位数,math,bloom-filter,Math,Bloom Filter,我正在尝试制作一个可配置的bloom过滤器。在构造函数中,您可以设置过滤器的预测必要容量(n)、所需错误率(p)和哈希函数列表(大小k) ,以下关系成立(m为位数): 因为我得到了p,n和k作为参数,所以我需要求解m;我得到以下信息: m = k * n / (1 - p ** (1 / k)) 然而,有几件事让我觉得我做错了什么。对于初学者来说,p**(1/k)对于足够大的k,将趋向于1,这意味着整个分数定义不清(因为可以想象,你可以除以0) 您可能注意到的另一件事是,随着p(允许的最大错误

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

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

因为我得到了
p
n
k
作为参数,所以我需要求解
m
;我得到以下信息:

m = k * n / (1 - p ** (1 / k))
然而,有几件事让我觉得我做错了什么。对于初学者来说,
p**(1/k)
对于足够大的
k
,将趋向于
1
,这意味着整个分数定义不清(因为可以想象,你可以除以
0

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


我哪里出错了?

你确实正确地解出了方程,但请注意维基百科指出:

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

你确实正确地解决了这个问题,但是请注意维基百科指出:

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

你的代数运算看起来是正确的,但是你确定你从一个正确的公式开始吗?wikipeda页面与您的页面类似,但并不完全相同……您的代数运算看起来是正确的,但您确定从正确的公式开始吗?wikipeda页面与您拥有的内容类似,但并不完全相同。。。