【问题标题】:How efficient is this hash function?这个哈希函数的效率如何?
【发布时间】:2014-03-16 18:49:53
【问题描述】:

我不确定将“字典”散列到表中的最佳方法。

词典有61406个单词,我通过SizeOFDictionary/.75判断超载

这给了我 81874 个桶。

我通过我的哈希函数(通用随机算法)运行它,并且有 31690 个桶被用完。还有 50 几千个是空的。最大的桶只包含 10 个单词。

我的问题:这些数字足以满足哈希项目的需求吗?我不熟悉我想要实现的目标,对我来说,似乎 50 几千是很多空桶。

这是我的哈希函数。

private void hashingAlgorithm(String word)
{
    int key = 1;
    //Multiplying ASCII values of string
    //To determine the index
    for(int i = 0 ; i < word.length(); i++){
        key *= (int)word.charAt(i);
        //Accounting for integer overflow
        if(key<0)
            key*=-1;
    }
    key %= sizeOfTable;
    //Inserting into the table
    table[key].addToBucket(word);       
}

【问题讨论】:

  • String.hashCode() 有什么问题?
  • 我应该创建自己的哈希算法。这是一个班级项目。
  • 好的,这是一个哈希算法。但这对我来说不是很好。至少将字符值与您选择的整数相乘,而不是乘以键,在每一步将它们添加到键和模中。
  • @Fallen,我会这样做的,你能告诉我选择我选择的整数的目的是什么吗?
  • 2 * 3 == 3 * 2 但是 (2*10+3) != (3*10+2) 。 . .

标签: java algorithm hash


【解决方案1】:

性能分析:

您的散列函数没有考虑顺序。根据你的算法,如果没有溢出, ab = ba。您的代码依赖于溢出来区分不同的顺序。因此,如果您将句子视为基于 N 的数字,则可以消除很多额外的冲突。

建议改进:

2 * 3 == 3 * 22 * 223 + 3 != 3 * 223 + 2

因此,如果我们将字符串表示为基于 N 的数字,那么冲突的数量将会大幅减少。

【讨论】:

    【解决方案2】:

    如果字典中包含类似的词:

    abdc  
    abcd  
    dbca  
    dabc  
    dacb   
    

    所有将在哈希表中被哈希到相同的值,即 int(a)*int(b)*int(c)*int(d) ,这不是一个好主意。
    所以,使用滚动哈希。

    示例
    hash = [0]*base^(n-1) + [1]*base^(n-2) + ... + [n-1]
    其中基数是prime number,比如31

    注意[i] 表示char.at(i)

    您也可以使用modulo p [显然 p 是一个素数] 运算符来避免 overflow 并限制您的 size 的哈希表。

    hash = [0]*base^(n-1) + [1]*base^(n-2) + ... + [n-1] mod p

    【讨论】:

    • key *= (int)word.charAt(i)*BASE^(word.length()-(i-1));我试过了,现在我抛出了一个异常,指出该数组超出范围 -10502
    • 你需要这样做:(a + b + c)%mod = a%mod + b%mod + c%mod 并且因为a*b 可以超出整数范围。 (a*b)%mod = (a%mod * b%mod ) %mod 。我以为你对它很熟悉,所以没有将它包含在答案中。对于a*b,也可以使用long long
    • 单词的最大长度是多少?
    • 没有最大单词长度
    • 仍然是一个疯狂的猜测,因为您需要计算 31^max。长度
    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 2016-12-10
    • 2019-08-15
    • 1970-01-01
    • 2018-03-12
    • 2013-10-10
    • 2016-09-23
    • 2019-11-28
    相关资源
    最近更新 更多