雜湊表 開放位址法

2021-05-23 07:56:08 字數 2294 閱讀 9827

雜湊表的查詢過程和建表過程相似。假設給定的值為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(++i注意:

上述演算法適用於任何開放定址法,只要給出函式hash中的雜湊函式h(k)和增量函式increment(i)即可。但要提高查詢效率時,可將確定的雜湊函式和求增量的方法直接寫入演算法hashsearch中,相應的演算法【參見習題】。

3、基於開放位址法的插入及建表

建表時首先要將表中各結點的關鍵字清空,使其位址為開放的;然後呼叫插入演算法將給定的關鍵字序列依次插入表中。

插入演算法首先呼叫查詢演算法,若在表中找到待插入的關鍵字或表已滿,則插入失敗;若在表中找到乙個開放位址,則將待插入的結點插入其中,即插入成功。

void hashlnsert(hashtable t,nodetypene w)

//hashlnsert

void createhashtable(hashtable t,nodetype a,int n)

{ //根據a[0..n-1]中結點建立雜湊表t[0..m-1]

int i

if(n>m) //用開放定址法處理衝突時,裝填因子α須不大於1

error("load factor>1");

for(i=0;i5、效能分析

插入和刪除的時間均取決於查詢,故下面只分析查詢操作的時間效能。

雖然雜湊表在關鍵字和儲存位置之間建立了對應關係,理想情況是無須關鍵字的比較就可找到待查關鍵字。但是由於衝突的存在,雜湊表的查詢過程仍是乙個和關鍵字比較的過程,不過雜湊表的平均查詢長度比順序查詢、二分查詢等完全依賴於關鍵字比較的查詢要小得多。

(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)。

雜湊表 開放位址法之線性探測

雜湊表 優點 速度快 插入和查詢 缺點 基於陣列,不能有序的遍歷 鍵值對儲存方式,通過鍵來訪問值 hashmap.put key value 線性探測屬於開放位址法 線性探測插入演示 陣列最初狀態 在這組資料中要插入83 先對要插入資料雜湊化,雜湊化後的資料就是陣列下標,這裡雜湊化後的資料是23 然...

C語言實現雜湊表(開放位址法)

筆者最近學習資料結構中的雜湊表,並用c語言簡單實現了。此部落格旨在交流心得。這篇部落格介紹的是開放位址法構造的雜湊表 如果要參考拉鍊法構造的雜湊表,請參考這篇文章 c語言實現雜湊表 拉鍊法 結構體說明 typedef struct element element 其中data域可以改為自定義的結構體...

雜湊表 開放位址法(二次探測以及在雜湊法)

首先你要知道什麼二次探測,在雜湊法都是用來解決雜湊衝突的。在雜湊法,就是有兩個雜湊方法,第乙個雜湊化方法,確定初始位置,衝突就執行第二個雜湊化方法。注意 在雜湊法第二個雜湊化函式的要求 1.第二個雜湊化函式不能和第乙個一樣 2.不能輸出0 舉個例子 第二個方法可以設計成這樣 第二個雜湊函式 計算下標...