将哈希表复制到新的重新哈希表

时间:2013-01-11 11:19:12

标签: data-structures hash hashmap hashtable

我有一个关于重复的问题。假设我们有一个大小为7的哈希表,我们的哈希函数是(key%tableSize)。我们在表中插入24,并且24将在索引3处,因为24%7 = 3。然后,让我们说我们添加了更多元素,现在我们想重新进行更新。表大小将是初始表大小的两倍,即新表大小将为14.然后,在将元素复制到新哈希表时,例如,在复制元素24时,它仍将在索引3中,还是指数24%14 = 10。我的意思是,我们在复制元素时使用新表大小,还是元素保留在初始索引中? 感谢

2 个答案:

答案 0 :(得分:0)

哈希表的重要之处在于不保证元素的顺序,它取决于哈希函数。

对于您的示例:如果使用7作为散列大小将数据复制到新散列中,则新数组的7,8,9,10,11,12和13将被闲置,因为您使用了更大的数组和你的哈希函数不能给你大于6的结果。这些未使用的索引是一件坏事,因为只是你不需要它们,所以最好使用key % 14代替。

有趣的是,内部哈希表状态不仅取决于散列函数,还取决于元素插入的顺序。例如,假设有一个哈希表(使用数组和链表实现)X,大小为4,并按顺序插入元素2,3,6,10:

x 
{
    [0] -> []
    [1] -> []
    [2] -> [2,6,10]
    [3] -> [3]
}

对于哈希函数,再次使用key % size

现在,如果我们以不同的顺序插入密钥 - 10,6,3,2,我们得到:

x 
{
    [0] -> []
    [1] -> []
    [2] -> [10,6,2]
    [3] -> [3]
}

我上面写的所有这些内容只是为了向您展示哈希的两个副本在内部看起来不同,因为在很多因素上。我认为这是对你问题的考虑。

答案 1 :(得分:0)

这取决于你的散列函数。在您的情况下,您应该使用密钥%size_of_table其他插槽后7将永远不会被散列函数映射。只有当您选择线性探测才能解决碰撞时,这些插槽才会占用。(我们寻找下一个空插槽)。选择新尺寸将有助于在早期阶段减少碰撞,否则就会出现表格尚未达到负荷系数的情况,即使您面临很多碰撞。