当前位置:  开发笔记 > 程序员 > 正文

布隆过滤器对面?

如何解决《布隆过滤器对面?》经验,为你挑选了3个好方法。

我正在尝试优化一个基本上运行数百万次测试的软件.这些测试的生成方式可能会有一些重复.当然,如果我能有效地避免它,我不想花时间运行我已经运行的测试.

所以,我正在考虑使用Bloom过滤器来存储已经运行的测试.但是,Bloom过滤器对我来说不安全.它给出了误报.也就是说,它可能会报告我已经进行了一项我没有进行的测试.虽然这在我正在研究的场景中是可以接受的,但我想知道是否有相当于Bloom过滤器,但在相反方面犯了错误,即只给出假阴性.

我没有运气就浏览了文献.



1> David Cary..:

是的,有损哈希表或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.



2> awdz9nld..:

完成此任务的确切数据结构是直接映射缓存,通常用于CPU.

function set_member(set, item)
    set[hash(item) % set.length] = item

function is_member(set, item)
    return set[hash(item) % set.length] == item


也是数百万的订单,你可以使用一个简单的位数组.:)

3> Tobiesque..:

是否可以存储您运行的测试?这应该反转过滤器的行为.

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有