演算法導論11.4開放定址法 練習總結
11.4-1 考慮將關鍵字 10、22、31、4、15、28、17、88、59用開放定址法插入到一個長度為 m = 11 的散列表中,輔助雜湊函式為 h'( k ) = k mod m。試說明分別用線性探查,二次探查(c1 = 1,c2 = 3) 和雙重雜湊h2( k ) = 1 + ( k mod (m-1))將這些關鍵字插入散列表的過程。
ANSWER:
序號 | 線性探查 | 二次探查 | 雙重雜湊 |
0 | 22 | 22 | 22 |
1 | 88 | ||
2 | 88 | 59 | |
3 | 17 | 17 | |
4 | 4 | 4 | 4 |
5 | 15 | 15 | |
6 | 59 | 28 | 28 |
7 | 28 | 59 | 88 |
8 | 15 | ||
9 | 31 | 31 | 31 |
10 | 10 | 10 | 10 |
11.4-2 試寫出 HASH-DELETE 的虛擬碼;修改 HASH-INSERT,使之能處理特殊值DELETED。
ANSWER:
虛擬碼:
HASH-DELETE(T, k):
i = 0
while i < m:
j = h(k, i)
if T[j] == k:
T[j] == -∞
return T
else if T[j] == NIL:
break
else:
i = i + 1
error "k is not in T"
虛擬碼: HASH-INSERT(T, k): i = 0 while i < m: j = h(k, i) if T[j] == NIL or T[j] == -∞: T[j] == k return j else: i = i + 1 error " hash table overflow"
11.4-3
考慮一個採用均勻雜湊的開放定址散列表。當裝載因子為 3/4 和 7/8 時,試分別給出依次不成功查詢和一次成功查詢的探查期望數的上界。
ANSWER:
不成功探查 | 成功探查 | |
a = 3/4 | 4 | 4/3*ln4 |
a = 7/8 | 8 | 8/7*ln8 |
*11.4-4
假設採用雙重雜湊來解決衝突;即所用的雜湊函式為 h(k, i) = ( h1( k ) + h2( k ) ) mod m。試證明:如果對某個關鍵字k,m 和 h2( k ) 有最大公約數 d ≥ 1,則在對關鍵字k的一次不成功的查詢中,在回到槽h1(k)之前,要檢查散列表中第(m/d)個元素。於是,當d = 1時,m與h2(k)互質,查詢操作可能要檢查整個散列表。(提示:見第31章)
ANSWER:
對於兩個互素的數a,b,即gcm(a, b) = 1,有 a*x ≡ a*(by + x) mod b,其中x = 0,1 ... b-1。
例:4和5互素,gcm(4, 5) = 1
4*0 mod 5 = 0
4*1 mod 5 = 4
4*2 mod 5 = 3
4*3 mod 5 = 2
4*4 mod 5 = 1
4*5 mod 5 = 0
∴若gcm(h2(k), m) = d,則gcm(h2(k)/d, m/d) = 1,則h2( k ) mod m 迴圈一次需要經過( m/d )個數。
∴當d = 1時,迴圈一次需要 m 個數,即雙重散列表查詢需要檢查整個散列表。
*11.4-5
考慮一個裝載因子為 a 的開放定址散列表。找出一個非零的值a,使得在一次不成功的查詢中,期望的探查數等於成功查詢中期望探查數的 2 倍。這兩個探查期望數可以使用定理 11.6 和定理 11.8 中給定的上界。
ANSWER: 2/a*ln( 1 / (1-a) ) = a / (1-a), 解得 a ≈ 0.717