这个哈希函数效率如何?

时间:2014-03-16 18:49:54

标签: java algorithm hash

我不确定最好的办法是散列一首"字典"进入一张桌子。

字典有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);       
}

2 个答案:

答案 0 :(得分:2)

效果分析:

您的哈希函数不会考虑订单。根据你的算法,如果没有溢出, ab = ba。您的代码依赖于溢出来区分不同的顺序。因此,如果您认为句子是基于N的数字,则可以删除许多额外碰撞的空间。

建议的改进:

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

因此,如果我们将字符串表示为基于N的数字,则会以惊人的比例减少碰撞次数。

答案 1 :(得分:1)

如果词典包含以下单词:

abdc  
abcd  
dbca  
dabc  
dacb   

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

示例
hash = [0]*base^(n-1) + [1]*base^(n-2) + ... + [n-1]
其中base为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