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:
序號線性探查二次探查雙重雜湊
0222222
188
2
8859
3
1717
4444
515
15
6592828
7285988
8
15
9313131
10101010
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
44/3*ln4
a = 7/8
88/7*ln8
*
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
CLRS 11 4開放定址法
11.4 1 只給出結果,如下 由定理11.6和11.8可得一次不成功查詢和一次成功查詢探查的期望上界分別是 1 1 1 ln11 帶入 得 3 4 時不成功查詢 成功查詢上界分別是 4,1.85 7 8 時不成功查詢 成功查詢上界分別是 8,2.38 11.4 4 在返回 h1 k 之前要檢查雜湊...
演算法 開放定址法
package com.eshore.sweetop.dataframe import com.eshore.sweetop.data.keydata 開放定址法解決碰撞問題 public class openhash public void insert keydata kd throw new ...
演算法 開放定址法解決雜湊衝突方式
開放定址法 又稱開放定址法,當雜湊衝突發生時,從發生衝突的那個單元起,按照一定的次序,從雜湊表中尋找乙個空閒的單元,然後把發生衝突的元素存入到該單元。這個空閒單元又稱為開放單元或者空白單元。開放定址法需要的表長度要大於等於所需要存放的元素數量,非常適用於裝載因子較小 小於0.5 的雜湊表。查詢時,如...