Skip to content

方法Method

Robin Hood 哈希

Robin Hood hashing · 罗宾汉哈希

在线性探测中让走得更远的键抢占槽位,用逐键路径证书证明提前失败与后移删除。

形式陈述 ​

抢占比较的是探测距离 ​

固定容量 m≥2、不可变首页函数 h:K→{0,…,m−1},表保存完整键和值。沿线性探测的循环顺序 h(x),h(x)+1,… 访问槽,运算均模m。若键x位于槽j,其探测距离为

D(x)=(j−h(x))modm.

每槽为空或保存 (key,value,D),且至少留一个空槽。新键走到已占槽时,若自己的当前距离严格大于住户距离,就占下该槽,把旧住户作为待插入键继续向后走;相等时不交换。这是本文固定的顺序、线性Robin Hood版本,属于开放定址。[1, §§2.1–2.2]

返回接口为 get(k)=(found,value)、delete(k)=(found,value);缺失值的found为false,即使合法值本身为None也不混淆。put(k,v)先查询:已存在则覆盖值;缺失且已有m−1键则返回失败,旧表不变;其它情况插入并返回成功。容量判断发生在交换前,不能把被踢出的旧键丢在失败路径上。

查询依靠逐键证书 ​

不变量分为键唯一性、距离字段准确性,以及下面的路径证书:若x最终距离为d,则对每个 0≤t<d,槽 h(x)+t 非空,其中住户的距离至少为t。

查询x从距离t=0开始。遇相等键就返回;遇空槽就失败;遇住户距离小于t也立即失败。最后一个停止条件正确,因为若x还在更后面,其路径证书会要求此住户距离至少t。没有匹配又没有停止时,t增加1继续。至少一个空槽保证最迟绕一圈结束。

插入时携带键、值和当前距离。交换使该槽住户的距离增加,因此不会破坏其它已存键对该槽的下界要求。新放下的键已经沿途经过足够大的住户;被换出的键保留原有前缀证书,并因新住户距离更大而获得继续走一步所需的证据。到空槽放下携带项,全部证书恢复。

直觉

让已经走远的键少等一点 ​

两个键争一个槽时,刚从首页出发的键还有较短的旅程,已经绕过许多槽的键则承担了更多冲突。Robin Hood把当前槽给后者。这个规则改变的是冲突分配方式;键相等仍须实际比较,首页相同并不表示是同一键。

更重要的是,距离字段成了负查询证据。沿x的探测路线走到t步时,如果某住户连t步都没走过,x若曾到达这里就会抢占它,因此x不会安稳地留在更后面。这个解释对应路径证书,而不是未经证明的“整张表越来越有序”。

例子与边界

插入与后移删除的完整轨迹 ​

取m=8、h(k)=kmod8,依次插入0、1、8、16。值分别为键乘10。只列已占前缀,括号是距离:

操作后 槽0 槽1 槽2 槽3
插入0、1 0(0) 1(0) 空 空
插入8 0(0) 8(1) 1(1) 空
插入16 0(0) 8(1) 16(2) 1(2)

8在槽1以距离1抢占距离0的键1;16在槽2以距离2抢占距离1的键1。再插入2,它经过槽2、3,最终在槽4以距离2落下。

删除8后,不能直接留下槽1为空:16的查找会在那里提前停止。依次把16从2移到1,把1从3移到2,把2从4移到3,距离各减1,最后清空槽4。结果是0(0)、16(1)、1(1)、2(1)。

后移到哪里停止,为什么安全 ​

删除命中项后把其槽视为洞。只要下一槽非空且距离大于0,就把下一记录移入洞、距离减1,洞随之右移;遇空槽或距离0的记录便停止,清空当前洞。

移动键原有路径的最后一步被删去,且被一起前移的路径位置,其要求距离和住户距离都减1;跨到未移动前缀时保留原有较强下界。因此移动项仍满足路径证书。若停止处的下一项距离为0,任何更后键若还需要跨过洞,其路线在该下一槽的步数应为正,但住户距离为0,违反删除前证书;故无需再搬它们。空槽情形同理由旧表没有跨空槽的路径保证。

键正好在首页时不能向前搬,否则其循环距离会从0变成m−1;“一直挪到下一个空槽”是错误删除规则。环绕时仍按循环距离判断,不能用普通整数槽差代替。

距离并不全局单调 ​

另从空表按0、8、16、2插入,槽0至3的距离是0、1、2、1。最后一项回落到1,表却完全合法。查不存在的24时,在槽3已走3步而住户只走1步,正好可以提前失败。

最坏情况仍可有m−1个键共享首页,成功查询或删除需线性工作。历史Robin Hood论文的随机探测方差分析,不是对任意固定线性哈希函数的最坏常数保证。墓碑版本也需重新维护查询证据;本文只证明无墓碑的后移版本。

推论与应用

成本和测试必须对应同一接口 ​

按常数字长键、常数哈希求值与相等比较计,固定表的查询、插入和删除各最坏O(m),表空间O(m)记录。一次插入携带项向前走、不回头,交换次数不超过访问槽数;后移删除同样最多绕一圈。扩容、随机种子选择与摊还界另行分析,不能从抢占规则直接推出来。

距离也可由槽位和完整键重算,或存入足以表示0至m−1的字段;若工程实现把它压成小整数,溢出必须触发重建或拒绝,不能静默回绕,否则提前失败会制造假阴性。

终点任务逐操作与独立映射比较,同时检查物理键唯一性和每个路径不等式。迁移时把同首页碰撞簇移到槽7,使其跨越表尾;再删除其中间项,列出实际槽和循环距离。若实现只在不环绕的示例正确,这个检查会立即暴露差异。

参考资料

[1] Pedro Celis,Robin Hood Hashing,Waterloo Technical Report CS-86-14,1986,§§2.1–2.2、Figure2.1,印刷pp.12–15,定义按探测年龄抢占。§§6.1–6.3印刷pp.54–57讨论的是保留删除信息的版本;本文线性路径证书、无墓碑后移与相应成本独立给出,不将二者混同。

关系图谱3 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

下位 / 直接特例

暂未标注直接特例。