算法导论学习 之 解递归式

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(使用为知笔记)
相关文章
相关标签/搜索