數據結構:哈希表函數構造和衝突解決方法

哈希表

哈希函數:記錄的存儲位置和它的關鍵字之間建立一個確定的對應關係f

衝突:對不同的關鍵字可能得到同一哈希地址,這種現象稱爲衝突。

哈希函數構造方法

1.直接定址法

取關鍵字或關鍵字的某個線性函數值爲哈希地址,即:

H(key) = keyH(key) = a*key +b

2.數字分析法

3.平方取中法

取關鍵字平方後的中間幾位爲哈希地址。這是一種較常用的構造哈希函數的方法。一個數平方後的中間幾位數和數的每一位都相關。

4.摺疊法

5.除留餘數法

取關鍵字被某個不大於哈希表表長m的數p除後所得餘數爲哈希地址,即

                   H(key) = key MOD p,p\leqslant m

這是最簡單也是最常用的構造哈希函數的方法。不僅可以對關鍵字直接取模,也可以在摺疊,平方取中等運算之後取模。

6.隨機數法 

衝突處理方法

1.開放定址法

                 H(key) = (H(key) + d_{i}) MOD m,i = 1,2,...,k(k\leq m-1)

H(key)爲哈希函數;d_{i}爲增量序列,可有下列三種取法:

  1. d_{i} = 1,2,3,...,m-1,稱爲線性探測再散列;
  2. d_{i} = 1^{2},-1^{2},2^{2},-2^{2},...,稱爲二次探測再散列;
  3. d_{i}爲僞隨機數列,稱爲僞隨機探測再散列。

2.再哈希法

                    H_{i} = RH_{i}(key) i = 1,2,...,k

RH_{i}均是不同的哈希函數,即在同義詞產生地址衝突時計算另一個哈希函數地址,直到衝突不再發生,但是增加了計算時間。

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.建立一個公共溢出區

哈希表的查找及分析

哈希表的裝填因子定義爲

               \alpha =\frac{num}{l}

num爲表中填入的記錄數,l爲哈希表的長度。標誌着哈希表的裝滿程度。

線性探測再散列的哈希表查找成功時的平均查找長度

                    S\approx \frac{1}{2}(1+\frac{1}{1-\alpha })

隨機探測再散列,二次探測再散列查找成功時平均查找長度

                   S\approx -\frac{1}{\alpha }ln(1-\alpha )

鏈地址法處理衝突的哈希表查找成功時的平均查找長度爲

                   S = 1+\frac{\alpha }{2}

參考:

數據結構(c語言版),嚴蔚敏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章