一、代换法
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
= c1n2 + (1-2·c2)·n
= c1n2 - c2n - (c2-1)·n
∴ 当 c2-1 ≥ 0,即 c2 ≥ 1 时,T(n) ≤ c1n2 - c2n
当 n = 1,T(1) = Θ(1) ≤ c1 - c2,∴ 对任意 c2 ≥ 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)
?三、主方法?
仅适用于形式如下的递归式:
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,这时主方法不适用。