1、定義
前言:
線性探測法是在散列位置的相鄰點開始探測,這會引起很多問題,於是各種優化版本例如平方探測、雙散列等被提出來改進其中的聚集問題。但是探測相鄰位置和第二次散列相比,顯然探測相鄰位置更有優勢,所以線性探測仍然是實用的,甚至是最佳選擇。
1.1 描述
跳房子散列的思路:用事先確定的,對計算機底層體系結構而言最優的一個常數,給探測序列的最大長度加個上界。這樣做可以給出常數級的最壞查詢時間,並且與布谷鳥散列一樣,查詢可以並行化,以同時檢查可用位置 的有限集。
布谷鳥散列:
要點:
a)依然是線性探測
b)探測長度\(i\)有個上限
c)上限是提前定好的,跟計算機底層體系結構有關系
1.2 圖解
跳房子散列規則:
a)最大探測上界MAX_DIST = 4
b)散列位置\(hash(x)\),則探測位置為 \(hash(x)+0\)、\(hash(x)+1\)、\(hash(x)+2\)、\(hash(x)+3\)。
c)下例:
圖解說明:
圖1展示A~G的元素,右側是他們的散列值。圖表中的Hop表示探測位置是否被占用,比如“0010”,說明\(hash(x)+2\)位置被使用。用四位碼表示具體位置。
a)插入A,A的散列位置是7,則Hop[7]的第0個位置被占用,記作“1000”;
b)插入B,B的散列位置是9,則Hop[9]的第0個位置被占用,記作“1000”;
c)插入C,C的散列位置是6,則Hop[6]的第0個位置被占用,記作“1000”;以上未發生沖突。
d)插入D,D的散列位置是7,發生沖突,位置7已經存在值A,開始線性探測,探測下一個位置\(hasx(x)+1 = 8\),位置8未被占用,可插入,則Hop[7]的第1個位置被占用,將Hop[7]記作“1100”;
e)插入E,E的散列位置是8,發生沖突,位置8已經存在值D,開始線性探測,探測下一個位置$hasx(x)+1 =9 \(,位置9已經存在值B,繼續探測下一個位置\)hasx(x)+2 = 10$,位置10未被占用,可插入,測試Hop[8]的第2個位置被占用,將Hop記作“0010”;
f、g)插入F、G。未發生沖突,同上插入。
上述跳房子插入很簡單,我們插入一個值,如果在它的hash位置發生沖突,即在上界范圍內線性探測下一個位置,知道達到上界,如果有空位置則插入。
問:如果線性探測,直到上界都無法插入呢?
答:當我們上界設置得不夠大時,這種情況是必須考慮的。此時的插入流程將會稍微負責。
例如:我們在上述例子中繼續插入H,散列值為9。我們探測位置9、10、11、12都被占用,只能到13,但是位置13明顯超過上界,即\(hash(x)+3\)都未能找到可插入點。那我們將找一個值y來替換掉。並把它重置到位置13。可以去到位置13的值只有散列值為10、11、12、13的值。如果我們檢查Hop[10],它的值為“0000”,沒有可以替換的候選項,於是我們檢查Hop[11],它的值為“1000”,其值為G,可以被放到位置13。於是我們將元素G放到位置13,將11空出來,插入H。
2、總結
跳房子散列比較簡單,是一種比較新的算法,但是初始的實驗結果很有前途,特別是對那些使用多處理器並且需要大量並行和並發的應用而言。
但是布谷鳥散列和跳房子散列還處於實驗室狀態,能否在實際中代替線性探測法或者平方探測法,還有待驗證。