[資料結構]散列表-連結法和開放定址法 線性探查
在介紹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、由於連結法中各連結串列上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況。
開放定址法不用指標,潛在地節約了空間,用這些空間可存放更多的槽,從而潛在地減少了衝突,提升了速度。