雜湊法又稱雜湊法、雜湊法以及關鍵字位址計算法等,相應的表成為雜湊表。基本思想:首先在元素的關鍵字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=偽隨機數序列。0 1 2 3 4 5 6 7 8 9 10具體實現時,應建立乙個偽隨機數發生器,(如i=(i+p) % m),並給定乙個隨機數做起點。
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...