1. 程式人生 > >[資料結構]散列表-連結法和開放定址法 線性探查

[資料結構]散列表-連結法和開放定址法 線性探查

在介紹hash表之前首先提到直接定址表


但是由於實際上儲存在字典裡的關鍵字集合K比實際上所有可能的關鍵字的全域U要小的多,因此散列表所需要的儲存空間比直接定址表要小的多

 通過雜湊函式

h:U -> {0,1,2…m-1}

其中m 遠小於|U|


但是對於h(2)=h(5)這樣的訪問衝突,我們採用兩種方法來解決

①  連結法

②  開放定址法

連結法,插入最壞執行時間O(1),查詢最壞執行時間和表的長度成正比。

 

開放定址法,所有的元素都儲存在散列表中,要系統的檢查所有的表項,直到找到所需的元素,或者所需的不在表中。用開放定址法來插入元素,需要進行探查,直到找到空的槽來存放關鍵字為止。典型的探查方法有線性探查

下面介紹一個線性探查的例子:(本位置X被佔據,繼續尋找下一個x+1的位置,直到找到空槽為止)
設散列表的長度為11,雜湊函式H(k)=(k的第一個字母在字母表中的序號)mod11, 若輸入的順序為(D,BA,TN,M,CI,I,K,X,TA)採用內散列表,處理衝突方法為線性探查法,按要求構造雜湊表,在等概率的情況下,查詢成功的平均查詢長度為?

D: 4%11=4   1次

BA:2%11=2   1次

TN:20%11=9   1次

M:13%11=2 已被佔據,放在3;                2次

CI:3%11=3 已被佔據,放在4;4已被佔據放在5   3次

I:9%11=9 已被佔據,放在10                    2次

K:11%11=0                                    1次

X:24%11=2 已被佔據放在3 已被佔據放在4 已被佔據放在5 已被佔據放在6   5次

TA:20%11=9 已被佔據放在10 已被佔據放在0 已被佔據放在1               4次

所以平均查詢長度為(1+1+1+2+3+2+1+5+4)/9 = 20/9

總結:

採用開放定址法處理散列表的衝突時,其平均查詢長度高於連結法處理衝突

連結法其中優點有:
1
、連結法處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短
2
、由於連結法中各連結串列上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況。

開放定址法不用指標,潛在地節約了空間,用這些空間可存放更多的槽,從而潛在地減少了衝突,提升了速度。