zoukankan      html  css  js  c++  java
  • 算法导论学习 之 解递归式

    一、代换法
            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(使用为知笔记)



  • 相关阅读:
    Vue的style与class
    position记录
    JS 原型模式创建对象
    Js 栈和堆的实现
    slice深拷贝数组
    Vue路由query传参
    Object.prototype.toString.call(value)
    Node里面的对象创建问题
    Django模板语言 标签整理
    JavaScript基础
  • 原文地址:https://www.cnblogs.com/BlackStorm/p/4267587.html
Copyright © 2011-2022 走看看