1. 程式人生 > >[演算法導論] 遞迴式求解的三種方法

[演算法導論] 遞迴式求解的三種方法

       求解遞迴式,《演算法導論》上給出了三種方法,不過對我而言,遞迴樹法和主方法往往更加有效。給出的建議是,先用主方法求解,如果不能使用的情況嘗試用遞迴樹求解,如果還不行只有用代入法。代入法作為一種求解+證明的方法需要我們猜測解的形式,比較麻煩。

(一)代換法:

       實質上就是數學歸納法,先對一個小的值做假設,然後推測更大的值得正確性。

       1.猜測解的形式;

       2.用數學歸納法求出解中的常數,並證明解是正確的。

       例子就不舉了,演算法導論上有許多例子,事實上,這不是首選的方法,因為猜測解的形式非常的難,需要積累許多求解的經驗。

(二)遞迴樹方法:

       利用遞迴樹方法求演算法複雜度,其實是提供了一個好的猜測,簡單而直觀。在遞迴樹中,每一個結點表示一個單一問題的代價,子問題對應某次遞迴函式呼叫。我們將樹中每層中的代價求和,得到每層代價,然後將所有層的代價求和,得到所有層次的遞迴呼叫總代價。

       遞迴樹最適合用來生成好的猜測,然後可用代入法來驗證猜測是否正確。當使用遞迴樹來生成好的猜測時,常常要忍受一點兒“不精確”,因為關注的是如何尋找解的一個上界。

      舉例:

      根據上式我們建立遞迴式T(n) = 3T(n / 4) + cn^2,建立下列遞迴樹模型:(參見演算法導論)




       在遞迴樹中,每一個結點都代表一個子代價,每層的代價是該層所有子代價的總和,總問題的代價就是所有層的代價總和。所以,我們利用遞迴樹求解代價,只要知道每一層的代價和層數即可。

       這些,都需要直觀的找出規律,以上圖為例,當遞迴呼叫到葉子T(1)時所用到的遞迴次數就是整棵遞迴樹的深度。我們從圖中可以得到第i層的結點的代價為n/(4^i),當n/(4^i)=1即i = log4(n)時,遞迴到達了葉子,故整棵遞迴樹的深度為log4(n)。總代價是所有層代價的總和,T(n)=cn^2+3/16*c*n^2+···結果為O(n^2)。計算過程詳見演算法導論。用到了一些幾何級數相關的知識略微放大上界。

       注意到遞迴樹並非都是這樣:每一層的結點都是相同的結構!我們在構造遞迴樹以及計算代價的時候要特別注意。

(三)主方法(首推):

       我們只需要記住主定理的三種情況,並且在滿足一定的條件下,就可以速度解出遞迴式。

       
      將餘項f(n)與函式進行比較, 直覺上來說兩個函式的較大者決定了遞迴式的解,如果兩個函式相當,則乘上一個對數因子logn。

      需要注意的是主方法並沒有覆蓋所有可能性,所有的大於和小於都是多項式意義上的大於和小於,對於有些遞迴式夾在三種情況的間隙中,是無法用主方法來求解的。下面解釋一下什麼是多項式意義上的小於和大於:

     f(x)多項式大於g(x):存在實數e>0,使得f(x)>g(x)*n^e
     f(x)多項式小於g(x):存在實數e>0,使得f(x)<g(x)*n^e

     PS:能找到這樣的e就說明存在啦,下面是在word中敲出來的,如有錯誤,望來信告知。