hash構造和解決雜湊衝突

2021-10-23 18:19:45 字數 1128 閱讀 8918

對於構造雜湊來說,主要包括直接位址法、平方取中法、除留餘數

法等。對於處理雜湊衝突來說,最常用的處理衝突的方法有開放定址法、再雜湊法、鏈位址法、建立公共溢位區等方法。sgl版本使用鏈位址法,使用乙個鍊錶保持相同雜湊值的元素。

雖然鏈位址法並不要求雜湊桶長度必須為質數,但sgi stl仍然以質數來設計雜湊桶長度,並且將28個質數(逐漸呈現大約兩倍的關係)計算好,以備隨時訪問,同時提供乙個函式,用來查詢在這28個質數之中,「最接近某數並大於某數」的質數。

雜湊是通過對資料進行再壓縮,提高效率的一種解決方法。但由於通過雜湊函式產生的雜湊值是有限的,而資料可能比較多,導致經過雜湊函式處理後仍然有不同的資料對應相同的值。這時候就產生了雜湊衝突。

裝填因子(裝填因子=資料總數 / 雜湊表長)、雜湊函式、處理衝突的方法

1.開放位址方法

(1)線性探測

按順序決定值時,如果某資料的值已經存在,則在原來值的基礎上往後加乙個單位,直至不發生雜湊衝突。 

(2)再平方探測

按順序決定值時,如果某資料的值已經存在,則在原來值的基礎上先加1的平方個單位,若仍然存在則減1的平方個單位。隨之是2的平方,3的平方等等。直至不發生雜湊衝突。

(3)偽隨機探測

按順序決定值時,如果某資料已經存在,通過隨機函式隨機生成乙個數,在原來值的基礎上加上隨機數,直至不發生雜湊衝突。

2.鏈式位址法(hashmap的雜湊衝突解決方法)

對於相同的值,使用鍊錶進行連線。使用陣列儲存每乙個鍊錶。

優點:(1)拉鍊法處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;

(2)由於拉鍊法中各煉表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;

(3)開放定址法為減少衝突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鍊法中可取α≥1,且結點較大時,拉鍊法中增加的指標域可忽略不計,因此節省空間;

(4)在用拉鍊法構造的雜湊表中,刪除結點的操作易於實現。只要簡單地刪去鍊錶上相應的結點即可。

缺點:指標占用較大空間時,會造成空間浪費,若空間用於增大雜湊表規模進而提高開放位址法的效率。

3.建立公共溢位區

建立公共溢位區儲存所有雜湊衝突的資料。

4.再雜湊法

對於衝突的雜湊值再次進行雜湊處理,直至沒有雜湊衝突。

解決雜湊(HASH)衝突的主要方法

雖然我們不希望發生衝突,但實際上發生衝突的可能性仍是存在的。當關鍵字值域遠大於雜湊表的長度,而且事先並不知道關鍵字的具體取值時 衝突就難免會發 生。另外,當關鍵字的實際取值大於雜湊表的長度時,而且表中已裝滿了記錄,如果插入乙個新記錄,不僅發生衝突,而且還會發生溢位 因此,處理衝突和溢位是 雜湊技術中...

解決雜湊(HASH)衝突的主要方法

雖然我們不希望發生衝突,但實際上發生衝突的可能性仍是存在的。當關鍵字值域遠大於雜湊表的長度,而且事先並不知道關鍵字的具體取值時。衝突就難免會發 生。另外,當關鍵字的實際取值大於雜湊表的長度時,而且表中已裝滿了記錄,如果插入乙個新記錄,不僅發生衝突,而且還會發生溢位。因此,處理衝突和溢位是 雜湊技術中...

雜湊(hash)表 鏈位址法解決衝突

首先要感謝下面博主 mark 一下 說的很清楚,也能直接用,只是做了一點點小改進 將衝突的hash值存放到了鏈尾 增加了remove函式,方便刪除不要的節點 此方法中,乙個key至只對應乙個value lookup函式 定義乙個查詢根據key查詢結點的方法,首先是用hash函式計算頭位址,然後根據頭...