【问题标题】:What is a d-Left Counting Bloom Filter?什么是 d-Left 计数布隆过滤器?
【发布时间】:2021-05-20 14:08:40
【问题描述】:

有人可以简单地解释一下 d-left 计数 Bloom 过滤器,特别是指纹和余数的使用吗?

有没有好的 Python 实现?

【问题讨论】:

    标签: python data-structures bloom-filter


    【解决方案1】:

    直观地说,d-left 计数布隆过滤器(或简称​​dlcBF)是一种变体在 Bloom filters 上,它旨在支持插入和删除。

    常规的 Bloom 过滤器可让您在创建过滤器后添加新项目。为此,只需使用每个散列函数对新项目 x 进行散列,转到有问题的位,并将它们设置为等于 1。但是,布隆过滤器自然不支持在已添加项目后删除。具体来说,您不能只将项目散列到的每个位都翻转为 0,因为其他项目可能散列到相同的位置。

    dlcBF 是一种(相对)节省空间的方式,可提供与 Bloom 过滤器相同的功能,但能够支持删除和添加。 dlcBF 使用的空间大约是经典 Bloom 过滤器的 1.5-2 倍。

    自 2006 年发明 dlcBF 以来,模仿具有动态插入和删除功能的 Bloom 过滤器的新数据结构也被发明了出来。 cuckoo filter 于 2014 年首次描述,支持相同的操作集,但内存开销显着降低,假设错误率相当低。如果您只是对执行插入和删除操作的 Bloom 过滤器替换感兴趣,我建议您选择 cuckoo 过滤器,它有很多很好的实现。

    至于 dlcBF 的工作原理,有两个基本原则支配着它的运作。第一个想法是桶和槽。 dlcBF 通过维护一个 b buckets 数组来工作。桶被分成 d 组(大约)b/d 桶。每个桶又被细分为 s 个,其中每个槽由一个两位计数器和用于存储少量位的空间组成。

    存储在每个桶的槽中的值是使用称为指纹的技术导出的。存储在 dlcBF 中的每个项目都被散列为一个数字,我们将其称为 指纹。密钥源依次用于导出 d 个桶的位置以及每个桶的称为 remainder 的小比特序列。要查看 dlcBF 中是否存在项目,您需要计算其关键源,然后派生 d 对桶和余数。接下来,检查每个指示的存储桶以查看特定的剩余部分是否存储在存储桶中的一个插槽中。如果不是,则该项目不存在。如果是这样,则该项目要么存在,要么我们有误报(如在常规 Bloom 过滤器中)。

    添加项目时会出现 d-left 计数位。要添加一个项目,计算其关键源,然后获取 d 个桶/剩余组合。找到这些桶中余数最少的那个,打破左侧的联系(例如,较低的桶索引),然后如果余数不在该桶的任何插槽中,则添加余数,或者如果余数存在,则增加关联的计数器。要删除一个项目,只需像往常一样搜索它,如果找到与您的项目匹配的存储桶/剩余序列,则减少其计数器。

    对 dlcBF 的分析归结为表明 (1) 这种将项目放置在具有少量项目的桶中的策略,在左侧打破平局,倾向于将项目分散到接近均匀的位置,然后 (2) 计算出关于你需要多少个桶,你的指纹应该有多长,每个项目需要多少位。直观地说,使指纹更大会降低存储在表中的项目与未存储在表中的项目之间的哈希冲突的可能性,但会增加所需的空间量。减小指纹大小会减小表的大小,但也会增加误报率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 2011-09-01
      • 2023-04-09
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 2019-04-27
      相关资源
      最近更新 更多