哈希表
哈希函數:記錄的存儲位置和它的關鍵字之間建立一個確定的對應關係。
衝突:對不同的關鍵字可能得到同一哈希地址,這種現象稱爲衝突。
哈希函數構造方法
1.直接定址法
取關鍵字或關鍵字的某個線性函數值爲哈希地址,即:
或
2.數字分析法
3.平方取中法
取關鍵字平方後的中間幾位爲哈希地址。這是一種較常用的構造哈希函數的方法。一個數平方後的中間幾位數和數的每一位都相關。
4.摺疊法
5.除留餘數法
取關鍵字被某個不大於哈希表表長m的數p除後所得餘數爲哈希地址,即
這是最簡單也是最常用的構造哈希函數的方法。不僅可以對關鍵字直接取模,也可以在摺疊,平方取中等運算之後取模。
6.隨機數法
衝突處理方法
1.開放定址法
爲哈希函數;爲增量序列,可有下列三種取法:
- ,稱爲線性探測再散列;
- ,稱爲二次探測再散列;
- 爲僞隨機數列,稱爲僞隨機探測再散列。
2.再哈希法
均是不同的哈希函數,即在同義詞產生地址衝突時計算另一個哈希函數地址,直到衝突不再發生,但是增加了計算時間。
3.鏈地址法
將所有關鍵字爲同義詞的記錄存儲在同一線性鏈表中。
平均查找長度以牛客網中的一個題目舉例:
設散列表的長度爲10,散列函數H(n)=n mod 7,初始關鍵字序列爲 (33,24,8,17,21,10),用鏈地址法作爲解決衝突的方法,平均查找長度是():
33/7=5, 查找33需要1次;
24/7=3,查找24需要1次;
8/7=1,查找8需要1次;
17/7=3,查找17需要2次;
21/7=0,查找21需要1次;
10/7=3,查找10需要3次;
ASL=每個關鍵字查找的次數之和/關鍵字的個數=(1+1+1+2+3+1)/6=1.5
4.建立一個公共溢出區
哈希表的查找及分析
哈希表的裝填因子定義爲
,
爲表中填入的記錄數,爲哈希表的長度。標誌着哈希表的裝滿程度。
線性探測再散列的哈希表查找成功時的平均查找長度
,
隨機探測再散列,二次探測再散列查找成功時平均查找長度
,
鏈地址法處理衝突的哈希表查找成功時的平均查找長度爲
。
參考:
數據結構(c語言版),嚴蔚敏