算法導論-4遞歸關係

1. 利用數列知識

  1. 累加法:遞推關係式爲 a_{n+1}-a_{n}=f(n))採用累加法。
  2. 累乘法:遞推關係式爲a_{n+1}/a_{n}=f(n)採用累乘法。
  3. 構造法:遞推關係式爲(1)a_{n+1}=pa_{n}+q,(2)a_{n+1}=pa_{n}+q^{n},都可以通過恆等變形,構造出等差或等比數列,利用等差或等比數列的定義進行解題,其中的構造方法可通過待定係數法來進行。
  4. 和化項法:遞推公式爲S_{n}=f(n)S_{n}=f(a_{n})一般利用

                                      

     5. 用特徵方程求解遞推方程(感覺比較生僻,不做解釋)

     6. 迭代法:從原始遞推方程開始,反覆將對於遞推方程左邊的函數用右邊的等式代入,直到得到初值,然後將所得的結果進行化簡。

     例如在調用歸併排序mergeSort(a,0,n-1)對數組a[0...n−1]排序時,執行時間T(n)的遞推關係式爲:

                                     

其中,O(n)爲merge()所需要的時間,設爲cn(c爲正常量)。因此:

                               

忽略求解細節。在我們求解遞歸式時,因爲最終是要求得一個時間上限,所以在求解時常常省略一些細節。比如mergeSort(a,0,n-1)運行時間的實際遞歸式應該是:

                                      

但我們忽略這些上取整、下取整以及邊界條件,甚至假設問題規模n=2^{k},這都是爲方便求解而忽略的細節。經驗和一些定理告訴我們,這些細節不會影響算法時間複雜度的漸近界。

類似的,我們也可以用迭代法求解漢諾塔遞歸求解時的時間複雜度。但遺憾的是,迭代法一般適用於一階的遞推方程。對於二階及以上(即T(n)依賴它前面更多個遞歸項)的遞推方程,迭代法將導致迭代後的項太多,從而使得求和公式過於複雜,因此需要將遞推方程化簡,利用差消法等技巧將高階遞推方程化爲一階遞推方程。如在求快速排序算法平均時間複雜度T(n)的遞推方程,T(n)依賴T(n−1)、T(n−2)、...、T(1)等所有的項,這樣的遞推方程也稱爲全部歷史遞推方程。(這裏省略快速排序算法平均複雜度T(n)的求解過程)

小結:上面6種遞推關係是高中、本科知識,在此重點介紹了迭代法,其它幾種方法雖未在本篇中使用,但可以加深對遞推式求解的認識。

2. 替換法(代換法)

(1)猜測解-->數學歸納法證明;

           代換法實質上就是數學歸納法,因此求遞推式分爲兩步:

1.猜測解的形式;

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

遺憾的是並不存在通用的方法來猜測遞歸式的正確解,需要憑藉經驗,偶爾還需要創造力。即使猜出了遞歸式解的漸近界,也有可能在數學歸納證明時莫名其妙的失敗。正是由於該方法技術細節較爲難掌握,因此這個方法不適合用來求解遞歸方程,反而比較適合作爲其他方法檢驗手段。在此不做總結。可以翻閱《算法導論》進行學習。

實際使用的是歸納法,即根據直覺經驗判斷結果應該是什麼,然後再歸納求解。先代入常量c,然後歸納得出這樣的c存在。

(2)變量變換法;

3. 迭代法

(1)展開法;

(2)遞歸樹法;

遞歸樹是一棵結點帶權值的樹。初始的遞歸樹只有一個結點,它的權標記爲T(n);然後按照遞歸樹的迭代規則不斷進行迭代,每迭代一次遞歸樹就增加一層,直到樹中不再含有權值爲函數的結點(即葉結點都爲T(1))。下面以遞歸方程

     

來講述遞歸樹的迭代規則。

在得到遞歸樹後,將樹中每層中的代價求和,得到每層代價,然後將所有層的代價求和,得到所有層次的遞歸調用的總代價。在上圖(d)部分中,完全展開的遞歸樹高度爲lgn (樹高爲根結點到葉結點最長簡單路徑上邊的數目),所有遞歸樹具有lgn+1層,所以總代價爲cn∗(lgn+1),所有時間複雜度爲Θ(nlgn)。

總結:遞歸樹模型求解遞歸方程,本質上就是迭代思想的應用,利用遞歸方程迭代展開過程構造對應的遞歸樹,然後把每層的時間代價進行求和。不過遞歸樹模型更直觀,同時遞歸樹也克服了二階及更高階遞推方程不方便迭代展開的痛點。

遞歸樹法不是那麼精確,取決於你畫遞歸樹的精確度。用遞歸樹來猜測上界,然後用上面的代換法來證明正確性。

4. 主定理(主方法求解遞推式)

主方法爲如下形式的遞歸式提供了一種“菜譜”式的求解方法,如下所示

T(n)=aT(n/b)+f(n)

其中a≥1和b>1是常數,f(n)是漸近正函數。這個遞推式將規模爲n的問題分解爲a個子問題,每個子問題的規模爲n/b,a個子問題遞歸地求解,每個花費時間T(n/b)。函數f(n)包含了問題分解和子問題解合併的代價。同樣,這個遞歸式也沒有考慮上取整、下取整、邊界條件等,結果不會影響遞歸式的漸近性質。

---------------------------------------------------------------------

Ex. T(n)=4T(n/4)+n

      a=4 b=4 d=1/2, 4>2, a>b^d, case1,  O(n^logb^a)=O(n)

Ex. T(n)=2T(n/4)+n

      a=2 b=4 d=1/2, 2=2, a=b^d, case2, O(n^dlogn)=O(n½logn)

Ex.  T(n)=3T(n/4)+n2

       a=3 b=4 d=2, 3<16,a<b^d, case3, O(n^d)=O(n^2)

Ex. T(n)=2T(n/2)+nlgn

由表達式得知,n^logb^a=n^log2^2, 由於f(n)/n^logb^a=nlgn/n=lgn, 對於任意的ω, 都不存在lgn>n^ω, 故此不可被主方法求解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章