雜湊法又稱雜湊法、雜湊法以及關鍵字位址計算法等,相應的表稱為雜湊表。這種方法的基本思想是:首先在元素的關鍵字k和元素的儲存位置p之間建立乙個對應關係f,使得p=f(k),f稱為雜湊函式。建立雜湊表時,把關鍵字為k的元素直接存入位址為f(k)的單元;以後當查詢關鍵字為k的元素時,再利用雜湊函式計算出該元素的儲存位置p=f(k),從而達到按關鍵字直接訪問元素的目的。
構造雜湊函式的原則是:①函式本身便於計算;②計算出來的位址分布均勻,即對任一關鍵字k,f(k) 對應不同位址的概率相等,目的是盡可能減少衝突。
在實際應用中,應根據具體情況,靈活採用不同的方法,並用實際資料測試它的效能,以便做出正確判定。通常應考慮以下五個因素 :
l 計算雜湊函式所需時間
l 關鍵字的長度。
l 雜湊表大小。
l 關鍵字分布情況。
l 記錄查詢頻率
取關鍵字或關鍵字的某個線性函式值為雜湊位址。即h(key)=key或h(key) = a·key + b,其中a和b為常數(這種雜湊函式叫做自身函式)。若其中h(key)中已經有值了,就往下乙個找,直到h(key)中沒有值了,就放進去。
如果事先知道關鍵字集合,並且每個關鍵字的位數比雜湊表的位址碼位數多時,可以從關鍵字中選出分布較均勻的若干位,構成雜湊位址。
例如,有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位作為該關鍵字雜湊位址,如下圖所示。
將關鍵字分割成位數相同的幾部分,最後一部分位數可以不同,然後取這幾部分的疊加和(去除進製)作為雜湊位址。數字疊加可以有移位疊加和間界疊加兩種方法。移位疊加是將分割後的每一部分的最低位對齊,然後相加;間界疊加是從一端向另一端沿分割界來回摺疊,然後對齊相加。
假設雜湊表長為m,p為小於等於m的最大素數,則雜湊函式為
h(k)=k % p ,其中%為模p取餘運算。
採用乙個偽隨機函式做雜湊函式,即h(key)=random(key)。
當關鍵字集合很大時,關鍵字值不同的元素可能會映象到雜湊表的同一位址上,即 k1≠k2 ,但 h(k1)=h(k2),這種現象稱為衝突,此時稱k1和k2為同義詞。實際中,衝突是不可避免的,只能通過改進雜湊函式的效能來減少衝突。
通過構造效能良好的雜湊函式,可以減少衝突,但一般不可能完全避免衝突,因此解決衝突是雜湊法的另乙個關鍵問題。建立雜湊表和查詢雜湊表都會遇到衝突,兩種情況下解決衝突的方法應該一致。下面以建立雜湊表為例,說明解決衝突的方法。常用的解決衝突方法有以下四種:
其基本思想是:當關鍵字key的雜湊位址p=h(key)出現衝突時,以p為基礎,產生另乙個雜湊位址p1,如果p1仍然衝突,再以p為基礎,產生另乙個雜湊位址p2,…,直到找出乙個不衝突的雜湊位址pi 。這種方法有乙個通用的再雜湊函式形式:
hi=(h(key)+di)% m i=1,2,…,n
其中h(key)為雜湊函式,m為表長,di稱為增量序列。增量序列的取值方式不同,相應的再雜湊方式也不同。主要有以下三種:
<1> 線性探測再雜湊
① 只要雜湊表不滿,就一定能找到乙個不衝突的雜湊位址,而二次探測再雜湊和偽隨機探測再雜湊則不一定。
②思路清晰,演算法簡單
線性探測再雜湊的缺點是:
① 處理溢位需另程式設計序。一般可另外設立乙個溢位表,專門用來存放上述雜湊表中放不下的記錄。此溢位表最簡單的結構是順序表,查詢方法可用順序查詢。
② 按上述演算法建立起來的雜湊表,刪除工作非常困難。假如要從雜湊表 ht 中刪除乙個記錄,按理應將這個記錄所在位置置為空,但我們不能這樣做,而只能標上已被刪除的標記,否則,將會影響以後的查詢。
③ 線性探測法很容易產生堆聚現象。所謂堆聚現象,就是存入雜湊表的記錄在表中連成一片。按照線性探測法處理衝突,如果生成雜湊位址的連續序列愈長 ( 即不同關鍵字值的雜湊位址相鄰在一起愈長 ) ,則當新的記錄加入該錶時,與這個序列發生衝突的可能性愈大。因此,雜湊位址的較長連續序列比較短連續序列生長得快,這就意味著,一旦出現堆聚 ( 伴隨著衝突 ) ,就將引起進一步的堆聚。
<2> 二次探測再雜湊
衝突發生時,在表的左右進行跳躍式探測,比較靈活。
di = 1^2, -1^2, 2^2, -2^2, 3^2,…,±(k)^2,(k<=m/2)
<3> 偽隨機探測再雜湊
具體實現時,應建立乙個偽隨機數發生器,(如i=(i+p) % m),並給定乙個隨機數做起點。
di=偽隨機數序列。
舉例來說:
已知雜湊表長度m=11,雜湊函式為:h(key)= key % 11,則h(47)=3,h(26)=4,h(60)=5,假設下乙個關鍵字為69,則h(69)=3,與47衝突。
①如果用線性探測再雜湊處理衝突,下乙個雜湊位址為h1=(3 + 1)% 11 = 4,仍然衝突,再找下乙個雜湊位址為h2=(3 + 2)% 11 = 5,還是衝突,繼續找下乙個雜湊位址為h3=(3 + 3)% 11 = 6,此時不再衝突,將69填入5號單元。
②如果用二次探測再雜湊處理衝突,下乙個雜湊位址為h1=(3 + 1^2)% 11 = 4,仍然衝突,再找下乙個雜湊位址為h2=(3 - 1^2)% 11 = 2,此時不再衝突,將69填入2號單元。
③如果用偽隨機探測再雜湊處理衝突,且偽隨機數序列為:2,5,9,……..,則下乙個雜湊位址為h1=(3 + 2)% 11 = 5,仍然衝突,再找下乙個雜湊位址為h2=(3 + 5)% 11 = 8,此時不再衝突,將69填入8號單元。
這種方法是同時構造多個不同的雜湊函式:
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,則用鏈位址法處理衝突的結果如圖所示:
本例的平均查詢長度 asl=(1*7+2*4+3*1)=1.5
與開放定址法相比,拉鍊法有如下幾個優點:
①拉鍊法處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;
②由於拉鍊法中各煉表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;
③開放定址法為減少衝突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鍊法中可取α≥1,且結點較大時,拉鍊法中增加的指標域可忽略不計,因此節省空間;
④在用拉鍊法構造的雜湊表中,刪除結點的操作易於實現。只要簡單地刪去鍊錶上相應的結點即可。而對開放位址法構造的雜湊表,刪除結點不能簡單地將被刪結 點的空間置為空,否則將截斷在它之後填人雜湊表的同義詞結點的查詢路徑。這是因為各種開放位址法中,空位址單元(即開放位址)都是查詢失敗的條件。因此在 用開放位址法處理衝突的雜湊表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點。
拉鍊法的缺點是:
指標需要額外的空間,故當結點規模較小時,開放定址法較為節省空間,而若將節省的指標空間用來擴大雜湊表的規模,可使裝填因子變小,這又減少了開放定址法中的衝突,從而提高平均查詢速度。
這種方法的基本思想是:將雜湊表分為基本表和溢位錶兩部分,凡是和基本表發生衝突的元素,一律填入溢位表。
雜湊表處理衝突的方法
fi key f key di mod m di 1,2,3,4,m 1 會出現不是同義詞卻需要爭奪乙個位址的情況,我們稱這種情況為堆積。關鍵字集合 12,67,56,16,25,37,22,29,15,47,48,34 下標0 1234 5678 91011關鍵字 1225 3715 1629 4...
雜湊表(雜湊表)及雜湊表處理衝突的方法
前面介紹了靜態查詢表以及動態查詢表中的一些查詢方法,其查詢的過程都無法避免同查詢表中的資料進行比較,查詢演算法的效率很大程度取決於同表中資料的查詢次數。而本節所介紹的雜湊表可以通過關鍵字直接找到資料的儲存位置,不需要進行任何的比較,其查詢的效率相較於前面所介紹的查詢演算法是更高的。在初中的數學課本中...
雜湊表及處理衝突的方法
雜湊法又稱 雜湊法 雜湊法以及關鍵字位址計算法 等,相應的表稱為 雜湊表。這種方法的基本思想是 首先在元素的關鍵字 k 和元素的儲存位置 p 之間建立乙個對應關係 f 使得 p f k f 稱為雜湊函式 建立雜湊表時,把關鍵字為 k 的元素 直接存入位址為 f k 的單元 以後當查詢關鍵字為 k 的...