直接定址法
直接定址法是以數據元素關鍵字k本身或它的線性函數作為它的哈希地址,即:H(k)=k 或 H(k)=a×k+b ; (其中a,b為常數)
例1,有一個人口統計表,記錄了從1歲到100歲的人口數目,其中年齡作為關鍵字,哈希函數取關鍵字本身,如圖(1):
地址 |
A1 |
A2 |
…… |
A99 |
A100 |
年齡 |
1 |
2 |
…… |
99 |
100 |
人數 |
980 |
800 |
…… |
495 |
107 |
可以看到,當需要查找某一年齡的人數時,直接查找相應的項即可。如查找99歲的老人數,則直接讀出第99項即可。這種哈希函數簡單,並且對於不同的關鍵字不會產生沖突,但可以看出這是一種較為特殊的哈希函數,實際生活中,關鍵字的元素很少是連續的。用該方法產生的哈希表會造成空間大量的浪費,因此這種方法適應性並不強。[2]↑
除留余數法
取關鍵字被某個不大於哈希表表長m的數p除后所得余數為哈希地址,即設定哈希函數為 Hash(key)=key mod p (p≤m),其中,除數p稱作模。
除留余數法不僅可以對關鍵字直接取模,也可以在折疊、平方取中等運算后取模。對於除留余數法求哈希地址,關鍵在於模p的選擇。使得數據元素集合中每一個關鍵字通過該哈希函數映射到內存單元的任意地址上的概率相等,從而盡可能減少發生哈希沖突的可能性。
理論研究表明,除留余數法的模p取不大於表長且最接近表長m素數時效果最好,且p最好取1.1n~1.7n之間的一個素數(n為存在的數據元素個數)。例如:當n=7時,p最好取11、13等素數。 又例圖(5):
表長m |
8 |
16 |
32 |
64 |
128 |
256 |
512 |
1000 |
模p |
7 |
13 |
31 |
61 |
127 |
251 |
503 |
997 |
由於除留余數法的地址計算方法簡單,而且在許多情況下效果較好。[2]↑
例9,公司有236個員工,而員工編號介於1000到9999,除留余數法就是員工編號除以數據個數236后,去余數即為數據的位置。編號5428員工的數據(編號5428除以236取余數得0)放數據中的第一筆,編號3512員工數據(編號3512除以236取余數得8)放數據中的第九筆…依次類推。