哈希表存取方便但存儲時容易沖突(collision):即不同的關鍵字可以對應同一哈希地址。如何確定哈希函數和解決沖突是哈希表查找的關鍵。
1.哈希函數的構造方法
構造哈希函數的方法有很多,這里介紹幾種常用的。
直接定址法:H(k)=k 或H(k)=a*k+b(線形函數)
如:人口數字統計表
| 地址 | 1 | 2 | 3 | ... | 100 |
| 年齡 | 1 | 2 | 3 | ... | 100 |
| 人數 | 67 | 3533 | 244 | ... | 4 |
數字分析法:取關鍵字的若干數位組成哈希地址
如:關鍵字如下:若哈希表長為100則可取中間兩位10進制數作為哈希地址。
| 81346532 | 81372242 | 81387422 | 81301367 | 81322817 | 81338967 | 81354157 | 81368537 |
平方取中法:關鍵字平方后取中間幾位數組成哈希地址
折疊法:將關鍵數字分割成位數相同的幾部分(最后一部分的位數可以不同)然后取幾部分的疊加和(舍去進位)作為哈希地址。
除留余數法:取關鍵字被某個不大于表長m的數p除后所得的余數為哈希地址。
H(k)=k mod p p<=m
隨機數法:H(k)=rondom(k)。
2.處理沖突的方法
假設地址集為0..n-1,由關鍵字得到的哈希地址為j(0<=j<=n-1)的位置已存有記錄,處理沖突就是為該關鍵字的記錄找到另一個" 空"的哈希地址。在處理中可能得到一個地址序列Hi i=1,2,...k 0<=Hi<=n-1),即在處理沖突時若得到的另一個哈希地址H1仍發生沖突,再求下一地址H2,若仍沖突,再求H3...。怎樣得到Hi 呢?
開放定址法:Hi=(H(k)+di) mod m (H(k)為哈希函數;m為哈希表長;di為增量序列)
當di=1,2,3,... m-1 時叫線性探測再散列。
當di=12,-12,22,-22,32,-32,...,k2,-k2時叫二次探測再散列。
當di=random(m)時叫偽隨機探測序列。
例:長度為11的哈希表關鍵字分別為17,60,29,哈希函數為H(k)=k mod 11,第四個記錄的關鍵字為38,分別按上述方法添入哈希表的地址為8,4,3(隨機數=9)。---為什么不是6,5,7呢
再哈希法:Hi=RHi(key) i=1,2,...,k,其中RHi均為不同的哈希函數。
鏈地址法:這種方法很象基數排序,相同的地址的關鍵字值均鏈入對應的鏈表中。
建立公益區法:另設一個溢出表,不管得到的哈希地址如何,一旦發生沖突,都填入溢出表。
3.哈希表的查找
例:如下一組關鍵字按哈希函數H(k)=k mod 13和線性探測處理沖突所得的哈希表a[0..15]:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 14 | 01 | 68 | 27 | 55 | 19 | 20 | 84 | 79 | 23 | 11 | 10 |
當給定值k=84,則首先和a[6]比,再依次和a[7],a[8]比,結果a[8]=84查找成功。
當給定值k=38,則首先和a[12]比,再和a[13]比,由于a[13]沒有,查找不成功,表中不存在關鍵字等于38的記錄。
from:
http://www.coood.com/postfile/2006-12-31/20061231174649.shtml
others will be appended later


