關於Hash 函式 雜湊索引表 解決位置衝突的問題

lynnucas發表於2016-07-12

      最近要用到關於hash表和hash函式,建立索引的方法

       主要用於資料的查詢和資料的儲存 ,現在主要不太理解的地方在於如何解決位置衝突的問題。先把收集的資料貼在這裡

處理問題和解決問題的能力有待加強,主要是還不夠淡定,一遇到沒有解決過的問題就會很慌!不可以這樣,淡定和臨危不懼才能體現一個人的素質,要變得更加可靠!

給人自信淡定和從容!


1.Hash表

  雜湊表(Hash table,也叫雜湊表),是根據key而直接進行訪問的資料結構。也就是說,它通過把key對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。

  以資料中每個元素的關鍵字K為自變數,通過雜湊函式H(k)計算出函式值,以該函式值作為一塊連續儲存空間的的單元地址,將該元素儲存到函式值對應的單元中。

  雜湊表儲存的是鍵值對,其查詢的時間複雜度與元素數量多少無關,雜湊表在查詢元素時是通過計算雜湊碼值來定位元素的位置從而直接訪問元素的,因此,雜湊表查詢的時間複雜度為O(1)。

2.雜湊表的構造方法

2.1直接定址法

  取關鍵字或者關鍵字的某個線性函式值作為雜湊地址,即  
   
  H(Key)=Key或者H(Key)=a*Key+b(a,b為整數)  
   
  這種雜湊函式也叫做自身函式.如果H(Key)的雜湊地址上已經有值了,那麼就往下一個位置找,直到找到H(Key)的位置沒有值了就把元素放進去.  
  此法僅適合於:地址集合的大小 等於 關鍵字集合的大小

2.2 數字分析法

  分析一組資料,比如一組員工的出生年月,這時我們發現出生年月的前幾位數字一般都相同,因此,出現衝突的概率就會很大,但是我們發現年月日的後幾位表示月份和具體日期的數字差別很大,如果利用後面的幾位數字來構造雜湊地址,則衝突的機率則會明顯降低. 
  因此數字分析法就是找出數字的規律,儘可能利用這些資料來構造衝突機率較低的雜湊地址.   
  此法適於:能預先估計出全體關鍵字的每一位上各種數字出現的頻度。

2.3 平方取中法 

  以關鍵字的平方值的中間幾位作為儲存地址(雜湊地址)。求“關鍵字的平方值” 的目的是“擴大差別” ,同時平方值的中間各位又能受到整個關鍵字中各位的影響。 

  此法適於:關鍵字中的每一位都有某些數字重複出現頻度很高的現象。

2.4 摺疊法 

   將關鍵字分割成若干部分,然後取它們的疊加和為雜湊地址。兩種疊加處理的方法:移位疊加:將分 割後的幾部分低位對齊相加;間界疊加:從一端沿分割界來回摺疊,然後對齊相加。 
   
  此法適於:關鍵字的數字位數特別多。 

2.5隨機數法

  設定雜湊函式為:H(key) = Random(key)其中,Random 為偽隨機函式 
此法適於:對長度不等的關鍵字構造雜湊函式。

2.6除留餘數法

  取關鍵字被某個不大於雜湊表表長m的數p除後所得的餘數為雜湊地址.即 
  雜湊函式為:H(key) = key MOD p ( p≤m ),其中, m為表長,p 為不大於 m 的素數。

3.雜湊表衝突解決方法

  雜湊表處理衝突主要有開放定址法再雜湊法鏈地址法(拉鍊法)和建立一個公共溢位區四種方法。 
  通過構造效能良好的雜湊函式,可以減少衝突,但一般不可能完全避免衝突,因此解決衝突是雜湊法的另一個關鍵問題。 
 “處理衝突” 的實際含義是:為產生衝突的關鍵字尋找下一個雜湊地址。

3.1開放定址法

   
  一旦發生了衝突,就去尋找下一個空的雜湊地址,只要雜湊表足夠大,空的雜湊地址總能找到,並將記錄存入。

3.1.1線性探測

  衝突發生時,順序檢視表中下一單元,直到找出一個空單元或查遍全表。

  公式: 
  

fi(key) = (f(key)+di) MOD m (di=1,2,3,......,m-1)

3.1.2二次探測法

  衝突發生時,在表的左右進行跳躍式探測,雙向尋找到可能的空位置。

公式:

fi(key) = (f(key)+di) MOD m (di = 12, -12, 22, -22,……, q2, -q2, q <= m/2)

3.1.3隨機探測法

  在衝突時,對於位移量 di 採用隨機函式計算得到,我們稱之為隨機探測法。

 公式: 
 

fi(key) = (f(key)+di) MOD m (di是一個隨機數列)

  線性探測再雜湊容易產生“二次聚集”,即在處理同義詞的衝突時又導致非同義詞的衝突。 
  線性探測再雜湊的優點是:只要雜湊表不滿,就一定能找到一個不衝突的雜湊地址,而二次探測再雜湊和偽隨機探測再雜湊則不一定。

3.2鏈地址法

   將所有雜湊地址相同的記錄都連結在同一連結串列中。各連結串列上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況。 
   處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;

3.3再雜湊法

這種方法是同時構造多個不同的雜湊函式:

Hi=RH1(key),i=1,2,3,…,n. 

當雜湊地址Hi=RH1(key)發生衝突時,再計算Hi=RH2(key)……,直到衝突不再產生。這種方法不易產生聚集,但增加了計算時間。

3.4建立公共溢位區

  這種方法的基本思想是:將雜湊表分為基本表和溢位表兩部分,凡是和基本表發生衝突的元素,一律填入溢位表.(注意:在這個方法裡面是把元素分開兩個表來儲存)


相關文章