布隆,牛逼!布谷鸟,牛逼! (中)

简介: 布隆,牛逼!布谷鸟,牛逼! (中)

但是在讲布谷鸟过滤器之前,得简单的铺垫一下 Cuckoo hashing,也就是布谷鸟 hash 的知识。

因为这个词是论文的关键词,在文中出现了 52 次之多。

image.png

Cuckoo hashing,最早出现在这篇 2001 年的论文之中:

https://www.cs.tau.ac.il/~shanir/advanced-seminar-data-structures-2009/bib/pagh01cuckoo.pdf

主要看论文的这个地方:

image.png

它的工作原理,总结起来是这样的:

它有两个 hash 表,记为 T1,T2。

两个 hash 函数,记为 h1,h2。

当一个不存在的元素插入的时候,会先根据 h1 计算出其在 T1 表的位置,如果该位置为空则可以放进去。

如果该位置不为空,则根据 h2 计算出其在 T2 表的位置,如果该位置为空则可以放进去。

如果该位置不为空,就把当前位置上的元素踢出去,然后把当前元素放进去就行了。

也可以随机踢出两个位置中的一个,总之会有一个元素被踢出去。

被踢出去的元素怎么办呢?

image.png

没事啊,它也有自己的另外一个位置。

论文中的伪代码是这样的:

image.png


看不懂没关系,我们画个示意图:

image.png

上面的图说的是这样的一个事儿:

我想要插入元素 x,经过两个 hash 函数计算后,它的两个位置分别为 T1 表的 2 号位置和 T2 表的 1 号位置。

两个位置都被占了,那就随机把 T1 表 2 号位置上的 y 踢出去吧。

而 y 的另一个位置被 z 元素占领了。

于是 y 毫不留情把 z 也踢了出去。

z 发现自己的备用位置还空着(虽然这个备用位置也是元素 v 的备用位置),赶紧就位。

所以,当 x 插入之后,图就变成了这样:

image.png


上面这个图其实来源就是论文里面:


image.png


这种类似于套娃的解决方式看是可行,但是总是有出现循环踢出导致放不进 x 的问题。

比如上图中的(b)。

当遇到这种情况时候,说明布谷鸟 hash 已经到了极限情况,应该进行扩容,或者 hash 函数的优化。

所以,你再次去看伪代码的时候,你会明白里面的 MaxLoop 的含义是什么了。

这个 MaxLoop 的含义就是为了避免相互踢出的这个过程执行次数太多,设置的一个阈值。

其实我理解,布谷鸟 hash 是一种解决 hash 冲突的骚操作。

如果你想上手玩一下,可以访问这个网站:

http://www.lkozma.net/cuckoo_hashing_visualization/


image.png

当踢来踢去了 16 (MaxLoop)次还没插入完成后,它会告诉你,需要 rehash 并对数组扩容了:

image.png

布谷鸟 hash 就是这么一回事。

接着,我们看布谷鸟过滤器。

目录
相关文章
|
算法 索引
|
5月前
|
搜索推荐
排序算法小结
排序算法小结
26 0
|
消息中间件 存储 缓存
品味布隆过滤器的设计之美 上
品味布隆过滤器的设计之美 上
品味布隆过滤器的设计之美   上
|
存储 消息中间件 缓存
品味布隆过滤器的设计之美
布隆过滤器是一个精巧而且经典的数据结构。 你可能没想到: RocketMQ、 Hbase 、Cassandra 、LevelDB 、RocksDB 这些知名项目中都有布隆过滤器的身影。 对于后端程序员来讲,学习和理解布隆过滤器有很大的必要性。来吧,我们一起品味布隆过滤器的设计之美。
品味布隆过滤器的设计之美
|
存储 缓存 NoSQL
品味布隆过滤器的设计之美 下
品味布隆过滤器的设计之美 下
|
存储 算法 搜索推荐
【21天算法学习】索引查找
【21天算法学习】索引查找
70 0
|
存储 NoSQL
Bloom Filter 的后继者?布谷鸟哈希与布谷鸟过滤器
Bloom Filter 的后继者?布谷鸟哈希与布谷鸟过滤器
288 0
Bloom Filter 的后继者?布谷鸟哈希与布谷鸟过滤器
|
存储 缓存 算法
拼夕夕二面:说说布隆过滤器与布谷鸟过滤器?应用场景?我懵了。。
拼夕夕二面:说说布隆过滤器与布谷鸟过滤器?应用场景?我懵了。。
409 0
拼夕夕二面:说说布隆过滤器与布谷鸟过滤器?应用场景?我懵了。。
|
存储 算法 索引
经典算法之索引查找
经典算法之索引查找
经典算法之索引查找
|
缓存 NoSQL 数据库
一文讲透“布隆过滤器”
布隆过滤器本质上就是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。
一文讲透“布隆过滤器”