跳房子哈希实际上如何运作?

时间:2015-06-11 20:01:46

标签: algorithm performance hash hashtable hopscotch-hashing

我正在阅读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位于表格位置1,2的位置(0)的H - 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的位置从1开始超过2个位置,并且无法再找到它们。

那么这个算法是如何工作的呢? 注意:我的假设和理解是,跳跃值只是一个优化技巧,因为不必在属于存储桶的所有H元素上运行相等且与核心算法本身无关。

1 个答案:

答案 0 :(得分:1)

它说找到一个项目,其哈希值位于i和j之间,但在j的H-1之内。它没有说找到当前位置位于i和j之间但在j的H-1之内的项目。索引3处的d具有哈希值1,其不在4的2个位置内。

在您的示例中,没有合适的插槽,因此以下句子生效,并且应该调整表格并重新调整表格。