雜湊函式和雜湊衝突的基本概念

2022-09-11 08:33:09 字數 4482 閱讀 6074

雜湊法又稱雜湊法、雜湊法以及關鍵字位址計算法等,相應的表成為雜湊表。

基本思想:首先在元素的關鍵字k和元素的位置p之間建立乙個對應關係f,使得p=f(k),其中f成為雜湊函式。

建立雜湊表時,把關鍵字k的元素直接存入位址為f(k)的單元;查詢關鍵字k的元素時利用雜湊函式計算出該元素的儲存位置p=f(k).

建立雜湊表時,把關鍵字k的元素直接存入位址為f(k)的單元;查詢關鍵字k的元素時利用雜湊函式計算出該元素的儲存位置p=f(k).

當關鍵字集合很大時,關鍵字值不同的元素可能會映像到雜湊表的同一位址上,即k1!=k2,但f(k1)=f(k2),這種現象稱為hash衝突,實際中衝突是

不可避免的,只能通過改進雜湊函式的效能來減少衝突。

可以從關鍵如果事先知道關鍵字集合,並且每個關鍵字的位數比雜湊表的位址碼位數多時,可以從關鍵字中選出分布較均勻的若干位,構成雜湊位址。

例如,有80個記錄,關鍵字為8位十進位制整數d1d2d3…d7d8,如雜湊表長取100,則雜湊表的位址空間為:00~99。

假設經過分析,各關鍵字中 d4和d7的取值分布較均勻,則雜湊函式為:h(key)=h(d1d2d3…d7d8)=d4d7。例如,h(81346532)=43,h(81301367)=06。

相反,假設經過分析,各關鍵字中 d1和d8的取值分布極不均勻, d1 都等於5,d8 都等於2,此時,如果雜湊函式為:h(key)=h(d1d2d3…d7d8)=d1d8,

則所有關鍵字的位址碼都是52,顯然不可取。

當無法確定關鍵字中哪幾位分布較均勻時,可以先求出關鍵字的平方值,然後按需要取平方值的中間幾位作為雜湊位址。

這是因為:平方後中間幾位和關鍵字中每一位都相關,故不同關鍵字會以較高的概率產生不同的雜湊位址。

例:我們把英文本母在字母表中的位置序號作為該英文本母的內部編碼。例如k的內部編碼為11,e的內部編碼為05,y的內部編碼為25,

a的內部編碼為01, b的內部編碼為02。

由此組成關鍵字「keya」的內部**為11052501,同理我們可以得到關鍵字「kyab」、「akey」、「bkey」的內部編碼。

之後對關鍵字進行平方運算後,取出第7到第9位作為該關鍵字雜湊位址,如圖8.23所示。

關鍵字    內部編碼     內部編碼的平方值          h(k)關鍵字的雜湊位址

keya     11050201      122157778355001            778

kyab     11250102      126564795010404            795

akey     01110525      001233265775625            265

bkey     02110525      004454315775625            315

這種方法是按雜湊表位址位數將關鍵字分成位數相等的幾部分(最後一部分可以較短),然後將這幾部分相加,捨棄最高進製後的結果就是該關鍵字的雜湊位址。

具體方法有摺疊法與移位法。移位法是將分割後的每部分低位對齊相加,摺疊法是從一端向另一端沿分割界來回摺疊(奇數段為正序,偶數段為倒序),然後將各段相加。  

例如:key=12360324711202065,雜湊表長度為1000,則應把關鍵字分成4位一段,在此捨去最低的兩位65,分別進行移位疊加和摺疊疊加,求得雜湊位址為105和907 

(a)移位疊加              (b) 摺疊疊加

1   2   3                    1   2   3

6   0   3                    3   0   6

2   4   7                    2   4   7

1   1   2                    2   1   1

0   2   0                    0   2   0

——————               ——————

1   1   0   5                    9   0   7

假設雜湊表長為m,p為小於等於m的最大素數,則雜湊函式為 

h(k)=k  %  p ,其中%為模p取餘運算。

例如,已知待雜湊元素為(18,75,60,43,54,90,46),表長m=10,p=7,則有

h(18)=18 % 7=4    h(75)=75 % 7=5    h(60)=60 % 7=4   

h(43)=43 % 7=1    h(54)=54 % 7=5    h(90)=90 % 7=6   

h(46)=46 % 7=4

此時衝突較多。為減少衝突,可取較大的m值和p值,如m=p=13,結果如下:

h(18)=18 % 13=5    h(75)=75 % 13=10    h(60)=60 % 13=8    

h(43)=43 % 13=4    h(54)=54 % 13=2    h(90)=90 % 13=12   

h(46)=46 % 13=7

基本思想:當關鍵字key的雜湊位址p=h(key)出現衝突時,以p為基礎,產生另乙個雜湊位址p1,如果p1仍然衝突,再以p為基礎,產生另乙個雜湊位址p2,…,                            直到找出乙個不衝突的雜湊位址pi ,將相應元素存入其中。

這種方法有乙個通用的再雜湊函式形式:

hi=(h(key)+di)% m   i=1,2,…,n

其中h(key)為雜湊函式,m 為表長,di稱為增量序列。增量序列的取值方式不同,相應的再雜湊方式也不同。

dii=1,2,3,…,m-1

衝突發生時,順序檢視表中下一單元,直到找出乙個空單元或查遍全表。

di=12,-12,22,-22,…,k2,-k2    ( k<=m/2 )

衝突發生時,在表的左右進行跳躍式探測,比較靈活。

di=偽隨機數序列。

具體實現時,應建立乙個偽隨機數發生器,(如i=(i+p) % m),並給定乙個隨機數做起點。

0     1     2     3     4     5     6     7     8     9     10

47   26   60   69

b): 如果用二次探測再雜湊處理衝突,下乙個雜湊位址為h1=(3 + 12)% 11 = 4,仍然衝突,再找下乙個雜湊位址為h2=(3 - 12)% 11 = 2,此時不再衝突,

將69填入2號單元。

0     1     2     3     4     5     6     7     8     9     10

69   47   26  60      

c): 如果用偽隨機探測再雜湊處理衝突,且偽隨機數序列為:2,5,9,……..,則下乙個雜湊位址為h1=(3 + 2)% 11 = 5,仍然衝突,再找下乙個雜湊位址

為h2=(3 + 5)% 11 = 8,此時不再衝突,將69填入8號單元。

0     1     2     3     4     5     6     7     8     9     10

47   26  60                  69

這種方法是同時構造多個不同的雜湊函式:

hi=rh1(key)  i=1,2,…,k

當雜湊位址hi=rh1(key)發生衝突時,再計算hi=rh2(key)……,直到衝突不再產生。這種方法不易產生聚集,但增加了計算時間。

基本思想: 將所有雜湊位址為i的元素構成乙個稱為同義詞鏈的單鏈表,並將單鏈表的頭指標存在雜湊表的第i個單元中,因而查詢、插入和刪除主要

在同義詞鏈中進行。鏈位址法適用於經常進行插入和刪除的情況。

例如:  已知一組關鍵字(32,40,36,53,16,46,71,27,42,24,49,64),雜湊表長度為13,雜湊函式為:h(key)= key % 13,

位置    entry 

01  -->  40 --> 27 --> 53

23  -->  16 --> 4245

6  -->  32 --> 7178

910 -->  36 --> 49

11 -->  24

12 -->  64

本例的平均查詢長度 asl=(1*7+2*4+3*1)/13=1.38

這種方法的基本思想是:將雜湊表分為基本表和溢位錶兩部分,凡是和基本表發生衝突的元素,一律填入溢位表

雜湊表 基本概念

雜湊表,又稱為雜湊表,是一種根據鍵來直接訪問記憶體位置的一種資料結構。它通過乙個計算鍵值的函式 雜湊函式 來將所查詢的資料對映到雜湊表中的乙個位置來查詢該位置的內容,從而達到快速查詢的目的。存放記錄的陣列就稱為雜湊表 若關鍵字為k,則其值就存放在f k 對應的位置上,這樣可以實現不用比較就可以直接找...

雜湊表基本概念介紹及雜湊衝突的處理方法 附原始碼

處理衝突的方法 實現 雜湊表 雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊 雜湊 函式,存放記錄的陣列叫做雜湊 雜湊 表。給定表m,存在函式f key 對任意給定的關鍵字值key,...

雜湊表基本概念介紹及雜湊衝突的處理方法 附原始碼

目錄處理衝突的方法 實現 雜湊表 雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊 雜湊 函式,存放記錄的陣列叫做雜湊 雜湊 表。給定表m,存在函式f key 對任意給定的關鍵字值ke...