首先通過一道例題來引出這篇部落格的主旨:
h(key)=key%7
求得雜湊位址(存在位址衝突)
線性探測再雜湊
當位址衝突時,每次位址+1 [2,3…] 直到找到空位
查詢長度
38%7=3
a[3]=38
125%7=4
a[4]=25
174%7=4
a[4]=74 –> a[5]=74
263%7=0
a[0]=63
152%7=3
a[3]=52 –> a[4]=52 –> a[5]=52 –> a[6]=52
448%7=6
a[6]=48 –> a[0]=48 –> a[1]=483
總的平均查詢長度
=每個元素的查詢長度之和
/總的元素個數
,即:(1+1+2+1+4+3)/6=2
處理衝突的方法
1. 開放定址法
h[i]=(h(key)+d[i]) mod m
其中h(key)為雜湊函式;m為雜湊表表長;d[i]為增量序列,下面的三種取法對應著三種探測型別:
(1)線性探測再雜湊:d[i]=1,2,3,…,m-1
(2)二次探測再雜湊:d[i]=1²,-1²,2²,-2²,3²,…,±k²
(3)隨機探測再雜湊:d[i]=偽隨機數序列
總結:用線性探測再雜湊可以保證做到:只要雜湊表未填滿,總能找到乙個不發生衝突的位址h[k],而二次探測再雜湊只有在雜湊表長m為形如4j+3(j為整數)
的素數時才可能,隨機探測再雜湊,則取決於偽隨機數列。
2. 再雜湊法
在同義詞(計算的hash值相同的記錄)產生位址衝突時計算另乙個雜湊函式位址,直到衝突不再發生。這種方法不易產生」聚集」,但增加了計算的時間。
3. 鏈位址法
將所有關鍵字為同義詞的記錄儲存在同一線性表中。在鍊錶中的插入位置可以在表頭或表尾;也可以在中間,以保持同義詞在同一線性表中按關鍵字有序
例:已知一組關鍵字為(19,14,23,01,68,20,84,27,55,11,10,79) 則按雜湊函式h(key)=key mod 13
和鏈位址法處理衝突構造所得的雜湊表如下: 鍊錶
鏈位址法01
–> [01] –> [14] –> [27] –> [79]23
–> [55] –> [68]45
6–> [19] –> [84]
7–> [20]89
10–> [10] –> [23]
11–> [11]12
查詢成功時,01,55,19,20,10,11需要一次;14,68,84,23需要兩次;27需要三次;79需要四次。
平均成功查詢長度為:(6*1+4*2+1*3+1*4)/12=21/12
4. 建立乙個公共溢位區
所有關鍵字和基本表中關鍵字為同義詞的記錄,不管它們右雜湊函式得到的雜湊位址是什麼,一旦發生衝突,都填入溢位表。
雜湊表(雜湊表)及雜湊表處理衝突的方法
前面介紹了靜態查詢表以及動態查詢表中的一些查詢方法,其查詢的過程都無法避免同查詢表中的資料進行比較,查詢演算法的效率很大程度取決於同表中資料的查詢次數。而本節所介紹的雜湊表可以通過關鍵字直接找到資料的儲存位置,不需要進行任何的比較,其查詢的效率相較於前面所介紹的查詢演算法是更高的。在初中的數學課本中...
雜湊表及處理衝突的方法
雜湊法又稱 雜湊法 雜湊法以及關鍵字位址計算法 等,相應的表稱為 雜湊表。這種方法的基本思想是 首先在元素的關鍵字 k 和元素的儲存位置 p 之間建立乙個對應關係 f 使得 p f k f 稱為雜湊函式 建立雜湊表時,把關鍵字為 k 的元素 直接存入位址為 f k 的單元 以後當查詢關鍵字為 k 的...
雜湊表and處理衝突的方法
雜湊法又稱雜湊法 雜湊法以及關鍵字位址計算法等,相應的表稱為雜湊表。這種方法的基本思想是 首先在元素的關鍵字k和元素的儲存位置p之間建立乙個對應關係f,使得p f k f稱為雜湊函式。建立雜湊表時,把關鍵字為k的元素直接存入位址為f k 的單元 以後當查詢關鍵字為k的元素時,再利用雜湊函式計算出該元...