1. 程式人生 > >演算法設計與分析基礎 第七章謎題

演算法設計與分析基礎 第七章謎題

習題7.1

6. 祖先問題要求在一棵給定的n頂點二叉樹中,確定一個頂點u是否是頂點v的祖先。設計一個屬於O(n)的輸入增強演算法,使我們可以在常量時間內獲得樹的每一對頂點的足夠資訊,來對問題求解。

分析:一個頂點u是頂點v的祖先,當前僅當先序遍歷u在v的前面,並且後序遍歷u在v的後面。第一個條件,先序遍歷u在v的前面,代表要麼u是v的祖先,要麼u在公共祖先的左子樹中而v在公共祖先的右子樹中;第二個條件,後序遍歷u在v的後面,代表要麼u是v的祖先,要麼u在公共祖先的右子樹中而v在公共祖先的左子樹中。綜合兩個條件,我們可以知道確定一個頂點u是否是頂點v的祖先,其充分必要條件是先序遍歷u在v的前面,並且後序遍歷u在v的後面。

解答:在O(n)時間對二叉樹進行先序遍歷和後序遍歷,在常量時間內對需要比較的兩個節點在先序和後序中比較次序,確定頂點u是否是頂點v的祖先。

 

8.最小距離排序 在美術館大廳,有10個古埃及石像放置成一排。新的館長希望移動它們按照高度大小順序放置,要怎樣移動才能使所有石像的移動總和最小呢?為了簡化問題,假設石像的高度都不相同。

解答:通過比較計數排序計算每個雕像的位置,也就是算出比該雕像高度更低的雕像數目為Count陣列,然後根據計數來移動雕像位置。掃描Count陣列,找到第一個不在正確位置的雕像,即Count[i]≠i,將該雕像從當前位置移動到正確的位置Count[i],然後再把Count[i]位置的雕像移動到Count[Count[i]]位置上,以此類推,直到有雕像移動到了i位置,則完成了一輪移動。此時若還有雕像不在正確位置上,則繼續執行上述步驟,直到所有的雕像都在正確位置上。由於每個雕像都直接移動到最終位置,因此該演算法顯然最小化了雕像移動的總距離

 

習題7.2

2. 考慮使用Horspool演算法在DNA序列中查詢基因的問題。一個DNA序列是由來自字母表{A,C,G,T}的文字表示的,而基因或者基因片段就是模式。

a.為第10對染色體中的下列基因片段構造一個移動表:

TCCTATTCTT

解答:

字元

A

C

T

其他字元

移動距離tc

5

2

1

10

 

b.用Horspool演算法,在下列DNA序列中為上面這個模式定位:

TTATAGATCTCGTATTCTTTTATAGATCTCCTATTCTT

解答:

T T A T A G A T C T C G T A T T C T T T T A T A G A T C T C C T A T T C T T

T C C T A T T C T T   T C C T A T T C T T

  T C C T A T T C T T   T C C T A T T C T T

      T C C T A T T C T T        T C C T A T T C T T

        T C C T A T T C T T        T C C T A T T C T T

                 T C C T A T T C T T   T C C T A T T C T T

                   T C C T A T T C T T     T C C T A T T C T T

                                           T C C T A T T C T T

                                                  T C C T A T T C T T

 

11.給定兩個長度都為n的字串S和T,需要確定其中一個字串是否為另一個字串迴圈右移之後的結果。例如,PLEA是由LEAP迴圈右移一位產生的字串,反之亦然。

a. 設計一個空間效率較高的演算法解決該問題,並說明演算法的空間和時間效率型別。

解答

Algorithm RightCyclicShift(S[0..n - 1], T [0..n - 1])

//Checks by brute force whether string T is a right cyclic shift of string S

//Input: Strings S[0..n - 1] and T [0..n - 1]

//Output: Returns true if T is a right cyclic shift of S and false otherwise

for i ← 0 to n - 1 do        //try cyclic shift i positions to the right

       k←0               //number of matched characters

       while k ≤ n− 1 and S[(i + k) mod n] = T [k] do

                 k← k + 1

                 if k = n return true

        return false

該演算法空間複雜度O(1),時間複雜度O(n^2)

 

b. 設計一個時間效率較高的演算法解決該問題,並說明演算法的空間和時間效率型別。

解答:將S的前n-1個字元複製新增到S的末尾形成一個新的字串,然後用Boyer-Moore演算法搜尋該字串是否包含字串T。該演算法的時間複雜度(包含末尾新增字元和搜尋字串)為θ(n),空間複雜度(包含字尾和移動表)為θ(n)+θ(m),m為搜尋字串中的字元數。

 

習題7.3

5.生日悖論 生日悖論問的是,當一個房間裡有多少人時,其中兩個人的生日(月和日)相同的概率大於1/2?這個問題的答案十分出人意料,請試著求解。對於雜湊來說這個結論意味著什麼?

解答:  ,解得n=23。這個結論意味著,即使雜湊表的大小比鍵的數量大得多(大於10倍),我們也不能忽略衝突。

 

習題7.4

6. a.自頂向下2-3-4樹是一棵次數為4的B樹,並對B數的插入操作做如下改動:一旦為一個新建的查詢葉子節點時遇到的一個滿節點(也就是一個包含3個鍵的節點),就把該節點分裂為兩個節點,並把它們的中間鍵交給原來節點的父母(如果滿節點恰好是根,就為中間鍵創造一個新的根)。向一棵空樹連續插入下面這個鍵的列表,來構造一棵自頂向下的2-3-4樹。

a. 10,6,15,31,20,27,50,44,18

解答

b. 和2-3樹的插入過程比起來,這個插入過程的主要優點是什麼?主要缺點又是什麼?

解答:優點是一個滿節點的分裂不會導致該節點的祖先鏈路上的連鎖分裂;缺點是我們可能會得到一棵過高的樹。