1. 程式人生 > >演算法導論11.4開放定址法 練習總結

演算法導論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