算法導論學習 之 解遞歸式

1、代換法
          1.    猜想結果
        2.    用數學概括法驗證
        3.    解出使解成立的常係數
         錯誤的例子:
                    證實 n = O(1):
                    基準狀況 1 = O(1)
                    假設 n-1 = O(1)
                    則 n = (n-1)+1 = O(1)
               錯誤!由於不能對大O符號進行概括,每一處的 O(1) 的常數是變化的
               若是對有限個 O(1) 加倍是沒問題的,但進行 n 次加倍就不對了,
               此時常數是依賴於 n 變化的。
            例:T(n) = 4T(n/2) + n
               基準狀況:T(1) = Θ(1)
                    能夠猜一種結果:如 T(n) = O(n 3 )
                       假設:當 k < n,存在 c > 0,使得 T(k) ≤ c·k 3
                       則 T(n) = 4T(n/2) + n ≤ 4c·(n/2) 3  + n
                                                                 = cn3/2 + n
                                                                 = cn3 - (cn3/2 - n)
                        若 T(n) ≤ cn 3 ,則 cn 3 /2-n ≥ 0
                        ∵ n ≥ 1,可取 c ≥ 2,此時不等式成立
                       又 T(1) =  Θ(1) ≤ c·13 = c,任取 C 0 > 0,當 c > C0 時不等式成立
                       ∴ T(n) = O(n3) (非緊界
              ②     可由 輸入:n/2 -> n,n -> 2n,輸出 ×4 猜想得
                              T(n) = O(n 2 )
                       1°   嘗試假設:當 k < n,存在 c > 0,使得 T(k) ≤ c·k 2
                             則 T(n) = 4T(n/2) + n ≤ 4c·(n/2) 2  + n
                                                                      = cn2 + n
                             若 T(n) ≤ cn 2 ,則有 n ≤ 0 與 n ≥ 1 矛盾
                        儘管結果正確,T(n) = cn 2 - (-n) = O(n 2 ) - O(n) = O(n 2 ),但不能完成概括
                       接下來思路:改進概括假設,上面的是同時假設了它沒有低階項
                       2°   假設:當 k < n,存在 c1 > 0,c2 > 0,使得 T(k) ≤ c1k2 - c2k
                             則 T(n) = 4T(n/2) + n ≤ 4·[  c 1(n/2) 2   - c 2n/2  ] + n
                                                                      =  c 1 n + (1-2· c 2 n
                                                                       =  c 1 n - c 2 n -  ( c 2 -1 n
                             ∴ 當  c 2 -1 ≥ 0,即  c ≥ 1 時, T(n) ≤  c 1 n c 2 n
                             當 n = 1,T(1) =   Θ(1) ≤  c - c 2 ,∴ 對任意  c ≥ 1,應有  c 1   ≥  c 2  。
                             綜上, T(n) = O(n 2 ) 得證。 緊界
              一樣可用代換法證實 當 0 ≤  c 2  ≤1 ≤  c 1  時,T(n) =  Ω (n 2 ) 成立。因此  T(n) = Θ (n 2 )
2、遞歸樹法
         1.     構造遞歸樹
        2.    算出全部節點的運行時間和
        3.    得出遞歸式的解
        注:爲更嚴謹,能夠用遞歸樹法得出答案後再用代換法驗證。固然一般來講沒必要如此。
         例:T(n) = T(n/4) + T(n/2) +n2
            ∴ T(n) ≤ ( 1 + 5/16 + 25/256 + ... + 5k/16k + ... ) · n2
                        < 2n2 = O(n2)
            同時可知 T(n) =  Ω (n 2 )
3、主方法​(Master定理)
         僅適用於形式以下的遞歸式:
         T(n) = a·T( [n/b] ) + f(n),其中常數 a ≥ 1,b > 1,n 爲非負整數,函數 f(n) 是漸近正函數。
         有 a 個子問題,每一個子問題的規模都是 n/b,加上非遞歸的代價 f(n) 。
               注:f(n) 漸近正: 存在 n 0 > 0,當 n ≥ n 0 ,f(n) > 0 。即 n 足夠大時函數值總爲正值。
         三種狀況( 主定理 ):
         1.     存在 ε > 0,有 f(n) = O(    ),(即 f(n) 多項式地小於 
                 則 T(n) =  Θ   )
         2.      存在 ε > 0,k ≥ 0,有 f(n) =  Θ   ),
                則 T(n) =  Θ   )
         3.      存在 ε > 0,有 f(n) =  Ω   ),且存在 ε' > 0,使 a·f(n/b) ≤ (1-ε')·f(n)
                則 T(n) =  Θ( f(n) )
 
         例:① T(n) = 4T(n/2) + n,易知  T(n) =  Θ (n 2 )
                 ②  T(n) = 4T(n/2) + n2,易知 T(n)=  Θ (n 2 ·log2n)
                 ③  T(n) = 4T(n/2) + n3,易知 T(n)=  Θ (n 3 )
                 ④  T(n) = 4T(n/2) + n2/log2n,這時主方法不適用。

 

By Black Storm(使用爲知筆記)
相關文章
相關標籤/搜索