绽放过滤器GydF4y2Ba
绽放过滤器是一个GydF4y2Ba概率数据结构GydF4y2Ba这是基于GydF4y2Ba哈希GydF4y2Ba.它非常节省空间,通常用于添加元素到GydF4y2Ba放GydF4y2Ba并测试一个元素是否在集合中。但是,元素本身并没有添加到集合中。相反,将元素的散列添加到集合中。GydF4y2Ba
测试时,如果元素在盛开过滤器中,则可能是误报。它会说一个元素是GydF4y2Ba当然不GydF4y2Ba在集合中GydF4y2Ba这是可能的GydF4y2Ba该元素在集合中。GydF4y2Ba
绽放过滤器非常类似GydF4y2Ba哈希表GydF4y2Ba因为它将使用哈希函数将键映射到桶。但是,它不会将该键存储在bucket中,它只是将其标记为已填充。因此,许多键可能映射到同一个已填满的bucket,从而产生误报。GydF4y2Ba
特性GydF4y2Ba
空绽放过滤器是一个位数GydF4y2Ba 位,所有的初始值都为零。位数组是一种非常节省空间的数据结构,数组中的每个位置都设置为0或1。GydF4y2Ba
绽放过滤器还包括一组GydF4y2Ba 散列函数,我们哈希值。这些散列函数必须包含0的范围GydF4y2Ba .如果这些哈希函数在位数中的索引与索引匹配的传入值匹配,则盛开过滤器将确保阵列中该位置的位为1.查看此GIF显示字符串“Hello”和“hello”和“绽放“进入3位和2个哈希函数的绽放过滤器。GydF4y2Ba
在此示例中,第一个哈希函数和第二个哈希函数将散列为1。因此,绽放过滤器使索引1和3的位被翻转到1.然后,“盛开”散列到1和2.盛开的过滤器确保它们都是1(即使已经1已经存在一个1)。GydF4y2Ba
当查询发生在绽放过滤器中时,我们再次散列钥匙GydF4y2Ba 哈希函数。然后我们检查所有的输出位,以确保它们都是1。如果其中任何一个是0,我们就可以确定我们正在搜索的键不在列表中。如果它们都是1,我们知道它可能是。GydF4y2Ba
误报GydF4y2Ba
让我们想想gif中的bloom过滤器中的假阳性。假阳性是当我们查询bloom过滤器看某个单词是否在其中,它告诉我们它是,即使它不是。假设“House”也被哈希为两个索引1和3?如果我们把“Hello”和“Bloom”放入过滤器中,然后问“House”是否在过滤器中,会发生什么?GydF4y2Ba
绽放过滤器会告诉我们“House”GydF4y2Ba可能GydF4y2Ba在它。这是因为插入“House”时已激活的位已经翻转到1.绽放过滤器也可能会告诉我们百分比确定,但我们将在下一节中进入其中。GydF4y2Ba
误报分析GydF4y2Ba
在构建bloom过滤器时,我们有两种参数选择,GydF4y2Ba 和GydF4y2Ba .它们应该被选择来尽可能地抑制假阳性的数量,同时仍然保持过滤器需要的任何空间要求。GydF4y2Ba
如果我们有绽放过滤器GydF4y2Ba 比特和GydF4y2Ba 哈希函数中,某位在插入一次后仍为零的概率为GydF4y2Ba
然后GydF4y2Ba 插入后,它仍然为零的概率GydF4y2Ba 插入是GydF4y2Ba
所以,这意味着假阳性的概率是GydF4y2Ba
因为我们要找的是GydF4y2Ba 将不同的比特翻转到1.这大约等于GydF4y2Ba
在每个方程中的每一个中,提高k的值(散列函数的数量)将使误判性较小的概率不太可能。但是,它没有计算巨大的价值才能有巨大的价值。为了尽量减少这个方程式,我们必须选择最好的GydF4y2Ba .我们这样做是因为我们假设程序员已经选择了一个GydF4y2Ba 根据他们的空间限制,他们有一些想法他们的潜力GydF4y2Ba 将会。所以GydF4y2Ba 最小化等式的值GydF4y2Ba
时空复杂性GydF4y2Ba
bloom过滤器在时间和空间使用上都是非常有效的。这些特性是如此重要,以至于它放弃准确性来维护它们。GydF4y2Ba
时间GydF4y2Ba
如果我们使用bloom过滤器GydF4y2Ba 比特和GydF4y2Ba 哈希函数,插入和搜索都会采取GydF4y2Ba 时间。在这两种情况下,我们只需要通过所有散列函数运行输入。然后我们只需检查输出位。GydF4y2Ba
操作GydF4y2Ba | 复杂GydF4y2Ba |
插入GydF4y2Ba | |
搜索GydF4y2Ba |
请注意,这是少数几个数据结构之一,其时间复杂度根本完全取决于它中的元素数。这是因为元素从未真正进入结构,只有他们的哈希。GydF4y2Ba
空间GydF4y2Ba
为了真正了解绽放过滤器的空间复杂性,您必须先选择参数。你可以用绽放过滤器GydF4y2Ba 它就是aGydF4y2Ba哈希表GydF4y2Ba忽略了碰撞。但是,你会有一个很大的GydF4y2Ba 如果你想保持你的假阳性率低。实际数据结构的空间(包含数据)只是简单GydF4y2Ba .GydF4y2Ba
复杂GydF4y2Ba | |
空间GydF4y2Ba |
样本Python实现GydF4y2Ba
以下是Python实现。为简单起见,省略了位阵列组件;在这里,它只是一个初始化为所有零的数组。只有两个哈希函数是为了简洁起来的。此实施仅用于学术目的。GydF4y2Ba
1 2 3 4 5 6 7 8 9 10 11 12 32 32 32 32 32 32 32 32 32 32 32 32 32 37 37 37 32 37 37 32GydF4y2Ba |
|
测试Bloom过滤器GydF4y2Ba
让我们使用GydF4y2Ba以上GydF4y2Ba在开始插入元素后,宣传绘制过滤器的样子是如何看的。GydF4y2Ba
1 2 3 4GydF4y2Ba |
|
正如您所看到的,数组只需将0到1中的一个翻转,因为我们仅在此实例中使用一个哈希函数。GydF4y2Ba
1 2 3 4 5 6GydF4y2Ba |
|
在这里,字符串GydF4y2Ba“没门”GydF4y2Ba
不哈希到相同的索引GydF4y2Ba“你好”GydF4y2Ba
.但是,字符串GydF4y2Ba“通用电气”GydF4y2Ba
做。让我们尝试更多的哈希函数。GydF4y2Ba
1 2 3 4GydF4y2Ba |
|
现在我们有两个索引,因为我们使用了两个哈希函数。GydF4y2Ba
1 2 3 4GydF4y2Ba |
|
现在我们正在使用更多的哈希函数,我们有一个假正滴的概率。加上,我们不再识别GydF4y2Ba“通用电气”GydF4y2Ba
作为假阳性。GydF4y2Ba