【问题标题】:Is there any probabilistic data structure that gives false negatives but not false positives?是否有任何概率数据结构给出假阴性但不给出假阳性?
【发布时间】:2012-10-27 03:00:30
【问题描述】:

我需要一个节省空间的概率数据结构来存储我已经计算过的值。对我来说,计算很便宜,但空间却不是——所以如果这个数据结构返回一个误报,我可以每隔一段时间重做一些工作,但误报是不可接受的。所以我正在寻找的是与Bloom filter 相反的东西。

【问题讨论】:

  • 参见:Link1Link2
  • 老问题,我知道,但现在你让我好奇了。什么外部事件导致先前计算的值消失和/或变为无效(如果是主动的,你能得到通知,如果是被动的,你怎么知道或以后发现这个事实)?例如,在哪里、如何以及最重要的是,whentrue-positive 值“丢失”,因此它现在需要,正如你所说,“重做”。我可以想到几个不同方向的解决方案,但似乎都需要有关用例的更具体的细节。另外,“便宜”有多便宜,否则这里有一个完整的解决方案:λx → false

标签: data-structures hash probability bloom-filter


【解决方案1】:

对于假阴性,您可以使用有损哈希表或 LRUCache。 它是一种具有快速 O(1) 查找的数据结构,只会给出假阴性。 如果你问“我是否运行过测试 X”,它会告诉你“是的,你肯定有”,或者“我不记得了”。

伪代码:

setup_test_table():
    create test_table( some large number of entries )
    clear each entry( test_table, NEVER )
    return test_table

has_test_been_run_before( new_test_details, test_table ):
    index = hash( test_details , test_table.length )
    old_details = test_table[index].detail
    // unconditionally overwrite old details with new details, LRU fashion.
    // perhaps some other collision resolution technique might be better.
    test_table[index].details = new_test_details
    if ( old_details === test_details ) return YES
    else if ( old_details === NEVER ) return NEVER
    else return PERHAPS    

main()
    test_table = setup_test_table();
    loop
        test_details = generate_random_test()
        status = has_test_been_run_before( test_details, test_table )
        case status of
           YES: do nothing;
           NEVER: run test (test_details);
           PERHAPS: if( rand()&1 ) run test (test_details);
    next loop
end.

类似的布隆过滤器用于误报

【讨论】:

  • 请阅读问题。布隆过滤器正是我不想要的。
  • HI Wrick,我修改了我的答案,如果这符合您的目的,请告诉我
猜你喜欢
  • 1970-01-01
  • 2018-08-15
  • 2016-02-03
  • 1970-01-01
  • 2015-09-28
  • 2018-04-22
  • 1970-01-01
  • 2017-01-25
相关资源
最近更新 更多