簡體   English   中英

這個哈希函數效率如何?

[英]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 number31

注意[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM