【发布时间】:2014-12-02 19:03:03
【问题描述】:
我正在浏览Hadoop In Action,并在Bloom Filter 上看到了解释,上面写着:
误报率由等式近似
(1 – exp(-kn/m))k
其中 k 是使用的哈希函数的数量,m 是 用于存储布隆过滤器的位数,n 是 要添加到布隆过滤器的元素。在实践中,m 和 n 是 由系统的要求决定,因此,k 是 选择最小化给定 m 和 n 的误报率,其中(之后 一点微积分)是
k = ln(2) * (m/n) ≈ 0.7 * (m/n)
假的 给定 k 的阳性率为 0.6185m/n,并且 k 必须是 整数。误报率只是一个近似值。从一个 从设计的角度来看,应该考虑 (m/n)、数量 每个元素的位数,而不是单独的 m。例如,我们必须存储一个 包含一千万个 URL 的集合 (n=10,000,000)。分配 8 位 每个 URL (m/n=8) 将需要 10 MB Bloom 过滤器 (m = 80,000,000 位)。此布隆过滤器的误报率为 (0.6185)8, 或约 2%。如果我们要通过存储来实现 Set 类 原始 URL,假设平均 URL 长度为 100 字节,我们 将不得不使用 1 GB。布隆过滤器缩小了存储空间 要求提高 2 个数量级,而代价仅为 2 百分百误报率!分配给的存储空间略有增加 布隆过滤器将进一步降低误报率。 10 点 每个 URL 的位数,布隆过滤器将占用 12.5 MB 并且有一个错误 阳性率仅为 0.8%。
所以这里说误报率是 0.6185*8,即 4.948,但是文档怎么说它大约是 2%?有人可以帮我计算百分比吗?
根据大卫的回答详细解释:
根据书中的解释:
n = 10,000,000 = 1e7
m/n = 8 which means m = 8*n
k = ln(2) * (m/n), Value of ln(2) is 0.693 = 0.7, so value of k = 0.7 * (m/n)
现在进入我的表达方式:
(1 – exp^(-kn/m))^k = (1 - exp^(-0.7))^(0.7*8) = (1 - 0.4965)^(5.6) = (0.5034)^(5.6) = 0.0214 (Here ^ represents power)
要计算百分比,我们必须乘以 100。
所以百分比是0.0214*100 = 2%
【问题讨论】: