“Hopscotch哈希采用另一种候选约束:每键只许位于首页后H格内,属于首页的位图直接列出可能位置。插入通过搬动旧键让空洞靠近;局部邻域已满时,即使全表仍有空槽也会失败。该位图顺序版的查询、…”
形式陈述
邻域约束与位图的归属
固定m个循环槽、整数
作为开放定址,槽保存完整键和值。另为每个首页b保存H位图 hop[b]:第d位为1,当且仅当槽b+d保存一个首页为b的键。位图属于b,不属于恰好住在槽b的记录。它即使在物理槽b为空时也可能非零。[1, §2]
查询x只枚举 hop[h(x)] 的置位偏移,比较相应槽里的完整键;全部不等则确定缺失。删除命中项只清其物理槽及首页位图的对应位,不需墓碑,也不需移动其它项。相同键更新只换值。
插入把空洞搬近
缺失新键x的首页为a。从a循环向后找到首个空槽,记其未取模偏移为j,
若j≥H,寻找一个旧首页偏移b和它的置位偏移t,满足
其中真实首页是a+b模m。旧键当前在偏移b+t,新空槽在偏移j;它移到j后的距离j−b仍小于H,因此可以搬。清位图旧位t、设置新位j−b,旧位置b+t成为新洞。将j改为b+t,继续上述过程。
每次j严格减小,所有搬走的旧键仍在自己的邻域。若找不到合法搬移,返回插入失败;已经完成的搬移可以保留,旧抽象映射不变,新键尚未写入。若需要“失败时字节布局也不变”的更强事务接口,就必须额外记录并撤销搬移,本文不作此承诺。
直觉
搬键的目的,是让洞走回来
普通线性探测让新键不断远离首页。Hopscotch为每个键规定最大距离,宁可先把别的键移到它们仍可接受的位置,让空洞一步步回到新键附近。移动方向是旧键向右、空洞向左;两者不能在图或代码里混成同一个方向。
位图避免了“遇空即停”的依赖。若首页槽是空的,但位图第2位为1,查询仍应到两步外去看。删除因此可以留洞,不会截断其它键的搜索证据。
例子与边界
两次搬移才轮到新键
取m=8、H=3、
- 取旧首页3,将键3从槽3移到槽5。它的新距离为2,仍小于H;hop[3]从001改为100,洞回到3。
- 取旧首页1,将键1从槽1移到槽3。hop[1]同样从001改为100,洞回到1。
- 距离1已在新键邻域,把8放到槽1;hop[0]变成011,表示槽0和槽1都属于首页0。
最终槽0至5的键是0、8、2、1、4、3。查键1时,读取首页1的位图100,直接比较槽3;并不是因为槽1当前存着键8,就去使用键8的首页信息。
还有五个空槽,也可能放不进去
仍取m=8、H=3,键0、8、16都以0为首页,已经占满槽0、1、2。第四个同首页键24只有这三个候选槽,故不可能插入,尽管槽3至7全空。整体负载因子不能代替每个局部邻域的容量条件。
更一般地,本文确定的贪心搬移遇阻只报告“本轮未能构建”,不能自动给出所有可能重排都失败的证明。例如m=4、H=3的合法物理布局为 [空,7,4,5],各旧键距首页都是2。插入首页为1的键1时,首个洞在槽0、偏移3;候选首页2没有记录,首页3的旧记录在偏移2而不是本轮允许搬移的位置,所以算法受阻。但把键4、1、5、7分别放入槽0、1、2、3便是一个合法满表。换更大H、扩容重哈希或改用其它候选规则,都要作为新一轮构造处理;不能把尚未存入的键当成已有成员。
H=1退化为每键只能放首页,碰撞立即受阻;H=m时任意槽都在邻域,首个空槽直接可用,不需搬移。固定的小H保证查询范围小,但不保证任何键集都能成功插入。
推论与应用
顺序算法的正确性和成本
位图与物理记录的一一对应是主不变量。插入的一次搬移只改变某首页的两位,并把同一键值从旧槽移至新槽;其他首页的位图保持不变。严格下降的j证明过程终止,最后新键进入自己的邻域。删除反向清掉唯一对应位,故查询完整且没有假阳性;这里的“失败”是插入失败,不是近似成员误报。
以下先把位图的单个位访问、更新,以及哈希和键比较按常数操作计;可用可寻址位数组,或让H位图装入一个机器字。查询和删除最多比较H个候选,最坏O(H)。查空槽O(m),最多m次搬移;朴素版本每次扫描至多H个候选首页及H个位,故插入保守最坏
原论文还有并发与分段结构。本文没有锁、原子发布或读写交错模型,不能把顺序位图证明扩展成并发安全结论;原论文的实验吞吐也不是本页最坏插入界。[1, §§2–3]
终点任务除两次搬移外,还要求删除某键的首页记录,留下该首页另一个键在偏移2处。证明此时不能见空即停,并检查位图到底归谁。下载实现与独立映射逐操作对照,插入失败前已有合法搬移的历史也保留核验。
参考资料
[1] Maurice Herlihy、Nir Shavit、Moran Tzafrir,Hopscotch Hashing,DISC 2008,LNCS5218,pp.350–364,§2及Figure1给出固定邻域位图方案,§3另述并发优化。本文选择§2的顺序接口,明确保留构造失败并给出确定性成本,不使用未展开的随机阈值断言。