2020資料結構 查詢之雜湊表

2021-09-27 04:34:37 字數 3173 閱讀 9398

線性表和樹表的查詢中,記錄在表中的位置與記錄的關鍵字之間不存在確定的關係,因此,在這些表中查詢記錄時需要一些關鍵字比較。這類查詢建立在「比較」的基礎上,查詢的效率取決於比較的次數。

同義詞:上述發生碰撞的不同關鍵字。

在構造雜湊函式時,必須注意以下幾點:

雜湊函式的定義域必須包含全部的需要儲存的關鍵字,而值域的範圍則依賴於雜湊表的大小或位址範圍。

雜湊函式計算出來的位址應該能等概率、均勻地分布在整個位址空間中,儘量減少衝突的發生。

雜湊函式應盡量簡單,能夠在較短時間內計算出任一關鍵字對應的雜湊位址。

常用的雜湊函式:

直接定址法

直接取關鍵字的某個線性函式值為雜湊位址,雜湊函式為h(key)=a*key+b

a和b為常數,這種方法計算簡單,且不會產生衝突,適合關鍵字的分布基本連續,若分布不連續,空位較多 ,則會造成儲存空間的浪費。

除留餘數法

最簡單、最常用;假定雜湊表表長為m,取乙個不大於m但最接近或等於m的質數p,利用以下公式把關鍵字裝換成雜湊位址。雜湊函式為:h(key) = key mod p(取餘)。

數字分析法

假設關鍵字集合中的每個關鍵字key都是由s位數字組成(k1,k2,……,kn),分析key中的全體資料,並從中提取分布均勻的若干位或他們的組合構成全體。

比如:我們知道身份證號是有規律的,現在我們要儲存乙個班級學生的身份證號碼,假設這個班級的學生都出生在同乙個地區,同一年,那麼他們的身份證的前面數字都是相同的,那麼我們可以擷取後面不同的幾位儲存,假設有5位不同,那麼就用這五位代表位址。

h(key)=key%100000

此種方法通常用於數字位數較長的情況,必須數字存在一定規律,其必須知道數字的分布情況,比如上面的例子,我們事先知道這個班級的學生出生在同一年,同乙個地區。

平房取中法

如果關鍵字的每一位都有某些數字重複出現頻率很高的現象,可以先求關鍵字的平方值,通過平方擴大差異,而後取中間數字作為最終儲存位址。

比如key=1234 1234^2=1522756 取227作hash位址

比如key=4321 4321^2=18671041 取671作hash位址

這種方法適合事先不知道資料並且資料長度較小的情況

摺疊法將關鍵字分割成位數相同的幾部分(最後一部分的位數可以短一點),取他們的疊加和作為hash位址。

比如key=123 456 789

我們可以儲存在61524,取末三位,存在524的位置

該方法適用於數字位數較多且事先不知道資料分布的情況

開放定址法

如果h(key1)=h(keyi),那麼keyi儲存位置hi=(h(key)+di) mod m ;m為表長,di有三種取法:

(1) 線性探測法:發生衝突時順序檢視下乙個單元(當探測到表尾時,下乙個單元在表首位址0),直到找出乙個空閒單元或查遍全表;線性探測法可能使第i個雜湊位址的同義詞存入第i+1個雜湊位址,這樣本應存入第i+1個的元素便去爭奪i+2個元素的位址,造成大量元素在雜湊位址上聚集(或堆積起來),大大降低了查詢效率。

(2)平方探測法:

di = 11,-11,22,-22…kk,-kk(k<=m/2),雜湊表的長度必須是乙個可以表示成4k+3的素數,又稱二次探測法。

可以避免出現堆積,但是不能探測到雜湊表上的所有單元,不過至少能探測到一半。

(3)再雜湊法:

需要使用兩個雜湊函式,當通過第乙個雜湊函式時h(key)得到的位址發生衝突時,則利用第二個雜湊函式hash2(key)計算該關鍵字的位址增量,具體雜湊函式如下:hi = (h(key)+ihash2(key))%m。

初次探測位置h0 = h(key)%m。i是衝突次數,初始為0。在雜湊法中,最多經過m-1次探測就會遍歷表中的所有位置,回到h0位置。

示例如下:

拉鍊法對不同的關鍵字可能通過雜湊函式對映到同一位址,為了避免非同義詞發生衝突,可以把所有同義詞儲存在乙個線性鍊錶中,這個線性鍊錶由其雜湊位址唯一標識。表示雜湊位址為i的同義詞鍊錶的頭指標存放著雜湊表的第i個單元,因而查詢、插入和刪除主要在同義詞鏈中進行。拉鍊法適合經常進行插入和刪除的情況。

雜湊查詢

查詢過程和造表過程一致,假設採用開放定址法處理衝突,則查詢過程為:

對於給定的key,計算hash位址index = h(key)

如果陣列arr【index】的值為空 則查詢不成功

如果陣列arr【index】== key 則查詢成功

否則 使用衝突解決方法求下乙個位址,直到arr【index】== key或者 arr【index】==null

效能分析

決定hash表查詢的asl因素:

1)選用的hash函式

2)選用的處理衝突的方法

3)hash表的飽和度,裝載因子 α=n/m(n表示實際裝載資料長度 m為表長)

一般情況,假設hash函式是均勻的,則在討論asl時可以不考慮它的因素

hash表的asl是處理衝突方法和裝載因子的函式

前人已經證明,查詢成功時如下結果:

可以看到無論哪個函式,裝載因子越大,平均查詢長度越大,那麼裝載因子α越小越好?也不是,就像100的表長只存乙個資料,α是小了,但是空間利用率不高啊,這裡就是時間空間的取捨問題了。通常情況下,認為α=0.75是時間空間綜合利用效率最高的情況。

上面的這個表可是特別有用的。假設我現在有10個資料,想使用鏈位址法解決衝突,並要求平均查詢長度<2

那麼有1+α/2 <2

α<2

即 n/m<2 (n=10)

m>10/2

m>5 即採用鏈位址法,使得平均查詢長度< 2 那麼m>5

hash表是基於裝載因子的函式,也就是說,當資料n增加時,我可以通過增加表長m,以維持裝載因子不變,確保asl不變。

那麼hash表的構造應該是這樣的:

資料結構之雜湊表查詢 雜湊表

這個知識點不難,話不多說,直接上 如下 1 include stdafx.h 2 include3 define success 1 4 define unsuccess 0 5 define hashsize 12 定義雜湊表長為陣列的長度 6 define nullkey 3276878 usi...

資料結構之查詢(七) 雜湊表查詢(雜湊表)

雜湊技術是在記錄的儲存位置和它的關鍵字之間建立乙個確定的對應關係f,使得每個關鍵字key對應 乙個儲存位置f key 即儲存位置 f 關鍵字 我們把這種對應關係f稱為雜湊函式,又稱為雜湊 hash 函式。採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續儲存空間稱為雜湊表或雜湊表 hash ta...

資料結構之查詢 七 雜湊表 雜湊表

基本概念 如何查詢?以上兩例為例,若查詢2001011810216的資訊,可直接訪問v 16 查詢key 9,則訪問h 9 9號位址,若內容為9則成功,若查不到,則返回空指標或空記錄。優缺點 構造方法 制定乙個好的解決衝突的方案 構造雜湊函式需考慮的因素 根據元素集合的特性構造 要求2 無論用什麼方...