演算法導論11 4開放定址法 練習總結

2021-07-05 10:06:05 字數 2529 閱讀 1436

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 的雜湊表。查詢時,如...