首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在番石榴的BloomFilter中,实际的假阳性率远远低于期望的假阳性概率?

为什么在番石榴的BloomFilter中,实际的假阳性率远远低于期望的假阳性概率?
EN

Stack Overflow用户
提问于 2019-09-19 10:47:20
回答 2查看 157关注 0票数 0

我使用了一个具有较小的期望假阳性概率(fpp)的Bloom过滤器,得到的结果要少得多:

代码语言:javascript
复制
    BloomFilter<Long> bloomFilter = BloomFilter.create(Funnels.longFunnel(), 1_000_000, .001);
    int c = 0;
    for (int i = 0; i < 1_000_000; i ++) {
        // can replace with random.nextLong() because 1M random.nextLong() can hardly make collision
        if (!bloomFilter.put(Long.valueOf(i))) {
            // There is no duplicated elements so put returns false means false-positive
            c ++;
        }
    }
    System.out.println(c);

我期望1000 (1M * 0.001)假阳性,但结果是127 (如果我使用较大的随机数,结果也将接近120,而不是1000)。

===更新===

这是我的测试:

代码语言:javascript
复制
desired actual    a/d 
0.3     0.12      40%
0.1     0.03      30%
0.03    0.006     20%    (guava's default fpp)
0.01    0.0017    17%
0.003   0.0004    13%
0.001   0.00012   12%
0.0003  0.00003   10%
0.0001  0.000009   9%
0.00003 0.000002   7%
0.00001 0.0000005  5%
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-29 13:49:21

如果过滤器中的条目较少,则假阳性概率较低。在测试中,首先计算以空集开始的概率,然后在添加条目时计算概率。这不是正确的方法。

您需要首先向Bloom过滤器中添加100万个条目,然后计算假阳性概率,例如,检查条目是否在未添加的集合中。

代码语言:javascript
复制
for (int i = 0; i < 1_000_000; i ++) {
    bloomFilter.put(Long.valueOf(i));
}
for (int i = 0; i < 1_000_000; i ++) {
    // negative entries are not in the set
    if (!bloomFilter.mightContain(Long.valueOf(-(i + 1)))) {
        c++;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2019-09-19 18:49:38

BloomFilter提供的唯一保证是,真正的假阳性概率最多是您设置的值。在某些情况下,Bloom过滤器数据结构的性质可能不得不“绕过”实际的FPP。

这可能只是一种情况,BloomFilter必须比你要求的更准确,否则你就走运了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58009314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档