布谷鸟过滤器gydF4y2Ba
的gydF4y2Ba布谷鸟过滤器gydF4y2Ba是一个gydF4y2Ba概率数据结构gydF4y2Ba支持快速gydF4y2Ba集gydF4y2Ba会员测试。它和a非常相似gydF4y2Ba布隆过滤器gydF4y2Ba因为它们都非常快,空间效率高。bloom过滤器和cuckoo过滤器也报告集成员的假阳性。gydF4y2Ba
布谷鸟滤波器是一种新的数据结构,由范、安德森、卡明斯基和米岑马赫在2014年的一篇论文中描述gydF4y2Ba[1]gydF4y2Ba.布谷鸟滤波器改进了bloom滤波器的设计,提供了删除、有限计数和有限假阳性概率,同时仍然保持了类似的空间复杂度。他们使用gydF4y2Ba布谷鸟哈希gydF4y2Ba解决碰撞和本质上是一个紧凑gydF4y2Ba布谷鸟哈希表gydF4y2Ba.gydF4y2Ba
布谷鸟和布鲁姆过滤器都是有用的集合成员测试时,原始数据的大小很大。它们每个条目都只使用7位。当通过集合成员测试可以在执行之前避免昂贵的操作时,它们也很有用。例如,在查询agydF4y2Ba数据库gydF4y2Ba,可以进行集合隶属度测试,以确定所需对象是否甚至在数据库中。gydF4y2Ba
内容gydF4y2Ba
概述gydF4y2Ba
布谷鸟过滤器是最小化的gydF4y2Ba哈希表gydF4y2Ba使用gydF4y2Ba布谷鸟哈希gydF4y2Ba解决冲突。它通过只保留一个gydF4y2Ba指纹gydF4y2Ba要存储在集合中的值的。就像gydF4y2Ba布隆过滤器gydF4y2Ba使用单个位存储数据和gydF4y2Ba计算布隆过滤器gydF4y2Ba使用小整数,布谷鸟过滤器使用小整数gydF4y2Ba -bit的指纹来表示数据。的价值gydF4y2Ba 取决于程序员想要的理想假阳性概率。gydF4y2Ba
的gydF4y2Ba假阳性的概率gydF4y2Ba是非常重要的花过滤器和杜鹃过滤器。这是gydF4y2Ba分析gydF4y2Ba用于bloom过滤器。这些过滤器总是会返回一个假阳性gydF4y2Ba概率gydF4y2Ba.布谷鸟过滤器是由一些gydF4y2Ba期望假阳性概率gydF4y2Ba.这个期望的概率用于在过滤器中选择其他变量。gydF4y2Ba
布谷鸟过滤器有一个gydF4y2Ba数组gydF4y2Ba的gydF4y2Ba桶gydF4y2Ba.一个桶所能容纳的指纹数量被称为gydF4y2Ba .他们也有gydF4y2Ba负载gydF4y2Ba它描述了他们当前使用的过滤器的百分比。所以,一个负载为75%的布谷鸟过滤器有75%的桶被填满。在分析布谷鸟滤波器并决定是否以及何时需要调整其大小时,此负载非常重要。gydF4y2Ba
下面的动图展示了布谷鸟过滤器如何插入一些元素。的gydF4y2Ba 指纹的值为7,而gydF4y2Ba 是2。这个动图展示了如何插入一个元素三次将导致布谷鸟过滤器使用二级桶。还要注意假阳性概率(FPP)是如何随着每次插入而增加的。gydF4y2Ba
布谷鸟过滤器使用的最后一个优化是它们使用gydF4y2Basemi-sortgydF4y2Ba.半排序是一种节省空间的技术,它利用了指纹在给定bucket中的顺序无关紧要这一事实。他们可以先对桶里的指纹进行分类,然后存储与结果相关的另一个指纹,从而压缩桶。这种技术为每个指纹节省了1位,这也是布谷鸟过滤器的每条目比特等式背后的原因gydF4y2Ba下面gydF4y2Ba.gydF4y2Ba
布谷鸟哈希gydF4y2Ba
布谷鸟哈希是一种gydF4y2Ba冲突处理gydF4y2Ba在哈希数据结构中。冲突处理是当一个键被散列到一个已经有值的bucket时发生的情况。哈希表处理这些冲突的方法是表的一个属性,布谷鸟哈希表使用布谷鸟哈希。gydF4y2Ba
杜鹃杂谈得名于杜鹃鸟。布谷鸟以在其他鸟类的巢里产卵而闻名。当这些杜鹃幼鸟孵化时,它们试图把其他的蛋或鸟推出巢外。这就是布谷鸟哈希的基本原理。gydF4y2Ba
在布谷鸟哈希中,每个键由两个不同的哈希函数进行哈希,因此可以将值分配给两个桶中的一个。第一个桶首先被尝试。如果这里什么都没有,那么这个值就放在bucket 1中。如果有东西存在,就尝试第2个桶。如果桶2为空,则将值放在那里。如果桶2被占用,那么桶2的占用者将被驱逐,并将值放在那里。gydF4y2Ba
现在,有一个未分配的单独(键,值)对。但是,有两个哈希函数。对于新密钥,同样的过程也会开始。如果两个可能的桶之间有一个空位,那么它就会被占用。但是,如果两个桶都被取走,那么其中一个值将被踢出,该过程将再次重复。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实际上,他们使用的是发明者称之为“部分键布谷鸟哈希”的一种衍生工具。在一个普通的布谷鸟哈希表中,如果一个东西被哈希到它的第一个可能的桶中,而那个桶是空的,它将被另一个哈希函数哈希并移动到第二个桶中。然而,在布谷鸟过滤器中,只有gydF4y2Ba -位指纹被存储。所以,如果一个指纹需要被剔除,它的备用桶需要能够被找到。部分键布谷鸟哈希的工作原理如下:gydF4y2Ba
- 插入键gydF4y2Ba .gydF4y2Ba
- 计算哈希值gydF4y2Ba ,gydF4y2Ba 使用第一个哈希函数。gydF4y2Ba
- 如果第一个桶是空的,放置gydF4y2Ba 在桶里。gydF4y2Ba
- 如果第一个桶不是空的,计算哈希值gydF4y2Ba ,gydF4y2Ba 使用第二个哈希函数。gydF4y2Ba
- XORgydF4y2Ba 与gydF4y2Ba 来得到第二个桶的值gydF4y2Ba .gydF4y2Ba
- 看看第二个桶来完成布谷鸟哈希。gydF4y2Ba
这个过程的优点是给定一个指纹和一个桶,很容易计算出另一个桶的位置。这使得布谷鸟滤镜的存储量非常小gydF4y2Ba -位指纹,节省空间。然而,这个过程的缺点是,如果指纹是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%。由这些过滤器的实现者来决定何时调整绽放过滤器的大小,以减少假阳性的概率。gydF4y2Ba
空间复杂度gydF4y2Ba
计数开花过滤器的空间复杂度比布谷鸟过滤器和开花过滤器都要差,因为每个桶的空间需要乘以计数器。至于布谷鸟和开花过滤器,它们在不同的假阳性概率下表现不同。当滤波器的假阳性概率小于等于3%时,布谷鸟滤波器每条输入的比特数更少。当它较高时,每个输入的绽放滤波器有更少的比特。gydF4y2Ba
过滤器gydF4y2Ba | 位/条目gydF4y2Ba |
杜鹃gydF4y2Ba | |
布鲁姆gydF4y2Ba |
能力gydF4y2Ba
布谷鸟过滤器和开花过滤器在处理增加的负载方面是不同的。当布谷鸟滤波器增加负载时,插入更有可能失败,因此它的时间复杂度呈指数增长。然而,假阳性率保持不变。Bloom过滤器可以以不断上升的假阳性率为代价不断地向过滤器插入项目。gydF4y2Ba
理论上绽放滤波器的容量是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个循环,插入就会成功。如果没有循环,那么移位的元素链将最终停止。然而,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布谷鸟过滤器:实际上比布鲁姆更好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