hash碰撞處理


對於Hash,我們是怎樣來處理沖突的。現在就來介紹一些經典的Hash沖突處理的方法。主要包括

 

  (1)開放地址法

  (2)拉鏈法

  (3)再哈希法

  (4)建立公共溢出區

 

(1)開放地址法

 

 

(2)拉鏈法

   

    拉鏈法又叫鏈地址法,適合處理沖突比較嚴重的情況。基本思想是把所有關鍵字為同義詞的記錄存儲在同一個

    線性鏈表中。

 

(3)再哈希法

 

    再哈希法又叫雙哈希法,有多個不同的Hash函數,當發生沖突時,使用第二個,第三個,....,等哈希函數

    計算地址,直到無沖突。雖然不易發生聚集,但是增加了計算時間。

 

(4)建立公共溢出區

 

    建立公共溢出區的基本思想是:假設哈希函數的值域是[1,m-1],則設向量HashTable[0...m-1]為基本

    表,每個分量存放一個記錄,另外設向量OverTable[0...v]為溢出表,所有關鍵字和基本表中關鍵字為同義

    詞的記錄,不管它們由哈希函數得到的哈希地址是什么,一旦發生沖突,都填入溢出表。

經典的hash碰撞面試題:

● 已知一個線性表(38,25,74,63,52,48),假定采用散列函數h(key)=key%7計算散列地址,並散列存儲在散列表A[0..6]中,若采用線性探測方法解決沖突,則在該散列表上進行等概率成功查找的平均查找長度為_____2____ 。

若利用拉鏈法解決沖突,則在該散列表上進行等概率成功查找的平均查找長度為 ___1.33_
解答:
按照H(K)=k mod 7得:
38----1
25----1
74----2
63----1
52----4
48----3
所以ASL=1/6(1+1+2+1+4+3)=2

 

其他回答
我們首先必須要知道在建立這個散列表時,每個數據存儲時進行了幾次散列。這樣就知道哪一個元素,查找的長度是多少。
散列表的填表 過程如下:
首先存入第一個元素38,由於h(38)=38%7=3,又因為3號單元現在沒有數據,所以把38存入3號單元。
接着存入第二個元素25,由於h(25)=25%7=4,又因為4號單元現在沒有數據,所以把25存入4號單元。
接着存入第三個元素74,由於h(74)=74%7=4,此時的4號單元已經被25占據,所以進行線性再散列,線性再散列的公式為:Hi= (H(key)+di)% m   ,其中的di=1,2,3,4...。所以H1=(4+1)%7=5,此時的單元5沒有存數據,所以把74存入到5號單元。
接着存入第四個元素63,由於h(63)=63%7=0,此時的0號單元沒有數據,所以把63存入0號單元。
接着存入第五個元素52,由於h(52)=52%7=3,此時的3號單元已被38占據,所以進行線性再散列:H1=(3+1)%7=4,但4號單元也被占 據了,所以再次散列:H2=(3+2)%7=5,但5號單元也被占據了,所以再次散列:H3=(3+3)%7=6,6號單元為空,所以把52存入6號單 元。
最后存入第六個元素48,由於h(48)=48%7=6,此時的6號單元已被占據,所以進行線性再散列:H1=(6+1)%7=0,但0號單元也被占據 了,所以再次散列:H2=(6+2)%7=1,1號單元為空,所以把48存入1號單元。
如果一個元素存入時,進行了N次散列,相應的查找次數也是N,所以38,25,63這三個元素的查找長度為1,74的查找長度為2,48的查找長度為 3,52的查找長度為4。所以平均查找長度為:(1+1+1+2+3+4)/6=2。

 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM