散列·跳房子散列


1、定義

前言:

​ 線性探測法是在散列位置的相鄰點開始探測,這會引起很多問題,於是各種優化版本例如平方探測、雙散列等被提出來改進其中的聚集問題。但是探測相鄰位置和第二次散列相比,顯然探測相鄰位置更有優勢,所以線性探測仍然是實用的,甚至是最佳選擇。

1.1 描述

​ 跳房子散列的思路:用事先確定的,對計算機底層體系結構而言最優的一個常數,給探測序列的最大長度加個上界。這樣做可以給出常數級的最壞查詢時間,並且與布谷鳥散列一樣,查詢可以並行化,以同時檢查可用位置 的有限集。

布谷鳥散列:

https://www.cnblogs.com/dhcao/p/10562128.html

​ 要點:

​ 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、總結

​ 跳房子散列比較簡單,是一種比較新的算法,但是初始的實驗結果很有前途,特別是對那些使用多處理器並且需要大量並行和並發的應用而言。

​ 但是布谷鳥散列和跳房子散列還處於實驗室狀態,能否在實際中代替線性探測法或者平方探測法,還有待驗證。


免責聲明!

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



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