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
2
+ (1-2·
c
2
)·
n
=
c
1
n
2
-
c
2
n -
(
c
2
-1
)·
n
∴ 当
c
2
-1 ≥ 0,即
c
2
≥ 1 时,
T(n) ≤
c
1
n
2
-
c
2
n
当 n = 1,T(1) =
Θ(1) ≤
c
1
- c
2
,∴ 对任意
c
2
≥ 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,这时主方法不适用。