我不确定最好的办法是散列一首"字典"进入一张桌子。
字典有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);
}
答案 0 :(得分:2)
效果分析:
您的哈希函数不会考虑订单。根据你的算法,如果没有溢出,
ab = ba
。您的代码依赖于溢出来区分不同的顺序。因此,如果您认为句子是基于N的数字,则可以删除许多额外碰撞的空间。
建议的改进:
2 * 3 == 3 * 2
但
2 * 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