1)衝突是如何產生的?
上文中談到,雜湊函式是指如何對關鍵字進行編址的規則,這裡的關鍵字的範圍很廣,可視為無限集,如何保證無限集的原資料在編址的時候不會出現重複呢?規則本身無法實現這個目的。舉乙個例子,仍然用班級同學做比喻,現有如下同學資料
張三,李四,王五,趙剛,吳露.....
假如我們編址規則為取姓氏中姓的開頭字母在字母表的相對位置作為位址,則會產生如下的雜湊表
位置字母
程式設計客棧 姓名0a
1b2c
...10
l
李四...22w
王五,吳露
..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
2325
李四..
吳用王五
(a)線性探測再雜湊對趙剛進行編址,且di=1
10...
2022
..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檔案結構,最後,我將詳細的闡述一下gif檔案是如何構成的,如何高效操作此種型別檔案。
本文標題: 如何解決hash衝突
本文位址: /ruanjian/csharp/153715.html
如何解決Hash衝突
雜湊衝突相關介紹 雜湊計算時努力把比較大的資料存放到相對較小的空間 最常見的雜湊演算法是取模法 取模法的計算過程 比如陣列的長度是5,這是有乙個資料是6,那麼如何把這個6存放到長度只是5的資料中呢,安裝取模法,計算6 5,結果是1,那麼就把6放到資料下標是1的位置,那麼7就應該放在2這個位置,到此位...
如何解決雜湊衝突
就不自己寫了,直接貼下吧 看了concurrenthashmap的實現,使用的是拉鍊法.雖然我們不希望發生衝突,但實際上發生衝突的可能性仍是存在的。當關鍵字值域遠大於雜湊表的長度,而且事先並不知道關鍵字的具體取值時。衝突就難免會發 生。另外,當關鍵字的實際取值大於雜湊表的長度時,而且表中已裝滿了記錄...
svn 如何解決衝突
專案中,往往不止你一人開發,多人開發,難免會有 的衝突。彼此間誰也不能保證不會修改同個檔案。如果修改了同個方法的內容。這時提交到svn是會提示 衝突的。當然,衝突是可控的,但不能避免。每次寫 的時候,標準的姿勢是先update,再修改提交。下面,我們說下衝突後該如何解決?檔案衝突格式如下 code ...