MapEmbed Hashing

pdf, github

基于 map-and-redue 和分治,动态近似完美哈希(\(90\% \sim 95\%\))。(\(\text{Load Factor}\):一直插入直到八次插入失败,插入成功的 KV / 在 Bukkit 里的 KV)。

image-20230920132530013

THE MAPEMBED HASH TABLE

\(S\) 个 Cell 在快数组里,每个 Cell 给他有 \(D\) 个 Bukkit,每个 Bukkit 对应多个 Cell。第 \(i\) 个 Cell 有一个 \(C_j\) 表示循环移位。

一个值 K (key) V (values) pairs: 先经过 \(\mathcal{H_c}\) (第一个哈希映射到其中一个 Cell) 映射到第 \(j\) 个里,然后通过 \(\mathcal{H_D}\)(第二个哈希)和循环移位综合得到去 D 的哪一个。如果插入失败就 \(C_j ++\)。然后把这 \(j\) 对应的 D 个 Buckets 属于这个 cell 的全抽出来重插入。

image-20230920181846808

Dynamic Expansion

动态扩张:有多少开多少。目前有 \(m\) 个 Bukkit。

\(h_{b}^{(i)}(j)\) 是第 \(j\) 个 Cell 的第 \(i\) 个对应的 Bucket 下标是啥。它 $ = h^i (j) \mod m$ (第三种哈希,映射到任意一个整数)

然后我们扩张就是 \(m\) 变成 \(2m\) 倍增的来,然后里面所有信息也复制一遍(整体复制比一个一个插入快多了?),这样能保证原来 \(\mod m\) 现在 \(\mod 2m\) 也能锁定到,但是会有冗余的东西,就惰性删除,检查一个 Bucket 的时候顺便把冗余的那些删了就行。

Optimization using Multi-Layer Index

原来 Cell 是一层,现在尝试变成很多层,每层的 Cell 数逐层递减。如果那一层的那个满了,就把这个 Cell 里的东西全 remake 重新在下一层插入尝试,然后这个 Cell 就废掉了再也不要了。(感觉很笨啊【?你这个信息就废掉了,还去了更小的地方)

image-20230920193156756

posted @ 2023-09-20 19:36  DMoRanSky  阅读(188)  评论(2编辑  收藏  举报