hash的衝突處理

1)衝突是如何產生的?
上文中談到,哈希函數是指如何對關鍵字進行編址的規則,這裏的關鍵字的範圍很廣,可視爲無限集,如何保證無限集的原數據在編址的時候不會出現重複呢?規則自己沒法實現這個目的。舉一個例子,仍然用班級同窗作比喻,現有以下同窗數據
張三,李四,王五,趙剛,吳露.....
假如咱們編址規則爲取姓氏中姓的開頭字母在字母表的相對位置做爲地址,則會產生以下的哈希表
位置
字母 姓名 0 a 1 b 2 c ...
10    L     李四
...
22 W 王五,吳露 ..
25 Z 張三,趙剛

咱們注意到,灰色背景標示的兩行裏面,關鍵字王五,吳露被編到了同一個位置,關鍵字張三,趙剛也被編到了同一個位置。老師再拿號來找張三,座位上有兩我的,"大家倆誰是張三?"
2)如何解決衝突問題
既然不能避免衝突,那麼如何解決衝突呢,顯然須要附加的步驟。經過這些步驟,以制定更多的規則來管理關鍵字集合,一般的辦法有:
a)開放地址法
開放地執法有一個公式:Hi=(H(key)+di)
MOD m i=1,2,...,k(k<=m-1)
其中,m爲哈希表的表長。di
是產生衝突的時候的增量序列。若是di值可能爲1,2,3,...m-1,稱線性探測再散列。
若是di取1,則每次衝突以後,向後移動1個位置.若是di取值可能爲1,-1,2,-2,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2)

稱二次探測再散列。若是di取值可能爲僞隨機數列。稱僞隨機探測再散列。仍然以學生排號做爲例子,
現有兩名同窗,李四,吳用。李四與吳用事先已排好序,現新來一名同窗,名字叫王五,對它進行編制
10..
.... 22 .. .. 25 李四.. .... 吳用 .. .. 25    趙剛將來以前
10.. .. 22 23 25 李四.. 吳用 王五
   (a)線性探測再散列對趙剛進行編址,且di=1
10... 20 22 .. 25 李四.. 王五 吳用    (b)二次探測再散列,且di=-2

1... 10... 22 .. 25 王五.. 李四.. 吳用     (c)僞隨機探測再散列,僞隨機序列爲:5,3,2


b)再哈希法

當發生衝突時,使用第二個、第三個、哈希函數計算地址,直到無衝突時。缺點:計算時間增長。
好比上面第一次按照姓首字母進行哈希,若是產生衝突能夠按照姓字母首字母第二位進行哈希,再衝突,第三位,直到不衝突爲止
c)鏈地址法
將全部關鍵字爲同義詞的記錄存儲在同一線性鏈表中。以下:

所以這種方法,能夠近似的認爲是筒子裏面套筒子
d.創建一個公共溢出區 假設哈希函數的值域爲[0,m-1],則設向量HashTable[0..m-1]爲基本表,另外設立存儲空間向量OverTable[0..v]用以存儲發生衝突的記錄。 通過以上方法,基本能夠解決掉hash算法衝突的問題。 注:之因此會簡單得介紹了hash,是爲了更好的學習lzw算法,學習lzw算法是爲了更好的研究gif文件結構 .
相關文章
相關標籤/搜索