Cuckoo Hashing的变体:多哈希表多槽位版本
1️⃣数据结构:
- 哈希表:创建 n n n个哈希表 T 1 , T 2 , . . . , T n T_1,T_2,...,T_n T1,T2,...,Tn
- 哈希函数:每个哈希表 T i T_i Ti都有各自的独立的哈希函数 h i h_i hi, h i ( x ) h_i(x) hi(x)决定了 x x x在 T i T_i Ti表中的分桶
- 哈希桶:每个哈希表 T i T_i Ti有各自独立的 r r r个桶即 T i [ 0 ] , T i [ 1 ] , . . . , T i [ r – 1 ] T_i[0],T_i[1],...,T_i[r–1] Ti[0],Ti[1],...,Ti[r–1],一共有 n r nr nr个桶
2️⃣查找 / / /删除算法:
- 计算桶:在 n n n个哈希表中找到查询 q q q所在的桶 T 1 [ h 1 ( q ) ] , T 2 [ h 2 ( q ) ] , . . . , T n [ h n ( q ) ] T_1[h_1(q)],T_2[h_2(q)],...,T_n[h_n(q)] T1[h1(q)],T2[h2(q)],...,Tn[hn(q)]
- 查找:检查所有这些桶中是否含 q q q,若某一桶中含有 q q q则返回查询成功
- 删除:检查所有这些桶中是否含 q q q,遇到某桶含有 q q q则进行删除
3️⃣插入算法:设置每个桶数量最大值 MaxNum \text{MaxNum} MaxNum,最大插入次数 MaxLoop \text{MaxLoop} MaxLoop
- 计算桶:在 n n n个哈希表中找到待插入对象 x x x的候选桶 T 1 [ h 1 ( x ) ] , T 2 [ h 2 ( x ) ] , . . . , T n [ h n ( x ) ] T_1[h_1(x)],T_2[h_2(x)],...,T_n[h_n(x)] T1[h1(x)],T2[h2(x)],...,Tn[hn(x)]
- 初步插入:
- 成功:优先尝试将 x x x插入到没达到阈值 MaxNum \text{MaxNum} MaxNum的任一桶 T i [ h i ( x ) ] T_i[h_i(x)] Ti[hi(x)]中
- 失败:如果所有桶对象数目都大于阈值 MaxNum \text{MaxNum} MaxNum,则随机选取桶 T i [ h i ( x ) ] T_i[h_i(x)] Ti[hi(x)]强行插入 x x x并驱赶其任一个原有对象 y y y
- 重新插入:计算 y y y的候选桶 T 1 [ h 1 ( y ) ] , T 2 [ h 2 ( y ) ] , . . . , T n [ h n ( y ) ] T_1[h_1(y)],T_2[h_2(y)],...,T_n[h_n(y)] T1[h1(y)],T2[h2(y)],...,Tn[hn(y)],按照同样的策略将 y y y插入到桶 T i [ h i ( y ) ] T_i[h_i(y)] Ti[hi(y)]
- 算法终止:
- 收敛情形:不断插入 + \text{+} +驱赶一直到到不再有驱赶发生,用优先队列避免驱赶时形成回路(比如待插入键变化为 x → y → x x\text{→}y\text{→}x x→y→x)
- 不收敛情形:当插入次数达到设定的最大值 MaxLoop \text{MaxLoop} MaxLoop时,重建所有的哈希表然后重新执行插入 x x x