[英]How efficient is this hash function?
我不確定將“字典”散列到表中的最佳方法。
字典有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);
}
績效分析:
您的散列函數不會考慮訂單。 根據你的算法,如果沒有溢出, ab = ba
。 您的代碼依賴於溢出來區分不同的順序。 因此,如果您將句子視為基於N的數字,則可以刪除許多額外碰撞的空間。
建議的改進:
2 * 3 == 3 * 2
但是2 * 223 + 3 != 3 * 223 + 2
因此,如果我們將字符串表示為基於N的數字,則碰撞的數量將以顯着的比例減少。
如果字典包含以下單詞:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.