算法导论学习 之 解递归式

一、代换法
        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(n3)
                   假设:当 k < n,存在 c > 0,使得 T(k) ≤ c·k3
                   则 T(n) = 4T(n/2) + n ≤ 4c·(n/2)3 + n
                                                    = cn3/2 + n
                                                    = cn3 - (cn3/2 - n)
                   若 T(n) ≤ cn3,则 cn3/2-n ≥ 0
                   ∵ n ≥ 1,可取 c ≥ 2,此时不等式成立
                   又 T(1) = Θ(1) ≤ c·13 = c,任取 C0 > 0,当 c > C0 时不等式成立
                   ∴ T(n) = O(n3) (非紧界
            ②    可由 输入:n/2 -> n,n -> 2n,输出 ×4 猜测得
                        T(n) = O(n2)
                   1° 尝试假设:当 k < n,存在 c > 0,使得 T(k) ≤ c·k2
                       则 T(n) = 4T(n/2) + n ≤ 4c·(n/2)2 + n
                                                        = cn2 + n
                       若 T(n) ≤ cn2,则有 n ≤ 0 与 n ≥ 1 矛盾
                   尽管结果正确,T(n) = cn2 - (-n) = O(n2) - O(n) = O(n2),但不能完成归纳
                   接下来思路:改进归纳假设,上面的是同时假设了它没有低阶项
                   2°  假设:当 k < n,存在 c1 > 0,c2 > 0,使得 T(k) ≤ c1k2 - c2k
                        则 T(n) = 4T(n/2) + n ≤ 4·[ c1(n/2)2 - c2n/2 ] + n
                                                         = c1n+ (1-2·c2n
                                                         = c1n- c2n - (c2-1n
                        ∴ 当 c2-1 ≥ 0,即 c≥ 1 时,T(n) ≤ c1nc2n
                        当 n = 1,T(1) = Θ(1) ≤ c- c2,∴ 对任意 c≥ 1,应有 c1 ≥ c2 。
                        综上,T(n) = O(n2) 得证。紧界
            同样可用代换法证明 当 0 ≤ c2 ≤1 ≤ c1 时,T(n) = Ω(n2) 成立。所以 T(n) = Θ(n2)
二、递归树法
        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) = Ω(n2)
三、主方法​(Master定理)
        仅适用于形式如下的递归式:
        T(n) = a·T( [n/b] ) + f(n),其中常数 a ≥ 1,b > 1,n 为非负整数,函数 f(n) 是渐近正函数。
        有 a 个子问题,每个子问题的规模都是 n/b,加上非递归的代价 f(n) 。
            注:f(n) 渐近正:存在 n0 > 0,当 n ≥ n0,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) = Θ(n2)
              ② T(n) = 4T(n/2) + n2,易知 T(n)= Θ(n2·log2n)
              ③ T(n) = 4T(n/2) + n3,易知 T(n)= Θ(n3)
              ④ T(n) = 4T(n/2) + n2/log2n,这时主方法不适用。

 

By Black Storm(使用为知笔记)



posted @ 2015-02-02 13:42  BlackStorm  阅读(1251)  评论(0编辑  收藏  举报