-2

我有一个家庭作业,我必须为字典创建一个哈希表,用户可以在其中输入一个单词作为键,它将搜索并显示含义。

但是我不确定从 String 键到 int 键的转换是如何工作的。这是我从教科书中获取的代码:

 public int hashVal(String key, int tableSize)
{
    int hashKey= 0;
    int temp = 0;
    for(int i=0;i<key.length();i++)
    {
        temp = 37*temp+(int)key.charAt(i);
    }
    temp%=tableSize;
    if (temp<0)
    {
        temp+=tableSize;
    }
    hashKey=temp;
    return hashKey;
}

非常感谢解释或更简单的代码。

4

2 回答 2

0

您的代码有几个冗余。您的哈希计算 - 虽然不一定不正确 - 也是非标准的。我不确定它是否会产生良好的分布,我认为答案是否定的。

我建议进行两个修订:使用37 * (int)key.charAt(i) + hash,并摆脱 temp 变量。

这样就变成了:

public static int hashVal(String s, int max) {
    int hash = 0;
    for(Char c : s.toCharArray())
        hash = Math.abs((hash + 37*(int)c) % max);
    return hash;
}
于 2013-04-14T17:27:40.617 回答
0

字符串(或任何通用对象)散列的基本思想是使用输入的所有部分,以便我们得到一个相当随机和分布的值。

所以对于一个字符串,我们使用字符串中的所有字符来计算哈希值。同样,对于对象,建议在计算哈希值时使用对象中的所有重要字段。

Java 类似地使用您的教科书代码的变体。

问题:为什么你的教科书使用 37?[Java 类似地使用您的教科书代码的变体,将 31 作为常量值]

回答:使用素数显然可以更好地分布整个表中的哈希值。

于 2013-04-14T17:25:28.127 回答