標籤:
一、雜湊表
1、概念
雜湊表(Hash Table)也叫散列表,是根據關鍵碼值(Key Value)而直接進行訪問的資料結構。它通過把關鍵碼值映射到雜湊表中的一個位置來訪問記錄,以加快尋找的速度。這個映射函數就做散列函數,存放記錄的數組叫做散列表。
2、散列儲存的基本思路
以資料中每個元素的關鍵字K為自變數,通過散列函數H(k)計算出函數值,以該函數值作為一塊連續儲存空間的的單元地址,將該元素儲存到函數值對應的單元中。
3、雜湊表尋找的時間複雜度
雜湊表儲存的是鍵值對,其尋找的時間複雜度與元素數量多少無關,雜湊表在尋找元素時是通過計算雜湊碼值來定位元素的位置從而直接存取元素的,因此,雜湊表尋找的時間複雜度為O(1)。
二、常用的雜湊函數
1. 直接定址法
取關鍵字或者關鍵字的某個線性函數值作為雜湊地址,即H(Key)=Key或者H(Key)=a*Key+b(a,b為整數),這種散列函數也叫做自身函數.如果H(Key)的雜湊地址上已經有值了,那麼就往下一個位置找,知道找到H(Key)的位置沒有值了就把元素放進去.
2. 數字分析法
分析一組資料,比如一組員工的出生年月,這時我們發現出生年月的前幾位元字一般都相同,因此,出現衝突的機率就會很大,但是我們發現年月日的後幾位表示月份和具體日期的數字差別很大,如果利用後面的幾位元字來構造散列地址,則衝突的幾率則會明顯降低.因此數字分析法就是找出數位規律,儘可能利用這些資料來構造衝突幾率較低的散列地址.
3. 平方取中法
取關鍵字平方後的中間幾位作為散列地址.一個數的平方值的中間幾位和數的每一位都有關。因此,有平方取中法得到的雜湊地址同關鍵字的每一位都有關,是的雜湊地址具有較好的分散性。該方法適用於關鍵字中的每一位取值都不夠分散或者較分散的位元小於雜湊地址所需要的位元的情況。
4. 摺疊法
摺疊法即將關鍵字分割成位元相同的幾部分,最後一部分位元可以不同,然後取這幾部分的疊加和(注意:疊加和時去除進位)作為散列地址.數位疊加可以有移位疊加和間界疊加兩種方法.移位疊加是將分割後的每一部分的最低位對齊,然後相加;間界疊加是從一端向另一端沿分割界來回摺疊,然後對齊相加.
5. 隨機數法
選擇一個隨機數,去關鍵字的隨機值作為散列地址,通常用於關鍵字長度不同的場合.
6. 除留餘數法
取關鍵字被某個不大於散列表表長m的數p除後所得的餘數為散列地址.即H(Key)=Key MOD p,p<=m.不僅可以對關鍵字直接模數,也可在摺疊、平方取中等運算之後模數。對p的選擇很重要,一般取素數或m,若p選得不好,則很容易產生衝突。一般p取值為表的長度tableSize。
三、雜湊衝突的處理方法
1、開放定址法——線性探測
線性探測法的地址增量di = 1, 2, ... , m-1,其中,i為探測次數。該方法一次探測下一個地址,知道有空的地址後插入,若整個空間都找不到空餘的地址,則產生溢出。
線性探測容易產生“聚集”現象。當表中的第i、i+1、i+2的位置上已經儲存某些關鍵字,則下一次雜湊地址為i、i+1、i+2、i+3的關鍵字都將企圖填入到i+3的位置上,這種多個雜湊地址不同的關鍵字爭奪同一個後繼雜湊地址的現象稱為“聚集”。聚集對尋找效率有很大影響。
2、開放地址法——二次探測
二次探測法的地址增量序列為 di = 12, -12, 22, -22,… , q2, -q2 (q <= m/2)。二次探測能有效避免“聚集”現象,但是不能夠探測到雜湊表上所有的儲存單元,但是至少能夠探測到一半。
3、鏈地址法
鏈地址法也成為拉鏈法。其基本思路是:將所有具有相同雜湊地址的而不同關鍵字的資料元素串連到同一個單鏈表中。如果選定的雜湊表長度為m,則可將雜湊表定義為一個有m個頭指標組成的指標數組T[0..m-1],凡是雜湊地址為i的資料元素,均以節點的形式插入到T[i]為頭指標的單鏈表中。並且新的元素插入到鏈表的前端,這不僅因為方便,還因為經常發生這樣的事實:新近插入的元素最優可能不久又被訪問。
鏈地址法特點
(1)拉鏈法處理衝突簡單,且無堆積現象,即非同義字決不會發生衝突,因此平均尋找長度較短;
(2)由於拉鏈法中各鏈表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;
(3)開放定址法為減少衝突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鏈法中可取α≥1,且結點較大時,拉鏈法中增加的指標域可忽略不計,因此節省空間的;
(4)在用拉鏈法構造的散列表中,刪除結點的操作易於實現。只要簡單地刪去鏈表上相應的結點即可。而對開放地址法構造的散列表,刪除結點不能簡單地將被刪結點的空間置為空白,否則將截斷在它之後填人散列表的同義字結點的尋找路徑。這是因為各種開放地址法中,空地址單元(即開放地址)都是尋找失敗的條件。因此在用開放地址法處理衝突的散列表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點。
四、雜湊表的裝填因子
裝填因子 = (雜湊表中的記錄數) / (雜湊表的長度)
裝填因子是雜湊表裝滿程度的標記因子。值越大,填入表中的資料元素越多,產生衝突的可能性越大。
五、不同處理衝突的平均尋找長度
例:
假設散列表的長度是13,三列函數為H(K) = k % 13,給定的關鍵字序列為{32, 14, 23, 01, 42, 20, 45, 27, 55, 24, 10, 53}。分別畫出用線性探測法和拉鏈法解決衝突時構造的雜湊表,並求出在等機率情況下,這兩種方法的尋找成功和尋找不成功的平均尋找長度。
(1)線性探測法:
尋找成功時的尋找次數等於插入元素時的比較次數,尋找成功的平均尋找長度為:
ASL = (1+2+1+4+3+1+1+3+9+1+1+3)/12 = 2.5
尋找成功時的尋找次數:第n個位置不成功時的比較次數為,第n個位置到第1個沒有資料位元置的距離:如第0個位置取值為1,第1個位置取值為2.
尋找不成功的平均尋找次數為:
ASL = (1+2+3+4+5+6+7+8+9+10+11+12)/ 13 = 91/13
(2)鏈地址法
尋找成功時的平均尋找長度:
ASL = (1*6+2*4+3*1+4*1)/12 = 7/4
尋找不成功時的平均尋找長度:
ASL = (4+2+2+1+2+1)/13
注意:尋找成功時,分母為雜湊表元素個數,尋找不成功時,分母為雜湊表長度。
雜湊表——線性探測法、鏈地址法、尋找成功、尋找不成功的平均長度