1. 程式人生 > >演算法導論 第四章:遞迴式 筆記(代換法、遞迴樹方法、主方法、主定理的證明)

演算法導論 第四章:遞迴式 筆記(代換法、遞迴樹方法、主方法、主定理的證明)

三種解遞迴式的方法:代換法、遞迴樹方法、主方法。

代換法:

用代換法解遞迴式需要兩個步驟:

猜測解的形式;

用數學歸納法找出使解真正有效的常數。

如:

T(n) = 2T(n/2) + n,這個是合併排序的執行時間的遞迴表示式。歸併排序法的執行時間是O(nlgn),那麼我們就猜是O(nlgn)。然後有:

T(n) <= 2((c(n/2)lg(n/2)) + n
        <= cnlg(n/2) + n
        = cnlgn - cnlg2 + n
          = cnlgn - cn + n
         <=cnlgn(只要c>=1)

這個例子在邊界條件上不滿足。我們可以這樣解決:對困難的邊界條件T(1)=1不考慮。我們可以把T(2) 和T(3) 作為歸納證明中的邊界條件代替T(1),讓n0=2, 這是因為對n>3, 遞迴不直接依賴於T(1)。

習題:

4.1-1:

證明的解為O(lgn)。

假設遞迴式的解為O(lgn),則存在n0和c,使


不能證明題設。

再猜測

當c≥1成立

4.1-2:

證明的解為O(nlgn)。證明這個遞迴的解也是Ω(nlgn)。得到的解為Θ(nlgn)。

假設遞迴式的解為O(nlgn),則當c>=1時,T(n)<=cnlgn,即T(n)=O(nlgn)

假設遞迴式的解也是Ω(nlgn),則 

存在n0和c,當n>=n0時,T(n)>=2c(n/2-1)lg(n/2-1)+n=c(n-2)lg(n-2)+(1-c)n+2c>=c(n-2)lg(n-2)+(1-c)n

上式不能證明遞迴式的解是Ω(nlgn),我們改變猜測,使遞迴式的解是 Ω(nlg(n+2))

得T(n)>=cnlg(n+2)-2clg(n+2)-cn+2c+n>=cnlg(n+2)+(1-c)n-2clg(n+2)
因為lg(n+2)<=lg(n*n)=2lgn,所以T(n)>=cnlg(n+2)+(1-c)n-4clgn
又因為多項式函式比指數函式增長的快,所以只要1-c>=0,那麼必然存在n1,當n>=n1時, (1-c)n-4clgn>=0,即此種情況下T(n)=Ω(nlg(n+2))
又因為nlg(n+2) > nlgn,所以nlg(n+2)=Ω(nlgn)。由傳遞性

T(n)=O(nlgn)和T(n)=Ω(nlgn),可得T(n)=Θ(nlgn)。

遞迴樹方法:

畫出一個遞迴樹是一種得到好猜測的直接方法。在遞迴樹中,每一個結點都代表遞迴函式呼叫集合中一個子問題的代價。我們將樹中每一層內的代價相加得到一個每層代價的集合,再將每層的代價相加得到遞迴是所有層次的總代價。當用遞迴式表示分治演算法的執行時間時,遞迴樹的方法尤其有用。
遞迴樹最適合用來產生好的猜測,然後用代換法加以驗證。使用遞迴樹產生好的猜測時,通常可以容忍小址的”不良量" (sloppiness) , 因為稍後就會證明所做的猜測。如果畫遞迴樹時非常地仔細,並且將代價都加了起來,那麼就可以直接用遞迴樹作為遞迴式解的證明。

遞迴樹方法的步驟:

將方程式展開成樹一樣的形式,展開以後每個節點表示執行一個步驟時用的代價(cost)。求法是先將每一層的各個節點相加得到每一層用的代價。然後將各個層用的代價加起來就得到答案。計算當中要得到樹的層數和最底層的數字。

如:

為了方便,不妨假設n是4的冪。

圖4-1a顯示了T(n), 在圖4-1b中被擴充套件成一個等價的用來表示遞迴的樹。根部的cn2項表示遞迴在頂層時所花的代價,而根部以下的三棵子樹表示這些n/4 大小的子問題所需的代價。圖4-1c展示了對圖4-1b作進一步處理的過程,將圖4-1b中代價為T(n/4)的結點進行了擴充套件。三棵子樹的根的代價分別是c(n/4)2 。我們繼續將樹中的每個結點進行擴充套件,直到遞迴結束。

子問題的大小將會隨著離樹根越來越遠而變得越來越小,最終一定會達到一個邊界條件。到達邊界條件時離樹根有多遠呢?對於深度為i的結點,其子問題大小為。那麼,當=1,或是當i = log4n時子問題的大小即達到1。因此,這棵樹有log4n+1層(0, 1, 2, …, log4n) 。

下面計算樹中每一層所需的代價。每一層都有它的上一層的3倍的結點,所以在深度i時結點的數目是。當從根部往下時,每一層的子問題大小是以4的因子在縮小,在深度i時,每個結點的代價為,其中i=0, 1, 2, …, log4n-1, 則第t層的所有結點的總代價是。在最後一層,也就是深度log4n 時,有個結點,每個結點的代價是T(1)。總代價為也就是

將所有層次的代價相加得到整棵樹的代價:

將量適當放鬆,用無限遞減等比級數作為上界。

在這個例子裡, cn2係數形成一個遞減的等比級數,這些係數的總和的上界是常數16/13 。

事實上,如果O(n2) 確實是此遞迴式的上界(稍後將會證明),那麼它一定是確界(tight bound) 。為什麼呢? 第一個遞迴呼叫需要的代價是, 所以一定是此遞迴式的下界。

使用代換法來驗證猜測的正確性,是遞迴式的一個上界。

另一個複雜些的例子:

(為了簡化起見,此處還是省略了下取整函式和上取整函式)

我們使用c來代表O(n)項的常數因子。

從根部到葉子的最長路徑是n 到(2/3)n到(2/3) 2n…到1 。因為當k=時,,所以樹的深度是

這棵遞迴樹並不是完整的二叉樹,少了個葉子,而且從樹根往下的過程中.越來越多的內部結點在消失。因此,並不是所有層次都剛好需要cn代價;越靠近底層,需要的代價越少。

我們可以用代換法來證明O(nlgn) 是遞迴式解的上界。下面證明T(n)小於等於dnlgn, 當d是一個合適的正值常數:

習題:

4.2-1:

利用遞迴樹來猜測遞迴式T(n)=3T(⌊n/2⌋)+n的一個好的漸近上界,並利用代換法來證明你的猜測。

證明:忽略上下界,假設當n=1時,T(1)=1。

建立遞迴樹:

根據遞迴樹可以得到如下結論:

遞迴樹的深度為lgn;

第i層的結點數為

除最後一層,第i層的代價

最後一層的代價為

根據以上結論可得,整棵遞迴樹的總體代價為:

再用替換法證明T(n)=3T(⌊ n/2 ⌋)+n的時間上界為

假設,那麼就存在c和n0,當n >= n0時,有

所以有

因為lg3 > 1,所以當n>=1時,nlg3>= n;

所以當n>=n0時,有,即

4.2-2:

利用遞迴樹來證明遞迴式T(n)=T(n/3)+T(2n/3)+cn的解是Ω(nlgn),其中c是一個常數。

證明:因為要證明T(n)的漸近下界,並且遞迴樹葉子的深度是不同的,所以需要畫出T(n)的遞迴樹的深度最淺的葉子(稱為leaf1)作為參考。

從遞迴樹中可以得到以下結論:

leaf1的深度為log3n;

深度從0到log3n-1的各層,每層的代價為cn;

深度為log3n的各結點,除leaf 以外,代價都是Ω(T(1));

深度從0到log3n的各層,每層的結點數為2i 。

設T(1)=Θ(1),那麼:

所以,推測T(n) = Ω(nlgn)。

用替換法證明推測:

若T(n)=Ω (nlgn),則存在n0和c0 ,使得當n >= n0 時,T(n)>=c0nlgn;

所以,T(n) >= c0(n/3)lg(n/3) + c0(2n/3)lg(2n/3) + cn = c0nlgn +(2/3c0 - c0lg3 + c)n;

顯然,當2/3c0 - c0lg3 + c >= 0時,即c0 <= c/(lg3 - 2/3)時,有T(n)>=c0nlgn,即T(n)=Ω (nlgn)。

主方法:

主方法(master method) 給出求解如下形式的遞迴式的“食譜”方法:

其中a >= 1,b > 1是常數, f(n) 是一個漸近正的函式。

上面的遞迴式描述了將規模為n的問題劃分為a個子問題的演算法的執行時間,每個子問題規模為n/b, a和b 是正常數。a個子問題被分別遞迴地解決,時間各為T(n/b) 。劃分原問題和合並答案的代價由函式f(n) 描述。

主定理(主方法依賴於主定理):

在第一種情況中,函式更大,則解為

在第三種情況下, f(n) 是較大的函式,則解為T(n) =

在第二種情況中,兩種函式同樣大,乘以對數因子,則解為

在第一種情況中,不僅要有f(n)小於,還必須是多項式地小於,即對某個常量,f(n) 必須漸近地小於,兩者差一個因子。在第三種情況中, f(n) 不僅要大於 , 且要多項式地大於,還要滿足”規則性”條件。多項式意義上的大於,舉個例子, n的ω次方>lgn, 對任意的ω>0和足夠大的n成立 ​​​。

要注意三種情況並沒有覆蓋所有可能的f(n) 。當f(n) 只是小於但不是多項式地小於時,在第一種情況和第二種情況之間就存在一條“溝”。類似情況下,當f(n) 大於, 但不是多項式地大,第二種情況和第三種情況之間就會存在一條“溝”。如果f(n)落在任一條”溝”中,或是第三種情況中規則性條件不成立,則主方法就不能用於解遞迴式。

舉幾個例子:

 

習題:

4.3-1:

用主方法來給出下列遞迴式的緊確的漸近界:

a) T(n)=4T(n/2)+n

b) T(n)=4T(n/2)+n2

c) T(n)=4T(n/2)+n3

4.3-2:

某個演算法A的執行時間由遞迴式T(n)=7T(n/2)+n2表示;另一個演算法A'的執行時間為T'(n)=aT'(n/4)+n2。若要A'比A更快,那麼a的最大整數值是多少?

主定理的證明:

T(n) <= aT(n/b)+c(n^d)

可以得到問題的複雜度為:

T(n) = O(n^d log(n)), if a = b^d

T(n) = O(n^d ), if a < b^d

T(n) = O(n^logb(a))), if a > b^d

為了證明主定理,需要畫遞迴樹。

每次遞迴把問題分為a個規模為n/b的子問題。從根節點開始,共有logb(n)+1層,葉子節點數為a^(logb(n))。那麼,第j層共有a^j個子問題,每個問題規模為n/b^j,每個子問題運算量為c*(n/b^j)^d需要完成的計算量為:

求和得到整個問題的運算量:

根據a與b^d的關係,即:

T(n) = O(n^d log(n)), if a = b^d

T(n) = O(n^d ), if a < b^d

T(n) = O(n^logb(a))), if a > b^d

我們很容易得到主定理。