雜湊表上的運算
雜湊表上的運算有查詢、插入和刪除。其中主要是查詢,這是因為雜湊表的目的主要是用於快速查詢,且插入和刪除均要用到查詢操作。
1、雜湊表型別說明:
#define nil -1 //空結點標記依賴於關鍵字型別,本節假定關鍵字均為非負整數
#define m 997 //表長度依賴於應用,但一般應根據。確定m為一素數
typedef structnodetype;
typedef nodetype hashtable[m]; //雜湊表型別
2、基於開放位址法的查詢演算法
雜湊表的查詢過程和建表過程相似。假設給定的值為k,根據建表時設定的雜湊函式h,計算出雜湊位址h(k),若表中該位址單元為空,則查詢失敗;否則將 該位址中的結點與給定值k比較。若相等則查詢成功,否則按建表時設定的處理衝突的方法找下乙個位址。如此反覆下去,直到某個位址單元為空(查詢失敗)或者 關鍵字比較相等(查詢成功)為止。
(1)開放位址法一般形式的函式表示
int hash(keytype k,int i)
若雜湊函式用除餘法構造,並假設使用線性探查的開放定址法處理衝突,則上述函式中的h(k)和increment(i)可定義為:
int h(keytype k)
int increment(int i)
(2)通用的開放定址法的雜湊表查詢演算法:
int hashsearch(hashtable t,keytype k,int *pos)
while(++ireturn -1; //表滿且未找到時,查詢失敗
} //hashsearch
注意:上述演算法適用於任何開放定址法,只要給出函式hash中的雜湊函式h(k)和增量函式increment(i)即可。但要提高查詢效率時,可將確定的雜湊函式和求增量的方法直接寫入演算法hashsearch中,相應的演算法【參見習題】。
3、基於開放位址法的插入及建表
建表時首先要將表中各結點的關鍵字清空,使其位址為開放的;然後呼叫插入演算法將給定的關鍵字序列依次插入表中。
插入演算法首先呼叫查詢演算法,若在表中找到待插入的關鍵字或表已滿,則插入失敗;若在表中找到乙個開放位址,則將待插入的結點插入其中,即插入成功。
void hashlnsert(hashtable t,nodetypene w)
//hashlnsert
void createhashtable(hashtable t,nodetype a,int n)
//createhashtable
4、刪除
基於開放定址法的雜湊表不宜執行雜湊表的刪除操作。若必須在雜湊表中刪除結點,則不能將被刪結點的關鍵字置為nil,而應該將其置為特定的標記deleted。
因此須對查詢操作做相應的修改,使之探查到此標記時繼續探查下去。同時也要修改插人操作,使其探查到deleted標記時,將相應的表單元視為乙個空單元,將新結點插入其中。這樣做無疑增加了時間開銷,並且查詢時間不再依賴於裝填因子。
因此,當必須對雜湊表做刪除結點的操作時,一般是用拉鍊法來解決衝突。
注意:用拉鍊法處理衝突時的有關雜湊表上的演算法【參見練習】。
5、效能分析
插入和刪除的時間均取決於查詢,故下面只分析查詢操作的時間效能。
雖然雜湊表在關鍵字和儲存位置之間建立了對應關係,理想情況是無須關鍵字的比較就可找到待查關鍵字。但是由於衝突的存在,雜湊表的查詢過程仍是乙個和關鍵字比較的過程,不過雜湊表的平均查詢長度比順序查詢、二分查詢等完全依賴於關鍵字比較的查詢要小得多。
(1)查詢成功的asl
雜湊表上的查詢優於順序查詢和二分查詢。
【例】在例9.1和例9.2的雜湊表中,在結點的查詢概率相等的假設下,線性探查法和拉鍊法查詢成功的平均查詢長度分別為:
asl=(1×6+2×2+3×l+9×1)/10=2.2 //線性探查法
asl=(1×7+2×2+3×1)/10=1.4 //拉鍊法
而當n=10時,順序查詢和二分查詢的平均查詢長度(成功時)分別為:
asl=(10+1)/2=5.5 //順序查詢
asl=(1×l+2×2+3×4+4×3)/10=2.9 //二分查詢,可由判定樹求出該值
(2) 查詢不成功的asl
對於不成功的查詢,順序查詢和二分查詢所需進行的關鍵字比較次數僅取決於表長,而雜湊查詢所需進行的關鍵字比較次數和待查結點有關。因此,在等概率情況下,也可將雜湊表在查詢不成功時的平均查詢長度,定義為查詢不成功時對關鍵字需要執行的平均比較次數。
【例】例9.1和例9.2的雜湊表中,在等概率情況下,查詢不成功時的線性探查法和拉鍊法的平均查詢長度分別為:
aslunsucc=(9+8+7+6+5+4+3+2+1+1+2+1+10)/13=59/13≈4.54
aslunsucc=(1+0+2+1+0+1+1+0+0+0+1+0+3)/13≈10/13≈0.77
注意:①由同乙個雜湊函式、不同的解決衝突方法構造的雜湊表,其平均查詢長度是不相同的。
②雜湊表的平均查詢長度不是結點個數n的函式,而是裝填因子α的函式。因此在設計雜湊表時可選擇α以控制雜湊表的平均查詢長度。
③ α的取值
α越小,產生衝突的機會就小,但α過小,空間的浪費就過多。只要α選擇合適,雜湊表上的平均查詢長度就是乙個常數,即雜湊表上查詢的平均時間為o(1)。
④ 雜湊法與其他查詢方法的區別
除雜湊法外,其他查詢方法有共同特徵為:均是建立在比較關鍵字的基礎上。其中順序查詢是對無序集合的查詢,每次關鍵字的比較結果為"="或"!="兩種可 能,其平均時間為o(n);其餘的查詢均是對有序集合的查詢,每次關鍵字的比較有"="、"<"和">"三種可能,且每次比較後均能縮小下次 的查詢範圍,故查詢速度更快,其平均時間為o(lgn)。而雜湊法是根據關鍵字直接求出位址的查詢方法,其查詢的期望時間為o(1)。
雜湊表 雜湊表
一 定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。雜湊表的做法其實很簡單,就是把key通過乙個固定的演算法函式...
雜湊表(雜湊表)
雜湊表是最基礎的資料結構之一,利用鍵值對儲存並檢索資料的一種非線性結構。在其它各種結構線性表 樹等資料結構中,記錄在結構中的位置是隨機的,和記錄關鍵字之間不存在確定的關係,因此,在結構中查詢記錄時需進行一系列和關鍵字的 比較 的基礎上。在順序查詢時,比較的結果為 與 兩種可能 在折半查詢 二叉排序樹...
雜湊表(雜湊表)
原文 雜湊表是種資料結構,它可以提供快速的插入操作和查詢操作。第一次接觸雜湊表時,它的優點多得讓人難以置信。不論雜湊表中有多少資料,插入和刪除 有時包括側除 只需要接近常量的時間即0 1 的時間級。實際上,這只需要幾條機器指令。對雜湊表的使用者一一人來說,這是一瞬間的事。雜湊表運算得非常快,在電腦程...