【问题标题】:How does hopscotch hashing actually work?跳房子散列实际上是如何工作的?
【发布时间】:2015-08-27 17:06:18
【问题描述】:

我正在阅读hopscotch hashing
算法说当我们在插入过程中遇到冲突时:

Otherwise, j is too far from i. To create an empty entry closer to i, find an
item y whose hash value lies between i and j, but within H − 1 of j, and
whose entry lies below j. Displacing y to j creates a new empty slot closer
to i. Repeat. If no such item exists, or if the bucket already i contains H
items, resize and rehash the table.

我不确定这是如何工作的。
例子。假设 H = 3,a,b,c 都映射到 0,d,e 映射到 1
我们有:

 0  1  2  3  4  5    
[a, b, c, d,  ,  ] the table with 2 slots empty    
    i       j

b,c 在 H - 1 (2) 个位置内远离它们的位置 (0) 在表的位置 1,2 和 d 在其位置 1 的 2 个位置内。
如果我尝试插入也映射到 1 的 e,我将从索引 4(通过线性探测找到的空槽)开始,并将向后工作到 1。
根据算法,索引 3(现在有 d)在 i 和 j 之间(分别为 1 和 4)并且在 H - 1 内,即 j 的 2 个位置。
所以我们可以交换并拥有:

 0  1  2  3  4  5    
[a, b, c,  , d ,  ] the table with 2 slots empty    
    i       j

所以现在空槽是 3,我们可以插入 e,因为它距离 i 2 个位置。
但是现在哈希值映射到 1 的 d 从 1 开始超过 2 个位置,再也找不到了。

那么这个算法是如何工作的呢?
注意:我的假设和理解是,跳值只是一个优化技巧,它不必对属于桶,与核心算法本身无关。

【问题讨论】:

    标签: algorithm performance hash hashtable hopscotch-hashing


    【解决方案1】:

    它说找到一个 散列值 介于 i 和 j 之间但在 j 的 H-1 内的项目。它并不是说要找到 当前位置 位于 i 和 j 之间,而是在 j 的 H-1 内的项目。索引 3 处的 d 的哈希值为 1,它不在 4 的 2 个位置内。

    在你的例子中,没有合适的槽,所以下面这句话生效,表应该resize和rehashed。

    【讨论】:

    • 所以算法会对 i 和 j 之间的每个元素应用哈希函数来找到那些落在 j 的 H-1 范围内的元素?因此,在这种情况下,重新哈希 d 并应用模数得到 1 以查看索引 3 中的 d 不是交换的候选对象?
    • 这就是为什么需要跳信息?因为在这种情况下,如果没有跃点信息,这种重新散列很昂贵,不是吗(但对于 H 元素,我猜平均为 H/2)
    • @Jim 你可以这样做并获得正确的行为,是的。或者您可以使用文章中描述的“跳跃信息”位来计算它,而无需重新计算哈希值,这样效率更高。
    • 但占用更多空间。那么 H 重新散列的性能损失很大吗?还是取决于用例?
    • 这取决于你。几个字节可能是值得的。顺便说一句,“重新散列”是完全不同的东西。
    猜你喜欢
    • 2021-01-21
    • 2011-09-27
    • 2021-12-16
    • 2013-03-14
    • 2021-03-23
    • 2011-02-11
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多