2015-09-09 100 views
2

我正在研究Data Structures Problem Solving Using Java這本書,並被要求爲書中給定函數的第5行提供詳細的僞代碼。顯然第5行相當於一個16位二進制數的添加和移位,但我不明白這是如何工作的。散列運算僞代碼

我來自一個基本的Java背景,並將行#5理解爲存儲變量乘以37並添加了循環已經迭代的當前字母(我假設它在添加時被轉換爲ASCII字符到inthashVal)。

public static int hash(String key, int tableSize) { 
    int hashVal = 0; 

    for(int i = 0; i < key.length(); i++) 
     hashVal = 37 * hashVal + key.charAt(i); // line 5 

    hashVal %= tableSize; 
    if(hashVal < 0) 
     hashVal += tableSize; 

    return hashVal; 
} 

任何人都可以幫我解釋第5行和16位二進制數的加法和移位是如何相關的嗎?換句話說,第5行如何以僞代碼來描述以適應這個定義?

+1

與16位數字無關。 37 = 26個字母+ 10個數字+ 1個其他字符,同時也是素數,因此會產生一個良好分佈的值。 – stark

回答

1

它們可能是指將key.charAt(i)隱式轉換爲int; char s在內部表示爲16位數字。就是這樣 - 這就是char s如何表示並轉換爲int s。詳情參見http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html

char數據類型(因此,一個字符對象封裝的值)是基於原始Unicode規範,其定義字符爲固定寬度的16位實體。此後,Unicode標準已被更改爲允許表示要求多於16位的字符。合法代碼點的範圍現在是U + 0000到U + 10FFFF,稱爲Unicode標量值。 (請參閱Unicode標準中U + n表示法的定義。)