可伸缩的布隆过滤器如何工作?


15

我正在阅读可伸缩的bloom过滤器,但无法理解每次组成的bloom过滤器是如何填充的,都添加了一个更大尺寸的新bloom过滤器。

不能查找最初创建的过滤器中有助于设置位的元素。我可能对此理解不正确?

我确实了解基本的布隆过滤器。但是,我无法绕过动态Bloom过滤器。

Answers:


7

让我尝试一下,看看我能屠宰多少。:-)

因此,首先,您需要能够创建一个常规的Bloom过滤器,该过滤器允许有限数量的元素以最大的假阳性概率出现。在尝试构建可扩展的实现之前,需要将这些功能添加到基本过滤器中。

在我们尝试控制和优化概率是多少之前,让我们先确定给定布隆过滤器大小的概率。

首先,我们将位域划分为具有多少个哈希函数(总位数/哈希函数数=切片),以获得代表每个哈希函数的k个比特切片,因此每个元素始终由k位描述。

如果增加切片数或每个切片的位数,则误报的可能性将降低。

还可以得出结论,随着元素的添加,更多的位被设置为1,因此误报增加。我们将其称为每个切片的“填充率”。

当过滤器包含大量数据时,我们可以假设此过滤器误报的概率是填充率提高到切片数(如果我们实际上是在对比特进行计数而不是使用比率,则可以简化为重复问题的排列)。

那么,我们如何找出在布隆过滤器中如何选择误报的概率呢?我们可以修改切片的数量(这会影响填充率)。

为了弄清楚我们应该有多少个切片,我们首先确定一个切片的最佳填充率。由于填充率由切片中的位数为1相对于位数为0决定,因此我们可以确定每个位将保持未置位的概率为(100%-(1 /切片中的位数) )。由于我们将要插入多个项目,因此我们将对信誉问题进行另一个置换,然后将其扩展到预期的填充率,即(100%-((100%-(1 /切片中的位/)))^ “已插入元素”))。好吧,事实证明这与另一个方程非常相似。在本文中,他们将填充率与另一个方程式相关联,因此非常适合泰勒级数(1-e ^(-n / m))。经过一番苦恼之后,事实证明最佳​​填充率始终约为50%,

因此,由于过滤器的概率是填充率提高到切片数,因此我们可以填充50%并获得P =(50%)^ k或k = log_2(1 / P)。然后,我们可以使用此函数来计算应为可伸缩Bloom过滤器列表中的给定过滤器生成的切片数量。

    def slices_count(false_positive_probability):
        return math.ceil(math.log(1 / false_positive_probability, 2))

编辑:写完这篇文章后,当我在TAoCP第1卷,第442-445页中阅读基于伙伴系统的动态内存分配时,遇到了一个“百分之五十规则”,用更清晰的推理与将曲线拟合为(1 -e ^(-n / m))。克努斯(Knuth)还引用了一篇论文“重新审视了百分之五十的规则”,其中对这一概念有一些背景知识(可从pdf下载)。


该论文中没有讨论Bloom过滤器,因此在这里看不到这种“百分之五十规则”的正当理由。先验的是,我希望“百分之五十规则”只是一些反复无常的人,因为真正的答案涉及很多超出其特定模块设计标准的考虑因素。
杰夫·伯杰斯

1
嘿@JeffBurdges,您是否至少对这两个概念如此相似感到好奇?
乔恩·布林赫斯特

4

如果任何过滤器返回true,则该项目在可伸缩Bloom过滤器中。因此,您可以添加过滤器而不会影响以前项目的成员资格查询。

为确保您仍具有最坏情况的误报保证,将添加新过滤器,误报率会以几何方式降低。例如,第一个过滤器具有误报率p,第二个rp,第三个过滤器r^2p等等。在可伸缩Bloom过滤器上出现误报的概率然后由并界限制:sum_{k>=0} r^k p = p/(1-r)


3
这些公式中的“ r”代表什么?
zslayton 2014年

1

我正在阅读可伸缩的bloom过滤器,但无法理解每次组成的bloom过滤器是如何填充的,都添加了一个更大尺寸的新bloom过滤器。

无法查找最初创建的过滤器中有助于设置位的元素。我可能对此理解不正确?

嗨,
基本思想是添加到第一个滤波器,直到第一级滤波器的位字段达到饱和为止。被饱和并不能意味着每一位被使用,但它意味着过滤器包含了许多条目附加条目会造成太多的误报。

从饱和的角度来看,任何新项目都不会添加到饱和过滤器中,而是会添加到新的更大的子过滤器(第二级过滤器)中。

为了找到一个值,您可以在第一级过滤器中查找它,如果找不到它,则可以在第二级过滤器中查找它。如果您可以在任何这些过滤器中找到它,则它(很有可能)对过滤器是“已知的”(由于布隆过滤器的性质,可能会出现误报)。如果您在任何过滤器中都找不到该值,则可以保证该过滤器没有看到它。当然,这可以表示为递归数据结构。

您可能想阅读我的博客文章,其中包含Java中可伸缩的Bloom过滤器实现以及其详细工作原理的解释。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.