哈希法又稱散列法、雜湊法以及關鍵字地址計算法等,相應的表稱爲哈希表。這種方法的基本思想是:首先在元素的關鍵字k和元素的存儲位置p之間建立一個對應關係f,使得p=f(k),f稱爲哈希函數。創建哈希表時,把關鍵字爲k的元素直接存入地址爲f(k)的單元;以後當查找關鍵字爲k的元素時,再利用哈希函數計算出該元素的存儲位置p=f(k),從而達到按關鍵字直接存取元素的目的。
綜上所述,哈希法主要包括以下兩方面的內容:
8.4.1 哈希函數的構造方法
下面介紹構造哈希函數常用的五種方法。
1.
2.
當無法確定關鍵字中哪幾位分佈較均勻時,可以先求出關鍵字的平方值,然後按需要取平方值的中間幾位作爲哈希地址。這是因爲:平方後中間幾位和關鍵字中每一位都相關,故不同關鍵字會以較高的概率產生不同的哈希地址。
例:我們把英文字母在字母表中的位置序號作爲該英文字母的內部編碼。例如K的內部編碼爲11,E的內部編碼爲05,Y的內部編碼爲25,A的內部編碼爲01, B的內部編碼爲02。由此組成關鍵字“KEYA”的內部代碼爲11052501,同理我們可以得到關鍵字“KYAB”、“AKEY”、“BKEY”的內部編碼。之後對關鍵字進行平方運算後,取出第7到第9位作爲該關鍵字哈希地址,如圖8.23所示。
關鍵字 |
內部編碼 |
內部編碼的平方值 |
H(k)關鍵字的哈希地址 |
KEYA |
11050201 |
122157778355001 |
778 |
KYAB |
11250102 |
126564795010404 |
795 |
AKEY |
01110525 |
001233265775625 |
265 |
BKEY |
02110525 |
004454315775625 |
315 |
圖8.23平方取中法求得的哈希地址
3.
1
6
2
1
+)
(a)移位疊加
4.
假設哈希表長爲m,p爲小於等於m的最大素數,則哈希函數爲
h(k)=k
例如,已知待散列元素爲(18,75,60,43,54,90,46),表長m=10,p=7,則有
此時衝突較多。爲減少衝突,可取較大的m值和p值,如m=p=13,結果如下:
此時沒有衝突,如圖8.25所示。
0
|
|
54 |
|
43 |
18 |
|
46 |
60 |
|
75 |
|
90 |
5.
在實際應用中,應根據具體情況,靈活採用不同的方法,並用實際數據測試它的性能,以便做出正確判定。通常應考慮以下五個因素
l
l
l
l
l
8.4.2
1.
這種方法也稱再散列法,其基本思想是:當關鍵字key的哈希地址p=H(key)出現衝突時,以p爲基礎,產生另一個哈希地址p1,如果p1仍然衝突,再以p爲基礎,產生另一個哈希地址p2,…,直到找出一個不衝突的哈希地址pi
l
這種方法的特點是:衝突發生時,順序查看錶中下一單元,直到找出一個空單元或查遍全表。
l
l
具體實現時,應建立一個僞隨機數發生器,(如i=(i+p) % m),並給定一個隨機數做起點。
例如,已知哈希表長度m=11,哈希函數爲:H(key)=
key
0
|
|
|
47 |
26 |
60 |
69 |
|
|
|
|
0
|
|
69 |
47 |
26 |
60 |
|
|
|
|
|
0
|
|
|
47 |
26 |
60 |
|
|
69 |
|
|
從上述例子可以看出,線性探測再散列容易產生“二次聚集”,即在處理同義詞的衝突時又導致非同義詞的衝突。例如,當表中i, i+1 ,i+2三個單元已滿時,下一個哈希地址爲i,
2.
當哈希地址Hi=RH1(key)發生衝突時,再計算Hi=RH2(key)……,直到衝突不再產生。這種方法不易產生聚集,但增加了計算時間。
3.
例如,已知一組關鍵字(32,40,36,53,16,46,71,27,42,24,49,64),哈希表長度爲13,哈希函數爲:H(key)= key % 13,則用鏈地址法處理衝突的結果如圖8.27所示:
圖8.27
本例的平均查找長度
4、建立公共溢出區
這種方法的基本思想是:將哈希表分爲基本表和溢出表兩部分,凡是和基本表發生衝突的元素,一律填入溢出表