雜湊表介紹

2021-10-01 10:01:49 字數 3870 閱讀 5411

在順序結構及樹中,元素關鍵碼與其儲存位置之間沒有對應關係,所以查詢的時候要進行多次的比較,有沒有一種搜尋方法,可以不經過任何比較,一次直接獲得想要搜尋的元素。構造一種儲存結構,通過某種函式(hashfunc)使元素的儲存位置與它的關鍵碼之間能夠建立一一對映的關係,根據這種想法構造了hash表。

當向該結構中:

插入元素

根據待插入元素的關鍵碼,以此函式計算出該元素的儲存位置並按此位置進行存放。

搜尋元素

對元素的關鍵碼進行同樣的計算,把求得的函式值當做元素的儲存位置,在結構中按此位置取元素比較,若關鍵碼相等,則搜尋成功。

該方式即為雜湊(雜湊)方法,雜湊方法中使用的轉換函式稱為雜湊(雜湊)函式,構造出來的結構稱為雜湊表 (hash table)(或者稱雜湊表)。

例如:資料集合;

雜湊函式設定為:hash(key) = key % capacity; capacity為儲存元素底層空間總的大小。

用該方法進行搜尋不用進行多次關鍵碼的比較,因此搜尋的速度比較快,但是如果再插入元素44,會出現什麼問題?

對於兩個資料元素的關鍵字 和 (i != j),有 != ,但有:hash( ) == hash( ),即:不同關鍵字通過

相同雜湊哈數計算出相同的雜湊位址,該種現象稱為雜湊衝突或雜湊碰撞。

把具有不同關鍵碼而具有相同雜湊位址的資料元素稱為「同義詞」。

引起雜湊衝突的乙個原因可能是雜湊函式設計不夠合理

雜湊函式設計原則:

1.雜湊函式的定義域必須包括需要儲存的全部關鍵碼,而如果雜湊表允許有m個位址時,其值域必須在0 到m-1之間

2.雜湊函式計算出來的位址能均勻分布在整個空間中

3.雜湊函式應該比較簡單

常見雜湊函式

假設關鍵字為1234,對它平方就是1522756,抽取中間的3位227作為雜湊位址; 再比如關鍵字為 4321,對它平方就是18671041,抽取中間的3位671(或710)作為雜湊位址 。

平方取中法比較適合:不知 道關鍵字的分布,而位數又不是很大的情況。

4.摺疊法

摺疊法是將關鍵字從左到右分割成位數相等的幾部分(最後一部分位數可以短些),然後將這幾部分疊加求和,並按雜湊表表長,取後幾位作為雜湊位址。

摺疊法適合事先不需要知道關鍵字的分布,適合關鍵字位數比較多的情況。

5.隨機數法

選擇乙個隨機函式,取關鍵字的隨機函式值為它的雜湊位址,即h(key) = random(key),其中random為隨機數函式。

通常應用於關鍵字長度不等時採用此法。

6.數學分析法

設有n個d位數,每一位可能有r種不同的符號,這r種不同的符號在各位上出現的頻率不一定相同,可能在某些位上分布比較均勻,每種符號出現的機會均等,在某些位上分布不均勻只有某幾種符號經常出 現。可根據雜湊表的大小,選擇其中各種符號分布均勻的若干位作為雜湊位址。

數字分析法通常適合處理關鍵字位數比較大的情況,如果事先知道關鍵字的分布且關鍵字的若干位分布 較均勻的情況。

解決雜湊衝突的兩種常見方法是:閉雜湊開雜湊

一、閉雜湊

閉雜湊概念

閉雜湊也叫開放定址法,當發生雜湊衝突時,如果雜湊表未被裝滿,說明在雜湊表中必然還有空位置,那麼可以把key存放到衝突位置中的「下乙個」 空位置中去。

那麼如何尋找下乙個空位置呢?

線性探測

在下圖場景中,現在需要插入元素44,先通過雜湊函式計算雜湊位址,hashaddr為4,因此44理論 上應該插在該位置,但是該位置已經放了值為4的元素,即發生雜湊衝突。

線性探測:從發生衝突的位置開始,依次向後探測,直到尋找到下乙個空位置為止。

插入1.通過雜湊函式獲取待插入元素在雜湊表中的位置

2.如果該位置中沒有元素則直接插入新元素,如果該位置中有元素發生雜湊衝突,使用線性探測找到下乙個空位置,插入新元素。

線性探測優點:實現非常簡單。

線性探測缺點:一旦發生雜湊衝突,所有的衝突連在一起,容易產生資料「堆積」,即:不同關鍵碼佔據 了可利用的空位置,使得尋找某關鍵碼的位置需要許多次比較,導致搜尋效率降低。

二次探測

線性探測的缺陷是產生衝突的資料堆積在一塊,這與其找下乙個空位置有關係,因為找空位置的方式就是挨著往後逐個去找,因此二次探測為了避免該問題,找下乙個空位置的方法為:hi= (ho+i²)% m, 或者:hi= (ho-i²)% m。其中:i = 1,2,3…,ho是通過雜湊函式hash(x)對元素的關鍵碼 key 進行 計算得到的位置,m是表的大小。 對於下述情況如果要插入44,產生衝突,使用解決後的情況為: hi = (4+2²)= 8

研究表明:當表的長度為質數且表裝載因子a不超過0.5時,新的表項一定能夠插入,而且任何乙個位置 都不會被探查兩次。因此只要表中有一半的空位置,就不會存在表滿的問題。在搜尋時可以不考慮表裝 滿的情況,但在插入時必須確保表的裝載因子a不超過0.5,如果超出必須考慮增容。

雜湊表的增容機制

雜湊表的荷載因子定義為:α = 填入表中的元素個數/雜湊表的長度。

α是雜湊表裝滿程度的標誌因子。由於表長是定值,α與「填入表中額元素個數」成正比,所以,α越大,表明填入表中的元素越多,產生衝突的可能性就越大;反之,α越小,表明填入表中的元素越少,產生衝突的可能性就越小。實際上雜湊表的平均查詢長度是荷載因子α的函式,知識不同處理衝突的方法有不同的函式。

對於開放定址法,荷載因子是特別重要因素,應嚴格限制在0.7-0.8以下,超過0.8,查表時的cpu快取不命中按照指數曲線上公升。

閉雜湊的刪除

採用閉雜湊處理雜湊衝突時,不能隨便物理刪除雜湊表中已有的元素,若直接刪除元素會影響其他元素的搜尋(因為查詢的時候遇到空就會停止搜尋)。比如刪除較前面元素,如果直接刪除掉,後面元素查詢起來可能會受影響。因此線性探測採用標 記的偽刪除法來刪除乙個元素。

二、開雜湊

開雜湊概念

開雜湊法又叫鏈位址法(開鏈法),首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結 點儲存在雜湊表中。

從上圖可以看出,開雜湊中每個桶中放的都是發生雜湊衝突的元素。

開雜湊的增容

桶的個數是一定的,隨著元素的不斷插入,每個桶中元素的個數不斷增多,極端情況下,可能會導致一

個桶中鍊錶節點非常多,會影響的雜湊表的效能,因此在一定條件下需要對雜湊表進行增容,那該條件 怎麼確認呢?開雜湊最好的情況是:每個雜湊桶中剛好掛乙個節點,再繼續插入元素時,每一次都會發 生雜湊衝突,因此,在元素個數剛好等於桶的個數時,可以給雜湊表增容。

應用鏈位址法處理溢位,需要增設鏈結指標,似乎增加了儲存開銷。事實上: 由於開放定址法必須保持大量的空閒空間以確保搜尋效率,如二次探查法要求裝載因子a <= 0.7,而表項所佔空間又比指標大的多,所以使用鏈位址法反而比開放定址法節省儲存空間。

hlist 雜湊鍊錶介紹

雜湊表又稱雜湊表,是為了加快元素查詢而設計的一種資料結構。基本原理是 把需要查詢的關鍵字通過對映函式 雜湊函式 對映到相應的儲存位址,然後直接訪問元素。需要儲存或者查詢的元素一般稱為關鍵字 key value 而這個對映函式一般稱為雜湊函式,對映到的儲存位址一般稱為雜湊表。與陣列相比較 陣列通過陣列...

雜湊表的簡單介紹

雜湊表的概念 雜湊表 hash table 也叫雜湊表,是根據鍵碼值 key value 而直接進行訪問的資料結構。它通過把關鍵碼值對映到雜湊表中的乙個位置來訪問記錄,以加快查詢速度。這個對映函式就叫做雜湊函式,存放記錄的陣列的雜湊表。雜湊表查詢的時間複雜度雜湊表儲存的是鍵值對,其查詢的時間複雜度與...

雜湊表 雜湊表

一 定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。雜湊表的做法其實很簡單,就是把key通過乙個固定的演算法函式...