布谷鸟过滤器gydF4y2Ba
的gydF4y2Ba布谷鸟过滤器gydF4y2Ba是一个gydF4y2Ba概率数据结构gydF4y2Ba支持快速gydF4y2Ba集gydF4y2Ba会员测试。它和a很相似gydF4y2Ba布隆过滤器gydF4y2Ba因为它们都非常快,而且节省空间。bloom过滤器和布谷鸟过滤器也报告集合成员的假阳性。gydF4y2Ba
杜鹃滤波器是一种新的数据结构,由Fan、Andersen、Kaminsky和Mitzenmacher在2014年的一篇论文中描述gydF4y2Ba[1]gydF4y2Ba.布谷鸟滤波器改进了bloom滤波器的设计,提供了删除、有限计数和有限的假阳性概率,同时仍然保持了类似的空间复杂性。他们使用gydF4y2Ba布谷鸟哈希gydF4y2Ba解决碰撞,本质上是一个紧凑gydF4y2Ba布谷鸟哈希表gydF4y2Ba.gydF4y2Ba
当原始数据的大小较大时,布谷鸟和布隆滤波器都适用于集隶属度测试。它们每个条目只使用7位。当一个昂贵的操作可以通过集成员测试在执行之前避免时,它们也很有用。例如,在查询agydF4y2Ba数据库gydF4y2Ba,可以进行集合隶属度测试,以查看所需对象是否在数据库中。gydF4y2Ba
内容gydF4y2Ba
概述gydF4y2Ba
布谷鸟滤镜是最小化的gydF4y2Ba哈希表gydF4y2Ba使用gydF4y2Ba布谷鸟哈希gydF4y2Ba解决碰撞。它通过只保留a来最小化空间复杂度gydF4y2Ba指纹gydF4y2Ba要存储在集合中的值的。就像gydF4y2Ba布隆过滤器gydF4y2Ba使用单个位存储数据和gydF4y2Ba计数布隆滤波器gydF4y2Ba使用小整数,布谷鸟过滤器使用小gydF4y2Ba -bit指纹表示数据。的价值gydF4y2Ba 由程序员想要的理想假阳性概率决定。gydF4y2Ba
的gydF4y2Ba假阳性概率gydF4y2Ba是非常重要的bloom滤波器和杜鹃滤波器。这是gydF4y2Ba分析gydF4y2Ba对于布隆滤镜。这些过滤器总是会返回一些假阳性gydF4y2Ba概率gydF4y2Ba.布谷鸟滤波器是由一些gydF4y2Ba期望假阳性概率gydF4y2Ba.这个期望的概率用于选择过滤器中的其他变量。gydF4y2Ba
布谷鸟过滤器有一个gydF4y2Ba数组gydF4y2Ba的gydF4y2Ba桶gydF4y2Ba.一个桶可以容纳的指纹数量被称为gydF4y2Ba .他们也有一个gydF4y2Ba负载gydF4y2Ba它描述了他们目前使用的过滤器的百分比。因此,一个负载为75%的布谷鸟过滤器有75%的桶被填满。在分析布谷鸟过滤器并决定是否以及何时需要调整大小时,此负载非常重要。gydF4y2Ba
下面的动图展示了布谷鸟过滤器如何插入一些元素。的gydF4y2Ba 指纹的值为7gydF4y2Ba 是2。这个动图显示了如何插入一个元素三次会导致布谷鸟过滤器使用次要桶。还要注意假阳性概率(FPP)是如何随着每次插入而增加的。gydF4y2Ba
杜鹃过滤器使用的最后一个优化是它们使用gydF4y2Basemi-sortgydF4y2Ba.半排序是一种节省空间的技术,它利用了指纹在给定桶中的顺序无关紧要的事实。他们可以压缩存储桶,首先对其中的指纹进行排序,然后存储该结果的另一个指纹。这种技术为每个指纹节省了1比特,这也是布谷鸟滤波器每输入比特等式背后的原因gydF4y2Ba下面gydF4y2Ba.gydF4y2Ba
布谷鸟哈希gydF4y2Ba
杜鹃哈希是一种gydF4y2Ba冲突处理gydF4y2Ba在基于hash的数据结构中。碰撞处理是当一个键被散列到一个已经有值的bucket时发生的事情。哈希表处理这些碰撞的方法是表的一个属性,布谷鸟哈希表使用布谷鸟哈希。gydF4y2Ba
杜鹃杂音得名于杜鹃鸟。布谷鸟以在其他鸟类的巢中产卵而闻名。当这些布谷鸟宝宝孵化时,它们试图把其他蛋或鸟推出巢外。这是杜鹃哈希的基本原理。gydF4y2Ba
在布谷鸟哈希中,每个键都由两个不同的哈希函数哈希,因此可以将值分配给两个bucket中的一个。第一个桶首先被尝试。如果这里什么都没有,那么这个值就被放在桶1中。如果有,则尝试桶2。如果桶2为空,则将值放在那里。如果桶2已被占用,则驱逐桶2的占用者,并将该值放在桶2中。gydF4y2Ba
现在,有一个单独的(键,值)对未分配。但是,这里有两个哈希函数。对于新密钥,同样的过程开始。如果两个可能的桶之间有一个空位,那么它就被拿走了。但是,如果两个bucket都被取走,则其中一个值将被踢出,该过程将再次重复。gydF4y2Ba
在删除和移动键的过程中可能会遇到无限循环。正因为如此,跟踪你访问的每个桶是很重要的。如果同一个桶被访问两次,就形成一个循环。修复它的唯一方法是重建哈希表,使其更大或改变哈希函数。gydF4y2Ba
下图显示了一个空的布谷鸟过滤器。有6个桶和2个哈希函数。哈希函数如图所示。下面5个数字被插入到哈希表中。gydF4y2Ba
[3,7,14,15,19]gydF4y2Ba
作为参考,以下是布谷鸟过滤器的工作原理:gydF4y2Ba
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17gydF4y2Ba |
|
用数字列表的形式填写你的答案。如果布谷鸟表中对应的桶为空,则将列表槽保留为空。gydF4y2Ba
部分键布谷鸟哈希gydF4y2Ba
虽然布谷鸟过滤器是基于gydF4y2Ba布谷鸟哈希gydF4y2Ba在美国,他们实际上使用了一种发明者称之为部分关键杜鹃哈希(partial-key cuckoo hash)的衍生物。在一个普通的布谷鸟哈希表中,如果某个东西被哈希到它的第一个可能的桶,而那个桶是空的,它就会被另一个哈希函数哈希并移动到第二个桶。不过,在布谷鸟滤镜中,只有gydF4y2Ba -bit指纹被存储。所以,如果一个指纹需要被剔除,它的备用桶需要能够被找到。部分键布谷鸟哈希是这样工作的:gydF4y2Ba
- 插入键gydF4y2Ba .gydF4y2Ba
- 计算的哈希gydF4y2Ba ,gydF4y2Ba 使用第一个哈希函数。gydF4y2Ba
- 如果第一个桶是空的,放置gydF4y2Ba 在那个桶里。gydF4y2Ba
- 如果第一个桶不空,计算的哈希值gydF4y2Ba ,gydF4y2Ba 使用第二个哈希函数。gydF4y2Ba
- XORgydF4y2Ba 与gydF4y2Ba 来得到第二个桶的值gydF4y2Ba .gydF4y2Ba
- 看第二桶完成布谷鸟哈希。gydF4y2Ba
这个过程的好处是给出了一个指纹和一个桶,很容易计算出另一个桶的位置。这使得布谷鸟过滤器的存储量很小gydF4y2Ba -bit指纹,节省空间。然而,这个过程的缺点是,如果指纹是gydF4y2Ba 比特,第二个桶被选择gydF4y2Ba 的可能性。它不像哈希表中那样是随机的。gydF4y2Ba
这实际上是关于布谷鸟滤波器的一个很大的争论点。理论上,布谷鸟滤波器由于其非随机哈希函数而无法工作。指纹越小,gydF4y2Ba ,每个键对应一对桶的选择就越少,碰撞的几率就越高。指纹大小的下界变为gydF4y2Ba .注意,我们使用gydF4y2Ba 这里表示下界。gydF4y2Ba
奇怪的是,尽管布谷鸟过滤器在理论上很糟糕,但在实践中却很管用。事实上,上面的指纹大小的下界排除了一些常数因素。事实上,它是gydF4y2Ba ,在那里gydF4y2Ba 是布谷鸟过滤器中一个桶可以容纳的键数。即使gydF4y2Ba 等于4,这个范围很广gydF4y2Ba ,指纹可以是一个合理的大小。gydF4y2Ba
对布谷鸟滤波器进行了实证分析。各种数值gydF4y2Ba ,gydF4y2Ba ,gydF4y2Ba 我们进行了测试,看看它们会如何影响布谷鸟过滤器的负载。当gydF4y2Ba ,布谷鸟滤波器达到95%负荷。gydF4y2Ba ,是布谷鸟滤波器的最佳属性。一旦指纹有7位长,布谷鸟过滤器的负载因子与使用两个完全随机哈希函数的布谷鸟哈希表的负载因子相同。gydF4y2Ba
对部分关键布谷鸟哈希的深入分析是一个悬而未决的问题。进一步的评估可能会在未来为数据结构提供更多的理论可信度。gydF4y2Ba
时间复杂度gydF4y2Ba
杜鹃滤波器的时间复杂度源于杜鹃哈希的时间复杂度。gydF4y2Ba
操作gydF4y2Ba | 时间复杂度gydF4y2Ba |
查找gydF4y2Ba | |
删除gydF4y2Ba | |
插入gydF4y2Ba | **gydF4y2Ba |
**gydF4y2Ba摊销gydF4y2Ba这是预期的,如果负载管理得当,概率相当高。gydF4y2Ba
查找和删除gydF4y2Ba
查找和删除是gydF4y2Ba 布谷鸟哈希中的操作,布谷鸟过滤器也是如此。最多可以检查两个位置(或者使用多少个哈希函数)。如果找到,可以在中执行适当的操作gydF4y2Ba 还有时间,这两个都是常数时间运算。gydF4y2Ba
插入gydF4y2Ba
证明插入的复杂性很棘手,而且耗时较长,因此包含了它gydF4y2Ba下面gydF4y2Ba.gydF4y2Ba
布谷鸟vs布鲁姆过滤器gydF4y2Ba
布谷鸟滤波器改进了布隆滤波器的设计gydF4y2Ba删除gydF4y2Ba从片场。gydF4y2Ba计数布鲁姆滤波器gydF4y2Ba已经被提议作为一种修改布鲁姆过滤器允许删除的方法。然而,计数布隆滤波器也有其自身的缺点。gydF4y2Ba
有四种方法来比较布谷鸟滤波器、开花滤波器和计数开花滤波器:它们操作的时间复杂度、假阳性概率、空间复杂度和容量。gydF4y2Ba
时间复杂度gydF4y2Ba
布谷鸟过滤器通常比开花过滤器和计数开花过滤器关于插入慢。虽然布谷鸟过滤器有一个gydF4y2Ba 平摊插入时间后,布隆滤波器和计数布隆滤波器的时间插入复杂度为gydF4y2Ba .它仅仅基于哈希函数的数量,gydF4y2Ba .此外,布谷鸟滤波器的插入时间随着负载的增加而增加,并且必要调整滤波器大小的可能性也增加。gydF4y2Ba
在布谷鸟过滤器中查找比在开花过滤器或计数开花过滤器中查找更快。布谷鸟过滤器只有两个位置可以检查,所以这个操作是gydF4y2Ba .开花过滤器和计数开花过滤器要求gydF4y2Ba 这样做根据同样的逻辑,在布谷鸟过滤器中删除比在计数开花过滤器中更快。gydF4y2Ba
假阳性概率gydF4y2Ba
随着布谷鸟滤波器负载的增加,布谷鸟滤波器的假阳性概率将趋向于期望的假阳性概率。另一方面,开花滤波器或计数开花滤波器的假阳性概率将随着负载的增加而趋于100%。由这些过滤器的实现者决定何时调整bloom过滤器的大小以减少误报概率。gydF4y2Ba
空间复杂度gydF4y2Ba
计数开花过滤器的空间复杂度比布谷鸟过滤器和开花过滤器都要差,因为每个桶的空间需要乘以计数器。关于布谷鸟和开花过滤器,它们在不同的假阳性概率下表现不同。当滤波器的假阳性概率小于或等于3%时,布谷鸟滤波器每个条目的比特数更少。当它较高时,bloom过滤器每个条目有更少的比特。gydF4y2Ba
过滤器gydF4y2Ba | 每条目位gydF4y2Ba |
杜鹃gydF4y2Ba | |
布鲁姆gydF4y2Ba |
能力gydF4y2Ba
布谷鸟过滤器和开花过滤器在处理增加负荷方面是不同的。随着布谷鸟过滤器负载的增加,插入更有可能失败,因此它的时间复杂度呈指数级增长。然而,假阳性率保持不变。Bloom过滤器可以不断地在过滤器中插入项目,代价是假阳性率不断上升。gydF4y2Ba
bloom滤波器的容量理论上是100%,但它有一个可怕的假阳性概率。布谷鸟滤波器在每个条目的比特数在7左右,负载在95.5%左右时可以保持稳定的误报率。gydF4y2Ba
验证插入时间gydF4y2Ba
在布谷鸟哈希中,插入一个元素似乎比gydF4y2Ba 在最坏的情况下,因为可能有许多需要删除值的实例,以便为当前值腾出空间。另外,如果存在循环,那么整个表必须重新散列。gydF4y2Ba
注意:这个证明是假设在布谷鸟哈希表中使用了两个哈希函数,尽管它可以推广到更多。布谷鸟滤波器的理论分析仍然不发达,所以这个证明的部分可能掩盖了一些领域。gydF4y2Ba
为了证明这种复杂性,将布谷鸟哈希表看作一个gydF4y2Ba图gydF4y2Ba.的gydF4y2Ba布谷鸟图gydF4y2Ba是通过将第一个哈希表的结构复制到第二个哈希表而得到的。这两个表中的每个桶都成为布谷鸟图中的一个节点。然后,对于原始哈希表中的每个键,从表1中的桶绘制一条边,其中第一个哈希函数对表2中的桶进行哈希,其中第二个哈希函数对该键进行哈希。布谷鸟图的制作过程是这样的。gydF4y2Ba
权利要求1:gydF4y2Ba第一个想法是,gydF4y2Ba两偶图gydF4y2Ba那是插入遗嘱吗gydF4y2Ba失败gydF4y2Ba如果图中有两个以上的循环。如果有gydF4y2Ba 图中的节点(桶),那么就需要gydF4y2Ba 边(键),以便使两个循环。gydF4y2Ba ,因此有太多的元素无法放入桶中,插入将失败。gydF4y2Ba
要求2:gydF4y2Ba从这个图中得到的第二个想法是,如果图中有0或1个循环,插入就会成功。如果没有循环,那么位移的元素链最终会停止。然而,一个循环,链仍然可以停下来。一旦移位的元素链经过了整个第一个循环,二部图剩下的就是树(没有循环的图)。所以,第一个图中的节点要么停下来,要么踢出某个元素,最终在剩下的图的其他地方稳定下来。gydF4y2Ba
要求3:gydF4y2Ba在这个图中重要的最后一个想法是,一个元素被插入到图的连接区域gydF4y2Ba 节点(桶),那么它将置换最多gydF4y2Ba 待插入的节点。这个想法来自于二部图的逻辑,其中有两倍多的节点gydF4y2Ba 作为创建它们的桶gydF4y2Ba .gydF4y2Ba
既然证明了当且仅当布谷鸟图中有两个或两个以上的循环时插入失败,那么就需要有两个或两个以上循环的概率。当边数gydF4y2Ba 是否比节点数少很多gydF4y2Ba 在二部图中,给定一条路径长度的概率gydF4y2Ba 这是一个循环gydF4y2Ba
这是因为,对于循环,某条边占据第一个位置的概率是gydF4y2Ba .第二条边占据第二条位置的概率是gydF4y2Ba 等等。的数量gydF4y2Ba 长度周期也是最大的gydF4y2Ba .所以,总的来说,最多gydF4y2Ba 长度周期gydF4y2Ba .gydF4y2Ba
如果插入成功,这是因为它找到了长度路径gydF4y2Ba 这不是一个循环。它的概率小于或等于gydF4y2Ba .这是一个常数时间gydF4y2Ba 对数时间的概率很高。gydF4y2Ba
插入不成功的概率是连接分量大小的概率gydF4y2Ba 有两个或两个以上的周期。这是,已知我们插入的这条边的两端,gydF4y2Ba
当gydF4y2Ba .gydF4y2Ba
这可以用更有力的证明来证明,但它们既复杂又笨拙。现在,除了调整哈希表的大小之外,所有的事情都被证明是gydF4y2Ba .当表大小被调整时gydF4y2Ba 必须做功。然而,已经有了gydF4y2Ba 插入。这使得调整表大小的平摊代价gydF4y2Ba .gydF4y2Ba
之间的关系gydF4y2Ba 而且gydF4y2Ba 当gydF4y2Ba 对于一些小的gydF4y2Ba .当这种关系成立时,图中存在具有两个或两个以上循环的连通分量的概率为gydF4y2Ba .当这种情况发生时,布谷鸟表的负载因子为gydF4y2Ba .这意味着大约有一半的桌子是满的。当超过此容量时,需要更频繁地调整大小。类似的证明可以用来表明,当使用3个哈希函数时,表的91%是可用的。gydF4y2Ba
参考文献gydF4y2Ba
- 风扇。gydF4y2Ba布谷鸟滤镜:实际上比Bloom更好gydF4y2Ba.检索2016年8月22日,从gydF4y2Bahttps://www.cs.cmu.edu/~dga/papers/cuckoo-conext2014.pdfgydF4y2Ba
- Pagh, R。gydF4y2Ba维基百科杜鹃哈希gydF4y2Ba.检索自2016年8月1日gydF4y2Bahttps://en.wikipedia.org/wiki/Cuckoo_hashinggydF4y2Ba