【问题标题】:Old elements in a hashtable aren't found after a resize?调整大小后找不到哈希表中的旧元素?
【发布时间】:2017-04-12 21:41:22
【问题描述】:

我正在为我的数据结构类创建自己的哈希表 adt,但遇到了问题。我使用以下函数对哈希表中的(键,值)条目进行哈希处理(键是字符串,值可以是任何数据类型,它是通用的):

private int hashCode(String key)
{
    final int constant = 37;
    int hash = 0;

    for(int i=0;i<key.length();i++)
    {
        hash+=(int)key.charAt(i) * Math.pow(constant,i);
    }
    return hash;
}
private int hash(String key)
{
    return hashCode(key) % capacity
}

使用线性探测插入到表中工作正常,但是如果我选择扩展表,hash(key) 函数将无法充分用于哈希表的 get(key) 操作,因为容量已经改变(在正确映射表扩展之前,它将映射到不正确的位置)。有没有什么简单的方法可以编辑它,它考虑到哈希表的扩展,假设是两倍。即:如果 loadfactor > 0.5 将表增加 2* 容量。

【问题讨论】:

  • 在调整数组大小后重新散列所有键是一种常见的做法。您可能需要查看您的教科书,以更深入地了解它是如何完成的。

标签: java data-structures hash hashtable


【解决方案1】:

一般来说,当您对哈希表进行重新哈希时,您需要遍历哈希表中的所有元素并根据它们的哈希码重新分配它们,以便它们最终位于正确的位置。这比仅正常调整大小需要更多时间,否则表格将无法正常工作。

另一种方法是使用不同的冲突解决方案,例如 extendible hashing,该方案专门用于避免在放置物体后移动物体,但考虑到线性探测散列在实践中的速度有多快,我想这种设置的速度会减慢可能不值得。

【讨论】:

  • 好吧,我添加了一个重新分配功能,以便在需要重新散列时重新分配所有数据。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2018-03-05
  • 2011-06-24
  • 2013-12-21
  • 2012-10-14
  • 2011-04-03
  • 2021-03-14
  • 2017-06-07
相关资源
最近更新 更多