Introduction to Algorithms - Third Edition
Part I. Foundations
Chapter 4. Divide-and-Conquer
4.3 代换法求解递归式
两个步骤:
- 猜测解的形式。
- 用数学归纳法求出常数,证明解是有效的。
做一个好的猜测
① 将在章节 4.4 中介绍的递归树,可以用来帮助猜测。
② 如果递归式与以前见过的类似,那么可猜测该递归式有相似的解。
③ 先证明递归式的较松的上下界,然后再缩小不确定性区间。
一些细微问题
有时我们或许能猜出递归式解的渐近界,但用数学归纳法证明失败。通常,问题在于归纳假设不够强,无法证明其确切的界。遇到这种情况时,可以减去一个低阶项来修改所猜测的界,以使证明顺利进行。
考虑递归式:
T
(
n
)
=
T
(
⌊
n
/
2
⌋
)
+
T
(
⌈
n
/
2
⌉
)
+
1
T(n) = T(\lfloor n/2 \rfloor) + T( \lceil n/2 \rceil) + 1
T(n)=T(⌊n/2⌋)+T(⌈n/2⌉)+1。
猜测它的解为
T
(
n
)
=
O
(
n
)
T(n) = O(n)
T(n)=O(n),即要证明对适当选择的常数
c
c
c,有
T
(
n
)
≤
c
n
T(n) \le cn
T(n)≤cn。
用猜测的界对递归式作替换,得
T
(
n
)
≤
c
⌊
n
/
2
⌋
+
c
⌈
n
/
2
⌉
+
1
≤
c
n
+
1
T(n) \le c\lfloor n/2 \rfloor + c\lceil n/2 \rceil + 1 \le cn +1
T(n)≤c⌊n/2⌋+c⌈n/2⌉+1≤cn+1,
由此引不出
T
(
n
)
≤
c
n
T(n) \le cn
T(n)≤cn,无论
c
c
c 选择何值。
为了证明
T
(
n
)
=
O
(
n
)
T(n) = O(n)
T(n)=O(n) 是正确的,需要作一个更强的归纳假设:
T
(
n
)
≤
c
n
−
d
T(n) \le cn - d
T(n)≤cn−d,其中
d
d
d 是一个常数。
T
(
n
)
≤
(
c
⌊
n
/
2
⌋
−
d
)
+
(
c
⌈
n
/
2
⌉
−
d
)
+
1
≤
c
n
−
2
d
+
1
≤
c
n
−
d
T(n) \le (c\lfloor n/2 \rfloor - d) + (c\lceil n/2 \rceil - d) + 1 \le cn - 2d +1 \le cn -d
T(n)≤(c⌊n/2⌋−d)+(c⌈n/2⌉−d)+1≤cn−2d+1≤cn−d,只要
d
≥
1
d \ge 1
d≥1。
避免陷阱
使用渐近符号很容易出错。例,递归式
T
(
n
)
=
2
T
(
⌊
n
/
2
⌋
)
+
n
T(n) = 2T(\lfloor n/2 \rfloor) + n
T(n)=2T(⌊n/2⌋)+n 中,可能错误地“证明”
T
(
n
)
=
O
(
n
)
T(n) = O(n)
T(n)=O(n)。
假设
T
(
n
)
≤
c
n
T(n) \le cn
T(n)≤cn,证明
T
(
n
)
≤
2
(
c
⌊
n
/
2
⌋
)
+
n
≤
c
n
+
n
=
O
(
n
)
T(n) \le 2(c\lfloor n/2 \rfloor) + n \le cn + n = O(n)
T(n)≤2(c⌊n/2⌋)+n≤cn+n=O(n),
⟸
\Longleftarrow
⟸ 错!!
因为
c
c
c 是一个常数。
错误在于没有证明归纳假设的准确形式,即
T
(
n
)
≤
c
n
T(n) \le cn
T(n)≤cn。
改变变量
有时,对一个未知的递归式作一些代数变换,可得到一个与我们之前见过类似的递归式。
例,考虑递归式
T
(
n
)
=
2
T
(
⌊
n
⌋
)
+
lg
n
T(n) = 2T(\lfloor \sqrt n \rfloor) + \lg n
T(n)=2T(⌊n⌋)+lgn,
通过改变变量,简化这个递归式。为方便起见,不考虑值的截取整数问题。
设
m
=
lg
n
m = \lg n
m=lgn,有
T
(
2
m
)
=
2
T
(
n
m
/
2
)
+
m
T(2^m) = 2T( n^{m/2} ) + m
T(2m)=2T(nm/2)+m。
设
S
(
m
)
=
T
(
2
m
)
S(m) = T(2^m)
S(m)=T(2m),得到新的递归式
S
(
m
)
=
2
S
(
m
/
2
)
+
m
S(m) = 2S(m/2) + m
S(m)=2S(m/2)+m。
新递归式的解为
S
(
m
)
=
O
(
m
lg
m
)
S(m) = O(m \lg m)
S(m)=O(mlgm)。将
S
(
m
)
S(m)
S(m) 代回
T
(
n
)
T(n)
T(n),有
T
(
n
)
=
T
(
2
m
)
=
S
(
m
)
=
O
(
m
lg
m
)
=
O
(
lg
n
lg
lg
n
)
T(n) = T(2^m) = S(m) = O(m \lg m) = O(\lg n \lg\lg n)
T(n)=T(2m)=S(m)=O(mlgm)=O(lgnlglgn)。
练习
4.3-1 证明
T
(
n
)
=
T
(
n
−
1
)
+
n
T(n) = T(n-1) + n
T(n)=T(n−1)+n 的解是
O
(
n
2
)
O(n^2)
O(n2)。
证: 即证明存在常数
c
c
c 和
n
0
n_0
n0,当
n
≥
n
0
n \ge n_0
n≥n0 时,有
T
(
n
)
≤
c
n
2
T(n) \le cn^2
T(n)≤cn2。
替换递归式,得
T
(
n
)
≤
c
(
n
−
1
)
2
+
n
=
c
n
2
+
n
−
2
c
n
+
c
≤
c
n
2
T(n) \le c(n-1)^2 + n = cn^2 + n -2cn + c \le cn^2
T(n)≤c(n−1)2+n=cn2+n−2cn+c≤cn2。
存在
n
0
≥
1
n_0\ge 1
n0≥1,
c
≥
n
2
n
−
1
c \ge \frac{n}{2n-1}
c≥2n−1n,上式最后一步成立,即证。
4.3-2 证明
T
(
n
)
=
T
(
⌈
n
/
2
⌉
)
+
1
T(n) = T(\lceil n/2 \rceil) + 1
T(n)=T(⌈n/2⌉)+1 的解是
O
(
lg
n
)
O(\lg n)
O(lgn)。
证: 即证明存在常数
c
c
c 和
n
0
n_0
n0,当
n
≥
n
0
n \ge n_0
n≥n0 时,有
T
(
n
)
≤
c
lg
n
T(n) \le c\lg n
T(n)≤clgn。替换递归式,得
T
(
n
)
≤
c
lg
(
⌈
n
/
2
⌉
)
+
1
≤
c
lg
(
(
n
+
1
)
/
2
)
+
1
=
c
lg
(
n
+
1
)
−
c
+
1
≤
c
lg
n
T(n) \le c\lg(\lceil n/2 \rceil) + 1 \le c\lg((n+1)/2)+1 = c\lg(n+1) -c + 1 \le c\lg n
T(n)≤clg(⌈n/2⌉)+1≤clg((n+1)/2)+1=clg(n+1)−c+1≤clgn。 (1)
当
n
≥
4
n\ge4
n≥4 时,
lg
(
n
+
1
)
−
lg
n
=
lg
(
n
+
1
n
)
=
lg
(
1
+
1
/
n
)
≤
lg
(
5
/
4
)
<
0.33
<
1
/
2
\lg(n+1) - \lg n = \lg(\frac{n+1}{n}) = \lg(1+1/n) \le \lg(5/4) < 0.33 < 1/2
lg(n+1)−lgn=lg(nn+1)=lg(1+1/n)≤lg(5/4)<0.33<1/2。
此时,
c
lg
(
n
+
1
)
−
c
+
1
≤
c
(
lg
n
+
1
/
2
)
−
c
+
1
=
c
lg
n
+
1
−
c
/
2
c\lg(n+1) -c + 1 \le c(\lg n + 1/2) - c +1 = c\lg n + 1 - c/2
clg(n+1)−c+1≤c(lgn+1/2)−c+1=clgn+1−c/2。
所以,存在
n
0
≥
4
n_0\ge 4
n0≥4,
c
≥
2
c \ge 2
c≥2,(1) 式最后一步成立,即证。
4.3-3 我们知道
T
(
n
)
=
2
T
(
⌊
n
/
2
⌋
)
+
n
T(n) = 2T(\lfloor n/2 \rfloor) + n
T(n)=2T(⌊n/2⌋)+n 的解是
O
(
n
lg
n
)
O(n\lg n)
O(nlgn)。证明这个给递归式的解也是
Ω
(
n
lg
n
)
\Omega(n \lg n)
Ω(nlgn) 。得出结论:该递归式的解为
Θ
(
n
lg
n
)
\Theta(n \lg n)
Θ(nlgn)。
证: 即证明存在常数
c
c
c 和
n
0
n_0
n0,当
n
≥
n
0
n \ge n_0
n≥n0 时,有
T
(
n
)
≥
c
n
lg
n
T(n) \ge cn \lg n
T(n)≥cnlgn。替换递归式,得
T
(
n
)
≥
2
(
c
⌊
n
/
2
⌋
lg
(
⌊
n
/
2
⌋
)
)
+
n
≥
c
(
n
−
1
)
lg
(
(
n
−
1
)
/
2
)
+
n
=
c
(
n
−
1
)
lg
(
n
−
1
)
−
c
(
n
−
1
)
+
n
=
c
n
lg
(
n
−
1
)
−
c
lg
(
n
−
1
)
−
c
n
+
n
+
c
≥
c
n
lg
(
n
−
1
)
−
c
lg
n
−
c
n
+
n
+
c
≥
c
n
lg
n
T(n) \ge 2(c\lfloor n/2 \rfloor \lg (\lfloor n/2 \rfloor)) + n \ge c(n-1) \lg ((n-1)/2) +n \\= c(n-1)\lg (n-1) -c(n-1) + n =cn\lg(n-1) -c\lg(n-1) -cn +n+c \\\ge cn\lg(n-1) -c\lg n-cn +n+c \ge cn\lg n
T(n)≥2(c⌊n/2⌋lg(⌊n/2⌋))+n≥c(n−1)lg((n−1)/2)+n=c(n−1)lg(n−1)−c(n−1)+n=cnlg(n−1)−clg(n−1)−cn+n+c≥cnlg(n−1)−clgn−cn+n+c≥cnlgn。
当
n
≥
2
n\ge2
n≥2 时,
lg
(
n
−
1
)
−
lg
n
=
lg
(
n
−
1
n
)
=
lg
(
1
−
1
/
n
)
≥
lg
(
1
/
2
)
=
−
1
\lg(n-1) - \lg n = \lg(\frac{n-1}{n}) = \lg(1-1/n) \ge \lg(1/2) = -1
lg(n−1)−lgn=lg(nn−1)=lg(1−1/n)≥lg(1/2)=−1。
此时,
c
n
lg
(
n
−
1
)
−
c
lg
n
−
c
n
+
n
+
c
≥
c
n
lg
n
−
c
lg
n
−
2
c
n
+
n
+
c
cn\lg(n-1) -c\lg n -cn +n+c \ge cn\lg n -c\lg n -2cn+n+c
cnlg(n−1)−clgn−cn+n+c≥cnlgn−clgn−2cn+n+c
存在
n
0
≥
2
n_0\ge 2
n0≥2,
0
<
c
≤
n
2
n
+
lg
n
−
1
0 <c \le \frac{n}{2n+\lg n-1}
0<c≤2n+lgn−1n,上式最后一步成立,所以
T
(
n
)
=
Ω
(
n
lg
n
)
T(n) = \Omega(n\lg n)
T(n)=Ω(nlgn),即证。
4.3-4 证明:通过作不同的归纳假设,对递归式(4.19)我们可以克服在证明边界条件
T
(
1
)
=
1
T(1) = 1
T(1)=1 时的困难,而无需调整归纳证明中的边界情况。
证: 递归式 (4.19):
T
(
n
)
=
2
T
(
⌊
n
/
2
⌋
)
+
n
T(n) = 2T(\lfloor n/2 \rfloor) + n
T(n)=2T(⌊n/2⌋)+n。其解为
T
(
n
)
=
O
(
n
lg
n
)
T(n) = O(n \lg n)
T(n)=O(nlgn)。
归纳假设:存在常数
c
c
c,当
n
≥
1
n \ge 1
n≥1 时,有
T
(
n
)
≤
c
n
lg
(
n
+
1
)
T(n) \le cn \lg (n+1)
T(n)≤cnlg(n+1)。
替换递归式,得
T
(
n
)
≤
2
(
c
⌊
n
/
2
⌋
lg
(
⌊
n
/
2
⌋
+
1
)
)
+
n
≤
c
n
lg
(
(
n
+
2
)
/
2
)
+
n
=
c
n
lg
(
n
+
2
)
−
c
n
+
n
≤
c
n
lg
(
n
+
2
)
≤
c
n
lg
(
n
+
1
)
T(n) \le 2(c\lfloor n/2 \rfloor \lg (\lfloor n/2 \rfloor+1)) + n \le cn \lg ((n+2)/2) +n = cn\lg (n+2) -cn + n \le cn\lg (n+2) \le cn \lg(n+1)
T(n)≤2(c⌊n/2⌋lg(⌊n/2⌋+1))+n≤cnlg((n+2)/2)+n=cnlg(n+2)−cn+n≤cnlg(n+2)≤cnlg(n+1)。
当
c
≥
1
c \ge 1
c≥1 时,上式成立,所以
T
(
n
)
=
O
(
n
lg
(
n
+
1
)
)
T(n) = O(n\lg(n+1))
T(n)=O(nlg(n+1))。
令
h
(
n
)
=
n
lg
(
n
+
1
)
h(n) = n\lg(n+1)
h(n)=nlg(n+1),则
h
(
1
)
=
1
≥
T
(
1
)
h(1) = 1 \ge T(1)
h(1)=1≥T(1)。边界条件满足归纳假设。
因为
n
lg
(
n
+
1
)
=
Θ
(
n
lg
n
)
n\lg(n+1) = \Theta(n\lg n)
nlg(n+1)=Θ(nlgn),根据渐近符号的传递性,得
T
(
n
)
=
O
(
n
lg
n
)
T(n) = O(n\lg n)
T(n)=O(nlgn)。
4.3-5 证明合并排序算法的“准确”递归式 (4.3) 的解为
Θ
(
n
lg
n
)
\Theta(n\lg n)
Θ(nlgn)。
证: 递归式 (4.3) 为:
T
(
n
)
=
{
Θ
(
1
)
if
n
=
1
,
T
(
⌈
n
/
2
⌉
)
+
T
(
⌊
n
/
2
⌋
)
+
Θ
(
n
)
if
n
>
1.
T(n) = \begin{cases} \Theta(1) &\text{if } n=1, \\ T(\lceil n/2 \rceil) + T(\lfloor n/2 \rfloor) + \Theta(n) &\text{if } n >1. \end{cases}
T(n)={Θ(1)T(⌈n/2⌉)+T(⌊n/2⌋)+Θ(n)if n=1,if n>1.
令
f
(
n
)
=
Θ
(
n
)
f(n) = \Theta(n)
f(n)=Θ(n),则存在正常数
c
1
c_1
c1、
c
2
c_2
c2 和
n
0
n_0
n0,有
c
1
n
≤
f
(
n
)
≤
c
2
n
c_1n \le f(n) \le c_2n
c1n≤f(n)≤c2n。
先证
T
(
n
)
=
Ω
(
n
lg
n
)
T(n) = \Omega(n\lg n)
T(n)=Ω(nlgn),即证存在常数
c
c
c 和
n
1
n_1
n1,当
n
>
n
1
n>n_1
n>n1 时,有
T
(
n
)
≥
c
n
lg
n
T(n) \ge cn\lg n
T(n)≥cnlgn。
T
(
n
)
=
T
(
⌈
n
/
2
⌉
)
+
T
(
⌊
n
/
2
⌋
)
+
f
(
n
)
≥
2
T
(
⌊
n
/
2
⌋
)
+
f
(
n
)
≥
2
(
c
⌊
n
/
2
⌋
lg
(
⌊
n
/
2
⌋
)
)
+
f
(
n
)
≥
c
n
lg
(
n
/
2
)
+
f
(
n
)
=
c
n
lg
n
−
c
n
+
f
(
n
)
≥
c
n
lg
n
T(n) = T(\lceil n/2 \rceil) + T(\lfloor n/2 \rfloor) + f(n) \ge 2T(\lfloor n/2 \rfloor) + f(n) \ge 2(c\lfloor n/2 \rfloor \lg (\lfloor n/2 \rfloor)) + f(n) \\ \ge cn\lg(n/2) + f(n) = cn\lg n - cn + f(n) \ge cn \lg n
T(n)=T(⌈n/2⌉)+T(⌊n/2⌋)+f(n)≥2T(⌊n/2⌋)+f(n)≥2(c⌊n/2⌋lg(⌊n/2⌋))+f(n)≥cnlg(n/2)+f(n)=cnlgn−cn+f(n)≥cnlgn。
存在常数
c
=
c
1
c = c_1
c=c1,
n
1
>
n
0
n_1 > n_0
n1>n0,上式最后一步成立,即证。
再证
T
(
n
)
=
O
(
n
lg
n
)
T(n) = O(n\lg n)
T(n)=O(nlgn),即证存在常数
c
c
c 和
n
2
n_2
n2,当
n
>
n
2
n>n_2
n>n2 时,有
T
(
n
)
≤
c
n
lg
n
T(n) \le cn\lg n
T(n)≤cnlgn。
T
(
n
)
=
T
(
⌈
n
/
2
⌉
)
+
T
(
⌊
n
/
2
⌋
)
+
f
(
n
)
≤
2
T
(
⌈
n
/
2
⌉
)
+
f
(
n
)
≤
2
(
c
⌈
n
/
2
⌉
lg
(
⌈
n
/
2
⌉
)
)
+
f
(
n
)
≤
c
(
n
+
1
)
lg
(
(
n
+
1
)
/
2
)
+
c
2
n
=
c
n
lg
(
n
+
1
)
+
c
lg
(
n
+
1
)
−
c
(
n
+
1
)
+
c
2
n
≤
c
n
lg
n
T(n) = T(\lceil n/2 \rceil) + T(\lfloor n/2 \rfloor) + f(n) \le 2T(\lceil n/2 \rceil) + f(n) \le 2(c\lceil n/2 \rceil \lg (\lceil n/2 \rceil)) + f(n) \\ \le c(n+1)\lg((n+1)/2) +c_2n = cn\lg(n+1) + c\lg(n+1) - c(n+1) + c_2n \\ \le cn\lg n
T(n)=T(⌈n/2⌉)+T(⌊n/2⌋)+f(n)≤2T(⌈n/2⌉)+f(n)≤2(c⌈n/2⌉lg(⌈n/2⌉))+f(n)≤c(n+1)lg((n+1)/2)+c2n=cnlg(n+1)+clg(n+1)−c(n+1)+c2n≤cnlgn。 (2)
当
n
≥
4
n\ge4
n≥4 时,
lg
(
n
+
1
)
≤
lg
n
+
1
\lg(n+1) \le \lg n+1
lg(n+1)≤lgn+1。
此时,
c
n
lg
(
n
+
1
)
+
c
lg
(
n
+
1
)
−
c
(
n
+
1
)
+
c
2
n
≤
c
n
lg
n
+
c
lg
(
n
+
1
)
−
c
+
c
2
n
cn\lg(n+1) + c\lg(n+1) - c(n+1) + c_2n \le cn\lg n +c\lg(n+1)-c+c_2n
cnlg(n+1)+clg(n+1)−c(n+1)+c2n≤cnlgn+clg(n+1)−c+c2n。
存在
n
2
≥
max
(
n
0
,
4
)
n_2 \ge \max(n_0,4)
n2≥max(n0,4),
c
≥
c
2
n
1
−
lg
(
n
+
1
)
c \ge \frac{c_2n}{1-\lg(n+1)}
c≥1−lg(n+1)c2n,(2) 式最后一步成立,即证。
综上,所求解为 T ( n ) = Θ ( n lg n ) T(n) = \Theta(n\lg n) T(n)=Θ(nlgn)。
4.3-6 证明
T
(
n
)
=
2
T
(
⌊
n
/
2
⌋
+
17
)
+
n
T(n) = 2T(\lfloor n/2 \rfloor + 17) + n
T(n)=2T(⌊n/2⌋+17)+n 的解是
O
(
n
lg
n
)
O(n\lg n)
O(nlgn)。
证: 即证明存在常数
c
c
c 和
n
0
n_0
n0,当
n
≥
n
0
n \ge n_0
n≥n0 时,有
T
(
n
)
≤
c
n
lg
n
T(n) \le cn\lg n
T(n)≤cnlgn。替换递归式,得
T
(
n
)
≤
2
c
(
⌊
n
/
2
⌋
+
17
)
lg
(
⌊
n
/
2
⌋
+
17
)
+
n
≤
(
c
n
+
34
c
)
lg
(
n
/
2
+
17
)
+
n
=
c
n
lg
(
n
+
34
)
+
34
c
lg
(
n
+
34
)
−
c
n
−
34
c
+
n
T(n) \le 2c(\lfloor n/2 \rfloor+17)\lg(\lfloor n/2 \rfloor+17) + n \le (cn + 34c)\lg(n/2+17) + n\\ =cn\lg(n+34) +34c\lg(n+34) - cn-34c+n
T(n)≤2c(⌊n/2⌋+17)lg(⌊n/2⌋+17)+n≤(cn+34c)lg(n/2+17)+n=cnlg(n+34)+34clg(n+34)−cn−34c+n。
当
n
≥
34
n \ge 34
n≥34 时,
lg
(
n
+
34
)
−
lg
n
=
lg
n
+
34
n
=
lg
(
1
+
34
n
)
≤
1
\lg(n+34) - \lg n = \lg\frac{n+34}{n} = \lg(1+\frac{34}{n}) \le 1
lg(n+34)−lgn=lgnn+34=lg(1+n34)≤1。
此时,
c
n
lg
(
n
+
34
)
+
34
c
lg
(
n
+
34
)
−
c
n
−
34
c
+
n
≤
c
n
(
lg
n
+
1
)
+
34
c
lg
(
n
+
34
)
−
c
n
−
34
c
+
n
=
c
n
lg
n
+
34
c
lg
(
n
+
34
)
−
34
c
+
n
cn\lg(n+34) +34c\lg(n+34) - cn-34c+n \\ \le cn(\lg n+1) + 34c\lg(n+34) - cn-34c+n = cn\lg n + 34c\lg(n+34) -34c + n
cnlg(n+34)+34clg(n+34)−cn−34c+n≤cn(lgn+1)+34clg(n+34)−cn−34c+n=cnlgn+34clg(n+34)−34c+n。
存在
n
0
≥
1
n_0\ge 1
n0≥1,
c
≥
n
34
(
1
−
lg
(
n
+
34
)
)
c \ge \frac{n}{34(1-\lg(n+34))}
c≥34(1−lg(n+34))n,上式最后一步成立,即证。
4.3-7 使用章节 4.5 的主方法,可以证明递归式
T
(
n
)
=
4
T
(
n
/
3
)
+
n
T(n) = 4T(n/3) + n
T(n)=4T(n/3)+n 的解是
T
(
n
)
=
Θ
(
n
log
3
4
)
T(n) = \Theta ( n ^ { \log_3 {4} })
T(n)=Θ(nlog34)。证明假设
T
(
n
)
≤
c
n
log
3
4
T(n) \le cn^{\log_3 {4}}
T(n)≤cnlog34 的替换证明是不成立的。再说明如何减去一个低阶项使替换证明成立。
证:
1.27
>
log
3
4
>
1.26
>
1
1.27 > \log_3 {4} > 1.26 > 1
1.27>log34>1.26>1。
归纳假设:对任意常数
c
c
c,存在常数
n
0
n_0
n0,当
n
≥
n
0
n \ge n_0
n≥n0 时,有
T
(
n
)
≥
c
n
log
3
4
T(n) \ge cn^{\log_3 4}
T(n)≥cnlog34。替换递归式,得
T
(
n
)
≥
4
c
(
n
/
3
)
log
3
4
+
n
=
4
c
n
log
3
4
⋅
(
1
/
3
)
log
3
4
+
n
=
c
n
log
3
4
+
n
≥
c
n
log
3
4
T(n) \ge 4c(n/3)^{\log_3 4} + n = 4cn^{\log_3 4} \cdot (1/3)^{\log_3 4} + n= cn^{\log_3 4} + n \ge cn^{\log_3 4}
T(n)≥4c(n/3)log34+n=4cnlog34⋅(1/3)log34+n=cnlog34+n≥cnlog34。
所以,假设
T
(
n
)
≤
c
n
log
3
4
T(n) \le cn^{\log_3 {4}}
T(n)≤cnlog34 的替换证明是不成立的。
归纳假设:存在常数
c
c
c 和
n
0
n_0
n0,当
n
≥
n
0
n \ge n_0
n≥n0 时,有
T
(
n
)
≤
c
n
log
3
4
−
d
n
−
1
T(n) \le cn^{\log_3 4} - dn^{-1}
T(n)≤cnlog34−dn−1,其中常数
d
>
0
d>0
d>0。
替换递归式,得
T
(
n
)
≤
4
c
(
n
/
3
)
log
3
4
−
d
(
n
/
3
)
−
1
+
n
=
c
n
log
3
4
−
d
(
n
/
3
)
−
1
+
n
≤
c
n
log
3
4
−
d
n
−
1
T(n) \le 4c(n/3)^{\log_3 4} -d(n/3)^{-1} + n = cn^{\log_3 4} -d(n/3)^{-1} + n \le cn^{\log_3 4} - dn^{-1}
T(n)≤4c(n/3)log34−d(n/3)−1+n=cnlog34−d(n/3)−1+n≤cnlog34−dn−1。
当
d
≥
n
2
/
2
d \ge n^2 / 2
d≥n2/2 时,上式最后一步成立,即证。
4.3-8 使用章节 4.5 的主方法,可以证明递归式
T
(
n
)
=
4
T
(
n
/
2
)
+
n
2
T(n) = 4T(n/2) + n^2
T(n)=4T(n/2)+n2 的解是
T
(
n
)
=
Θ
(
n
2
)
T(n) = \Theta ( n^2)
T(n)=Θ(n2)。证明假设
T
(
n
)
≤
c
n
2
T(n) \le cn^2
T(n)≤cn2 的替换证明是不成立的。再说明如何减去一个低阶项使替换证明成立。
证: 归纳假设:对任意常数
c
c
c,存在常数
n
0
n_0
n0,当
n
≥
n
0
n \ge n_0
n≥n0 时,有
T
(
n
)
≥
c
n
2
T(n) \ge cn^2
T(n)≥cn2。替换递归式,得
T
(
n
)
≥
4
c
(
n
/
2
)
2
+
n
2
=
c
n
2
+
n
2
≥
c
n
2
T(n) \ge 4c(n/2)^2 + n^2 = cn^2 + n^2 \ge cn^2
T(n)≥4c(n/2)2+n2=cn2+n2≥cn2。
所以,假设
T
(
n
)
≤
c
n
2
T(n) \le cn^2
T(n)≤cn2 的替换证明是不成立的。
归纳假设:存在常数
c
c
c 和
n
0
n_0
n0,当
n
≥
n
0
n \ge n_0
n≥n0 时,有
T
(
n
)
≤
c
n
2
−
d
n
−
1
T(n) \le cn^2 - dn^{-1}
T(n)≤cn2−dn−1,其中常数
d
>
0
d>0
d>0。
替换递归式,得
T
(
n
)
≤
4
c
(
n
/
2
)
2
−
d
(
n
/
2
)
−
1
+
n
2
=
c
n
2
−
d
(
n
/
2
)
−
1
+
n
2
≤
c
n
2
−
d
n
−
1
T(n) \le 4c(n/2)^2 -d(n/2)^{-1} + n^2 = cn^2 -d(n/2)^{-1} + n^2 \le cn^2 - dn^{-1}
T(n)≤4c(n/2)2−d(n/2)−1+n2=cn2−d(n/2)−1+n2≤cn2−dn−1。
当
d
≥
n
3
d \ge n^3
d≥n3 时,上式最后一步成立,即证。
4.3-9 通过改变变量的方法求解递归式
T
(
n
)
=
3
T
(
n
)
+
log
n
T(n) = 3T(\sqrt{n}) + \log n
T(n)=3T(n)+logn。得到的解应当是渐近紧确的。不必担心值是否为整数。
解: 设
m
=
log
n
m = \log n
m=logn,则有
T
(
1
0
m
)
=
3
T
(
1
0
m
/
2
)
+
m
T(10^m) = 3T(10^{m/2}) + m
T(10m)=3T(10m/2)+m。
令
S
(
m
)
=
T
(
1
0
m
)
S(m) = T(10^m)
S(m)=T(10m),得到新递归式
S
(
m
)
=
3
S
(
m
/
2
)
+
m
S(m) = 3S(m/2) + m
S(m)=3S(m/2)+m。
新递归式的解为
S
(
m
)
=
Θ
(
m
lg
3
)
S(m) = \Theta(m^{\lg 3})
S(m)=Θ(mlg3)。(待确定)
将
S
(
m
)
S(m)
S(m) 代回
T
(
n
)
T(n)
T(n),有
T
(
n
)
=
T
(
1
0
m
)
=
S
(
m
)
=
Θ
(
m
lg
3
)
=
Θ
(
(
log
n
)
lg
3
)
T(n) = T(10^m) = S(m) = \Theta(m^{\lg 3}) = \Theta((\log n)^{\lg 3})
T(n)=T(10m)=S(m)=Θ(mlg3)=Θ((logn)lg3)。
4.4 递归树方法求解递归式
在递归树中,每个结点表示递归函数调用集合中一个子问题的代价。
递归树适合来生成一个好的猜测,然后可以通过替换方法来验证。但是,如果在绘制递归树和计算代价时非常仔细,可以使用递归树作为递归解的直接证明。
练习
4.4-1 使用递归树来确定递归式
T
(
n
)
=
3
T
(
⌊
n
/
2
⌋
)
+
n
T(n) = 3T(\lfloor n/2 \rfloor) + n
T(n)=3T(⌊n/2⌋)+n 的一个好的渐近上界。用代换法证明你的答案。
解: 下面递归树有
lg
n
+
1
\lg n + 1
lgn+1 层。最后一层的代价为
Θ
(
3
lg
n
)
=
Θ
(
n
lg
3
)
\Theta(3^{\lg n}) = \Theta(n^{\lg3})
Θ(3lgn)=Θ(nlg3)。
把所有层次的代价加起来,得到整个树的代价:
T
(
n
)
=
n
+
3
2
n
+
(
3
2
)
2
n
+
⋯
+
(
3
2
)
lg
n
−
1
n
+
Θ
(
n
lg
3
)
=
∑
i
=
0
lg
n
−
1
(
3
2
)
i
n
+
Θ
(
n
lg
3
)
=
(
3
/
2
)
lg
n
−
1
(
3
/
2
)
−
1
n
+
Θ
(
n
lg
3
)
=
2
⋅
n
lg
3
−
2
n
+
Θ
(
n
lg
3
)
=
Θ
(
n
lg
3
)
T(n) = n + \frac{3}{2}n + (\frac{3}{2})^2n + \dots + (\frac{3}{2})^{\lg n - 1}n + \Theta(n^{\lg3}) = \sum_{i=0}^{\lg n - 1} (\frac{3}{2})^i n + \Theta(n^{\lg3}) \\ =\frac{(3/2)^{\lg n} - 1}{(3/2) -1}n + \Theta(n^{\lg3}) =2\cdot n^{\lg 3} - 2n + \Theta(n^{\lg3}) \\ =\Theta(n^{\lg 3})
T(n)=n+23n+(23)2n+⋯+(23)lgn−1n+Θ(nlg3)=∑i=0lgn−1(23)in+Θ(nlg3)=(3/2)−1(3/2)lgn−1n+Θ(nlg3)=2⋅nlg3−2n+Θ(nlg3)=Θ(nlg3)。
猜测:
T
(
n
)
=
O
(
n
lg
3
)
T(n) = O(n^{\lg3})
T(n)=O(nlg3)。
证明:假设存在常数
c
c
c 和
n
0
n_0
n0,当
n
≥
n
0
n \ge n_0
n≥n0 时,有
T
(
n
)
≤
c
n
lg
3
−
d
n
−
1
T(n) \le cn^{\lg 3} - dn^{-1}
T(n)≤cnlg3−dn−1,其中,常数
d
>
0
d>0
d>0。
替换递归式,得
T
(
n
)
≤
3
c
(
⌊
n
/
2
⌋
)
lg
3
−
d
(
⌊
n
/
2
⌋
)
−
1
+
n
≤
3
c
(
n
/
2
)
lg
3
−
d
(
n
/
2
)
−
1
+
n
=
c
n
lg
3
−
2
d
n
−
1
+
n
≤
c
n
lg
3
−
d
n
−
1
T(n) \le 3c(\lfloor n/2 \rfloor)^{\lg3} -d(\lfloor n/2 \rfloor)^{-1} + n \le 3c(n/2)^{\lg3} - d(n/2)^{-1} + n \\ = cn^{\lg3} - 2dn^{-1} + n \le cn^{\lg 3} - dn^{-1}
T(n)≤3c(⌊n/2⌋)lg3−d(⌊n/2⌋)−1+n≤3c(n/2)lg3−d(n/2)−1+n=cnlg3−2dn−1+n≤cnlg3−dn−1。
当
d
≥
n
2
d \ge n^2
d≥n2 时,上式最后一步成立。即证。
4.4-2 使用递归树来确定递归式
T
(
n
)
=
T
(
n
/
2
)
+
n
2
T(n) = T(n/2) + n^2
T(n)=T(n/2)+n2 的一个好的渐近上界。用代换法证明你的答案。
解: 递归树有
lg
n
+
1
\lg n + 1
lgn+1 层。每层代价如下:
第 0 层:
n
2
n^2
n2,
第 1 层:
(
n
2
)
2
=
1
4
n
2
(\frac{n}{2})^2 = \frac{1}{4}n^2
(2n)2=41n2,
第 2 层:
1
4
(
n
2
)
2
=
(
1
4
)
2
n
\frac{1}{4}(\frac{n}{2})^2 = (\frac{1}{4})^2n
41(2n)2=(41)2n,
……
第
lg
n
\lg n
lgn 层:
T
(
1
)
T(1)
T(1)。
把所有层次的代价加起来,得到整个树的代价:
T
(
n
)
=
n
2
+
1
4
n
2
+
(
1
4
)
2
n
2
+
⋯
+
(
1
4
)
lg
n
−
1
n
2
+
Θ
(
1
)
=
∑
i
=
0
lg
n
−
1
(
1
4
)
i
n
2
+
Θ
(
1
)
=
(
1
/
4
)
lg
n
−
1
(
1
/
4
)
−
1
n
2
+
Θ
(
1
)
=
4
3
(
1
−
1
/
n
2
)
n
2
+
Θ
(
1
)
=
4
3
n
2
−
4
3
+
Θ
(
1
)
=
Θ
(
n
2
)
T(n) = n^2 + \frac{1}{4}n^2 + (\frac{1}{4})^2n^2 + \dots + (\frac{1}{4})^{\lg n - 1}n^2 + \Theta(1) = \sum_{i=0}^{\lg n - 1} (\frac{1}{4})^i n^2 + \Theta(1) \\ =\frac{(1/4)^{\lg n} - 1}{(1/4) -1} n^2 + \Theta(1) = \frac{4}{3}(1-1/n^2)n^2 + \Theta(1) = \frac{4}{3}n^2 - \frac{4}{3} + \Theta(1) \\ =\Theta(n^2)
T(n)=n2+41n2+(41)2n2+⋯+(41)lgn−1n2+Θ(1)=∑i=0lgn−1(41)in2+Θ(1)=(1/4)−1(1/4)lgn−1n2+Θ(1)=34(1−1/n2)n2+Θ(1)=34n2−34+Θ(1)=Θ(n2)。
猜测:
T
(
n
)
=
O
(
n
2
)
T(n) = O(n^2)
T(n)=O(n2)。
证明:假设存在常数
c
c
c 和
n
0
n_0
n0,当
n
≥
n
0
n \ge n_0
n≥n0 时,有
T
(
n
)
≤
c
n
2
T(n) \le cn^2
T(n)≤cn2。替换递归式,得
T
(
n
)
≤
c
(
n
/
2
)
2
+
n
2
=
1
4
c
n
2
+
n
2
≤
c
n
2
T(n) \le c(n/2)^2 + n^2 = \frac{1}{4}cn^2 + n^2 \le cn^2
T(n)≤c(n/2)2+n2=41cn2+n2≤cn2。
当
c
≥
4
/
3
c \ge 4/3
c≥4/3 时,上式最后一步成立。即证。
4.4-3 使用递归树来确定递归式
T
(
n
)
=
4
T
(
n
/
2
+
2
)
+
n
T(n) = 4T(n/2+2) + n
T(n)=4T(n/2+2)+n 的一个好的渐近上界。用代换法证明你的答案。
解: 每层代价如下:
第 0 层:
n
n
n,
第 1 层:
4
(
n
/
2
+
2
)
=
2
n
+
8
=
2
n
+
8
×
1
4(n/2+2) = 2n + 8 = 2n + 8 \times 1
4(n/2+2)=2n+8=2n+8×1,
第 2 层:
16
(
(
n
/
2
+
2
)
/
2
+
2
)
=
16
(
n
/
4
+
3
)
=
4
n
+
48
=
4
n
+
16
×
3
16((n/2+2)/2+2) = 16(n/4 + 3) = 4n+48 = 4n + 16 \times 3
16((n/2+2)/2+2)=16(n/4+3)=4n+48=4n+16×3,
第 3 层:
64
(
(
n
/
4
+
3
)
/
2
+
2
)
=
64
(
n
/
8
+
7
/
2
)
=
8
n
+
224
=
8
n
+
32
×
7
64((n/4+3)/2 + 2) = 64(n/8 + 7/2) = 8n + 224 = 8n + 32 \times 7
64((n/4+3)/2+2)=64(n/8+7/2)=8n+224=8n+32×7,
第 4 层:
256
(
(
n
/
8
+
7
/
2
)
/
2
+
2
)
=
256
(
n
/
16
+
15
/
4
)
=
16
n
+
960
=
16
n
+
64
×
15
256((n/8+7/2)/2+2) = 256(n/16 + 15/4) = 16n + 960 = 16n + 64 \times 15
256((n/8+7/2)/2+2)=256(n/16+15/4)=16n+960=16n+64×15
……
第
i
i
i 层:每个结点的代价为
n
/
2
i
+
2
i
−
1
2
i
−
2
n/2^i+ \frac{2^i-1}{2^{i-2}}
n/2i+2i−22i−1,有
4
i
4^i
4i 个结点,总代价为
2
i
n
+
2
i
+
2
⋅
(
2
i
−
1
)
2^i n + 2^{i+2}\cdot (2^i-1)
2in+2i+2⋅(2i−1).
当
n
≤
4
n \le 4
n≤4 时,运用递归式会无限循环,单个结点的代价趋于 4。
此时,运行子问题的基本程序,不使用递归程序。
令
T
(
5
)
=
Θ
(
1
)
T(5) = \Theta(1)
T(5)=Θ(1) 是最小子问题运行时间。
求解
n
/
2
i
+
2
i
−
1
2
i
−
2
=
5
n/2^i+ \frac{2^i-1}{2^{i-2}} = 5
n/2i+2i−22i−1=5,得
i
=
lg
(
n
−
4
)
i = \lg(n-4)
i=lg(n−4)。所以递归树一共有
lg
(
n
−
4
)
+
1
\lg(n-4) + 1
lg(n−4)+1 层。
第
lg
(
n
−
4
)
\lg(n-4)
lg(n−4) 层:有
4
lg
(
n
−
4
)
4^{\lg(n-4)}
4lg(n−4) 个结点,每个结点的代价为
T
(
5
)
T(5)
T(5)。这层总代价为
Θ
(
4
lg
(
n
−
4
)
)
\Theta(4^{\lg(n-4)})
Θ(4lg(n−4))。
把所有层次的代价加起来,得到整个树的代价:
T
(
n
)
=
∑
i
=
0
lg
(
n
−
4
)
−
1
(
2
i
n
+
2
i
+
2
⋅
(
2
i
−
1
)
)
+
Θ
(
4
lg
(
n
−
4
)
)
=
∑
i
=
0
lg
(
n
−
4
)
−
1
2
i
n
+
∑
i
=
0
lg
(
n
−
4
)
−
1
4
i
+
1
−
∑
i
=
0
lg
(
n
−
4
)
−
1
2
i
+
2
+
Θ
(
(
n
−
4
)
2
)
=
2
lg
(
n
−
4
)
−
1
2
−
1
n
+
4
⋅
4
lg
(
n
−
4
)
−
1
4
−
1
−
4
⋅
2
lg
(
n
−
4
)
−
1
2
−
1
+
Θ
(
n
2
)
=
(
n
−
5
)
n
+
4
3
(
(
n
−
4
)
2
−
1
)
−
4
(
n
−
5
)
+
Θ
(
n
2
)
=
Θ
(
n
2
)
T(n) = \sum_{i=0}^{\lg(n-4)-1} (2^i n + 2^{i+2}\cdot (2^i-1) )+ \Theta(4^{\lg(n-4)}) \\ =\sum_{i=0}^{\lg(n-4)-1}2^i n + \sum_{i=0}^{\lg(n-4)-1} 4^{i+1} - \sum_{i=0}^{\lg(n-4)-1}2^{i+2} + \Theta((n-4)^2) \\ =\frac{2^{\lg(n-4)} - 1}{2-1}n + 4\cdot\frac{4^{\lg(n-4)} - 1}{4-1} - 4\cdot\frac{2^{\lg(n-4)} - 1}{2-1} + \Theta(n^2) \\ =(n-5)n + \frac{4}{3}((n-4)^2-1) -4(n-5) + \Theta(n^2) \\ =\Theta(n^2)
T(n)=∑i=0lg(n−4)−1(2in+2i+2⋅(2i−1))+Θ(4lg(n−4))=∑i=0lg(n−4)−12in+∑i=0lg(n−4)−14i+1−∑i=0lg(n−4)−12i+2+Θ((n−4)2)=2−12lg(n−4)−1n+4⋅4−14lg(n−4)−1−4⋅2−12lg(n−4)−1+Θ(n2)=(n−5)n+34((n−4)2−1)−4(n−5)+Θ(n2)=Θ(n2).
猜测:
T
(
n
)
=
O
(
n
2
)
T(n) = O(n^2)
T(n)=O(n2)。
证明:假设存在常数
c
c
c 和
n
0
n_0
n0,当
n
≥
n
0
n \ge n_0
n≥n0 时,有
T
(
n
)
≤
c
n
2
−
d
n
−
1
T(n) \le cn^2 - dn^{-1}
T(n)≤cn2−dn−1,其中,常数
d
>
0
d > 0
d>0。
替换递归式,得
T
(
n
)
≤
4
c
(
n
/
2
+
2
)
2
−
d
(
n
/
2
+
2
)
−
1
+
n
=
c
n
2
+
8
c
n
+
16
−
2
d
/
(
n
+
4
)
+
n
≤
c
n
2
−
d
n
−
1
T(n) \le 4c(n/2+2)^2 - d(n/2+2)^{-1} + n = cn^2 + 8cn + 16 - 2d/(n+4) + n \le cn^2 -dn^{-1}
T(n)≤4c(n/2+2)2−d(n/2+2)−1+n=cn2+8cn+16−2d/(n+4)+n≤cn2−dn−1。
当
n
0
>
4
n_0 > 4
n0>4,
d
>
n
3
+
20
n
2
+
64
n
n
−
4
d > \frac{n^3+20n^2+64n}{n-4}
d>n−4n3+20n2+64n,
0
<
c
≤
(
d
−
64
)
n
−
4
d
−
n
3
−
20
n
2
8
n
2
(
n
+
4
)
0 < c \le \frac{(d-64)n-4d -n^3-20n^2}{8n^2(n+4)}
0<c≤8n2(n+4)(d−64)n−4d−n3−20n2 时,上式最后一步成立。即证。
4.4-4 使用递归树来确定递归式
T
(
n
)
=
2
T
(
n
−
1
)
+
1
T(n) = 2T(n-1) + 1
T(n)=2T(n−1)+1 的一个好的渐近上界。用代换法证明你的答案。
解: 递归树有
n
n
n 层。每层代价如下:
第 0 层:1
第 1 层:2
第 2 层:4
……
第
n
−
1
n-1
n−1 层:
2
n
−
1
T
(
1
)
2^{n-1}T(1)
2n−1T(1)
把所有层次的代价加起来,得到整个树的代价:
T
(
n
)
=
1
+
2
+
4
+
⋯
+
2
n
−
2
+
Θ
(
2
n
−
1
)
=
∑
i
=
0
n
−
2
2
i
+
Θ
(
2
n
−
1
)
=
2
n
−
1
−
1
2
−
1
+
Θ
(
2
n
−
1
)
=
2
n
−
1
−
1
+
Θ
(
2
n
−
1
)
=
Θ
(
2
n
)
T(n) = 1 + 2 + 4 + \dots + 2^{n-2} + \Theta(2^{n-1}) \\ =\sum_{i=0}^{n-2}2^{i} + \Theta(2^{n-1}) = \frac{2^{n-1} - 1}{2-1} + \Theta(2^{n-1}) \\ =2^{n-1} -1 + \Theta(2^{n-1}) \\ =\Theta(2^n)
T(n)=1+2+4+⋯+2n−2+Θ(2n−1)=∑i=0n−22i+Θ(2n−1)=2−12n−1−1+Θ(2n−1)=2n−1−1+Θ(2n−1)=Θ(2n).
猜测:
T
(
n
)
=
O
(
2
n
)
T(n) = O(2^n)
T(n)=O(2n)。
证明:假设存在常数
c
c
c 和
n
0
n_0
n0,当
n
≥
n
0
n \ge n_0
n≥n0 时,有
T
(
n
)
≤
c
⋅
2
n
−
d
n
−
1
T(n) \le c\cdot2^n - dn^{-1}
T(n)≤c⋅2n−dn−1,其中,常数
d
>
0
d>0
d>0。
替换递归式,得
T
(
n
)
≤
2
c
⋅
2
n
−
1
−
d
(
n
−
1
)
−
1
+
1
=
c
⋅
2
n
−
d
/
(
n
−
1
)
+
1
≤
c
⋅
2
n
−
d
/
n
T(n) \le 2c\cdot 2^{n-1} - d(n-1)^{-1} + 1 = c\cdot 2^n -d/(n-1) + 1 \le c\cdot 2^n - d/n
T(n)≤2c⋅2n−1−d(n−1)−1+1=c⋅2n−d/(n−1)+1≤c⋅2n−d/n。
当
d
≥
n
(
n
−
1
)
d \ge n(n-1)
d≥n(n−1) 时,上式最后一步成立。即证。
4.4-5 使用递归树来确定递归式
T
(
n
)
=
T
(
n
−
1
)
+
T
(
n
/
2
)
+
n
T(n) = T(n-1) + T(n/2) + n
T(n)=T(n−1)+T(n/2)+n 的一个好的渐近上界。用代换法证明你的答案。
解: (?)
第 0 行:
n
n
n
第 1 行:
(
n
−
1
)
+
n
2
=
3
2
n
−
1
(n-1)+ \frac{n}{2} = \frac{3}{2}n-1
(n−1)+2n=23n−1
第 2 行:
(
(
n
−
2
)
+
n
−
1
2
)
+
(
n
2
−
1
+
n
4
)
=
9
4
n
−
7
2
=
(
3
2
n
−
1
)
−
2
+
(
3
2
n
−
1
)
/
2
((n-2)+\frac{n-1}{2}) + (\frac{n}{2}-1+\frac{n}{4}) = \frac{9}{4}n - \frac{7}{2} =(\frac{3}{2}n -1)-2+(\frac{3}{2}n -1)/2
((n−2)+2n−1)+(2n−1+4n)=49n−27=(23n−1)−2+(23n−1)/2
第 3 行:
(
n
−
3
)
+
n
−
2
2
+
(
n
−
1
2
−
1
+
n
−
1
4
)
+
(
n
2
−
2
+
(
n
2
−
1
)
/
2
)
+
(
n
4
−
1
)
+
n
8
=
27
8
n
−
37
4
=
(
9
4
n
−
7
2
)
−
4
+
(
9
4
n
−
7
2
)
/
2
(n-3) + \frac{n-2}{2} + (\frac{n-1}{2}-1 + \frac{n-1}{4}) + (\frac{n}{2}-2 + (\frac{n}{2}-1)/2) + (\frac{n}{4}-1) + \frac{n}{8} = \frac{27}{8}n - \frac{37}{4} = (\frac{9}{4}n - \frac{7}{2})-4 + (\frac{9}{4}n - \frac{7}{2})/2
(n−3)+2n−2+(2n−1−1+4n−1)+(2n−2+(2n−1)/2)+(4n−1)+8n=827n−437=(49n−27)−4+(49n−27)/2
第 4 行:
(
27
8
n
−
37
4
)
−
8
+
(
27
8
n
−
37
4
)
/
2
=
81
16
n
−
175
8
(\frac{27}{8}n - \frac{37}{4})-8 + (\frac{27}{8}n - \frac{37}{4})/2 = \frac{81}{16}n -\frac{175}{8}
(827n−437)−8+(827n−437)/2=1681n−8175
……
第
i
i
i 行:
3
i
2
i
n
−
S
(
i
)
\frac{3^i}{2^i}n - S(i)
2i3in−S(i)
第 2 - 4 行减去的常数:
2
+
3
/
2
2+3/2
2+3/2
4
+
3
/
2
(
2
+
3
/
2
)
=
4
+
2
⋅
3
/
2
+
(
3
/
2
)
2
4+3/2(2+3/2) = 4 +2\cdot3/2+(3/2)^2
4+3/2(2+3/2)=4+2⋅3/2+(3/2)2
8
+
3
/
2
(
4
+
3
/
2
(
2
+
3
/
2
)
)
=
8
+
4
⋅
3
/
2
+
2
⋅
(
3
/
2
)
2
+
(
3
/
2
)
3
8+3/2(4+3/2(2+3/2)) = 8+4\cdot3/2+2\cdot(3/2)^2 + (3/2)^3
8+3/2(4+3/2(2+3/2))=8+4⋅3/2+2⋅(3/2)2+(3/2)3
第
i
i
i 行减去的常数:
S
(
i
)
=
2
i
−
1
+
2
i
−
2
⋅
(
3
/
2
)
+
⋯
+
2
⋅
(
3
/
2
)
i
−
2
+
(
3
/
2
)
i
−
1
S(i) = 2^{i-1}+2^{i-2}\cdot(3/2) + \cdots + 2\cdot(3/2)^{i-2} + (3/2)^{i-1}
S(i)=2i−1+2i−2⋅(3/2)+⋯+2⋅(3/2)i−2+(3/2)i−1
所以,第
i
i
i 行的代价为:
3
i
2
i
n
−
S
(
i
)
≤
(
3
2
)
i
n
−
2
i
−
1
\frac{3^i}{2^i}n - S(i) \le (\frac{3}{2})^{i}n - 2^{i-1}
2i3in−S(i)≤(23)in−2i−1
递归树的层数为
n
n
n。
把所有层次的代价加起来,得到整个树的代价:
T
(
n
)
≤
n
+
3
2
n
+
(
3
2
)
2
n
+
⋯
+
(
3
2
)
n
−
1
n
−
(
1
+
2
+
2
2
+
⋯
+
2
n
−
2
)
=
∑
i
=
0
n
−
1
(
3
2
)
i
−
∑
i
=
0
n
−
2
2
i
=
2
(
(
3
2
)
n
−
1
)
n
−
(
2
n
−
1
−
1
)
=
O
(
(
3
2
)
n
n
)
T(n) \le n+\frac{3}{2}n + (\frac{3}{2})^2n + \cdots + (\frac{3}{2})^{n-1}n - (1+2 + 2^2 + \cdots + 2^{n-2}) \\ =\sum_{i=0}^{n-1}(\frac{3}{2})^i - \sum_{i=0}^{n-2}2^i \\ =2((\frac{3}{2})^n-1)n - (2^{n-1} - 1) \\ =O((\frac{3}{2})^nn)
T(n)≤n+23n+(23)2n+⋯+(23)n−1n−(1+2+22+⋯+2n−2)=∑i=0n−1(23)i−∑i=0n−22i=2((23)n−1)n−(2n−1−1)=O((23)nn)
猜测:
T
(
n
)
=
O
(
(
3
2
)
n
n
)
T(n) = O((\frac{3}{2})^nn)
T(n)=O((23)nn)。
证明:假设存在常数
c
c
c 和
n
0
n_0
n0,当
n
≥
n
0
n \ge n_0
n≥n0 时,有
T
(
n
)
≤
c
⋅
(
3
2
)
n
n
T(n) \le c\cdot(\frac{3}{2})^nn
T(n)≤c⋅(23)nn。
替换递归式,得
T
(
n
)
≤
c
(
3
2
)
n
−
1
(
n
−
1
)
+
c
⋅
(
3
2
)
n
/
2
⋅
n
2
+
n
=
c
(
3
2
)
n
−
1
n
−
c
(
3
2
)
n
−
1
+
c
⋅
(
3
2
)
n
/
2
⋅
n
2
+
n
≤
c
⋅
(
3
2
)
n
n
T(n) \le c(\frac{3}{2})^{n-1}(n-1) + c\cdot(\frac{3}{2})^{n/2}\cdot\frac{n}{2} + n = c(\frac{3}{2})^{n-1}n -c(\frac{3}{2})^{n-1} + c\cdot(\frac{3}{2})^{n/2}\cdot\frac{n}{2} + n \le c\cdot(\frac{3}{2})^nn
T(n)≤c(23)n−1(n−1)+c⋅(23)n/2⋅2n+n=c(23)n−1n−c(23)n−1+c⋅(23)n/2⋅2n+n≤c⋅(23)nn。
当
c
≥
n
/
(
(
3
2
)
n
−
1
−
(
3
2
)
n
/
2
⋅
n
2
)
c \ge n/((\frac{3}{2})^{n-1}-(\frac{3}{2})^{n/2}\cdot\frac{n}{2})
c≥n/((23)n−1−(23)n/2⋅2n) 时,上式最后一步成立。即证。
4.4-6 使用递归树证明递归式
T
(
n
)
=
T
(
n
/
3
)
+
T
(
2
n
/
3
)
+
c
n
T(n) = T(n/3) + T(2n/3) + cn
T(n)=T(n/3)+T(2n/3)+cn 的解为
Ω
(
n
lg
n
)
\Omega(n\lg n)
Ω(nlgn),其中
c
c
c 是常数。
证: 树的深度为
log
3
/
2
n
\log_{3/2}n
log3/2n。
第 0 层的代价为
c
n
cn
cn。
前
log
3
n
\log_3n
log3n 层每层的代价均为
c
n
cn
cn。
所以整个树的代价至少是:
c
n
⋅
log
3
n
=
c
n
lg
n
lg
3
=
Θ
(
n
lg
n
)
cn\cdot \log_3n = cn\frac{\lg n}{\lg3} = \Theta(n\lg n)
cn⋅log3n=cnlg3lgn=Θ(nlgn)。
所以,
T
(
n
)
=
Ω
(
n
lg
n
)
T(n) = \Omega(n\lg n)
T(n)=Ω(nlgn)。
4.4-7 画出
T
(
n
)
=
4
T
(
⌊
n
/
2
⌋
)
+
c
n
T(n) = 4T(\lfloor n/2 \rfloor) + cn
T(n)=4T(⌊n/2⌋)+cn 的递归树,其中
c
c
c 是常数,给出解的渐近紧确界。用代换法证明你给出的界。
解: 树的深度为
lg
n
\lg n
lgn。每层代价为:
第 0 层:
c
n
cn
cn
第 1 层:
4
(
c
n
/
2
)
=
2
c
n
4(cn/2) = 2cn
4(cn/2)=2cn
第 2 层:
4
2
⋅
(
c
n
/
2
2
)
=
4
c
n
4^2\cdot (cn/2^2) = 4cn
42⋅(cn/22)=4cn
……
第
i
i
i 层:
4
i
⋅
(
c
n
/
2
i
)
=
c
n
⋅
2
i
4^i \cdot (cn/2^i) = cn\cdot 2^i
4i⋅(cn/2i)=cn⋅2i
把所有层次的代价加起来,得到整个树的代价:
T
(
n
)
=
c
n
⋅
∑
i
=
0
lg
n
−
1
2
i
=
c
n
(
2
lg
n
−
1
)
=
c
n
2
−
c
n
=
Θ
(
n
2
)
T(n) = cn\cdot \sum_{i=0}^{\lg n-1}2^i = cn(2^{\lg n}-1) = cn^2 - cn = \Theta(n^2)
T(n)=cn⋅∑i=0lgn−12i=cn(2lgn−1)=cn2−cn=Θ(n2)。
使用代换法分别证明
T
(
n
)
=
O
(
n
2
)
T(n) = O(n^2)
T(n)=O(n2) 和
T
(
n
)
=
Ω
(
n
2
)
T(n) = \Omega(n^2)
T(n)=Ω(n2)。
证明过程略。
4.4-8 使用递归树确定递归式
T
(
n
)
=
T
(
n
−
a
)
+
T
(
a
)
+
c
n
T(n) = T(n-a) + T(a) + cn
T(n)=T(n−a)+T(a)+cn 的渐近紧确解,其中常数
a
≥
1
a \ge 1
a≥1,
c
>
0
c>0
c>0。
解: 令
T
(
a
)
=
b
T(a) = b
T(a)=b 是最小子问题运行时间,其中
b
b
b 是常量。
令
n
−
a
i
=
a
n-ai = a
n−ai=a,得
i
=
n
/
a
−
1
i = n/a-1
i=n/a−1,所以递归树有
n
/
a
n/a
n/a 层。
递归树的每层代价如下:
第 0 层:
c
n
cn
cn
第 1 层:
c
(
n
−
a
)
+
b
=
c
n
−
c
a
+
b
c(n-a)+b = cn-ca+b
c(n−a)+b=cn−ca+b
第 2 层:
c
(
n
−
2
a
)
+
2
b
=
c
n
−
2
c
a
+
2
b
c(n-2a)+2b = cn-2ca + 2b
c(n−2a)+2b=cn−2ca+2b
……
第
i
i
i 层:
c
n
−
c
a
⋅
i
+
b
⋅
i
cn-ca\cdot i+b\cdot i
cn−ca⋅i+b⋅i
把所有层次的代价加起来,得到整个树的代价:
T
(
n
)
=
c
n
⋅
(
n
/
a
)
+
(
b
−
c
a
)
∑
i
=
0
n
/
a
−
1
i
=
c
n
2
/
a
+
(
b
−
c
a
)
n
/
a
(
n
/
a
−
1
)
2
=
(
c
/
2
a
+
b
/
2
a
2
)
⋅
n
2
+
(
c
/
2
−
b
/
2
a
)
⋅
n
=
Θ
(
n
2
)
T(n) = cn\cdot(n/a) + (b-ca)\sum_{i=0}^{n/a-1}i \\ =cn^2/a + (b-ca)\frac{n/a(n/a-1)}{2} \\ =(c/2a+b/2a^2)\cdot n^2 +(c/2-b/2a)\cdot n \\ =\Theta(n^2)
T(n)=cn⋅(n/a)+(b−ca)∑i=0n/a−1i=cn2/a+(b−ca)2n/a(n/a−1)=(c/2a+b/2a2)⋅n2+(c/2−b/2a)⋅n=Θ(n2)
4.4-9 使用递归树确定递归式
T
(
n
)
=
T
(
α
n
)
+
T
(
(
1
−
α
)
n
)
+
c
n
T(n) = T(\alpha n) + T((1-\alpha)n) + cn
T(n)=T(αn)+T((1−α)n)+cn 的渐近紧确解,其中常数
0
<
α
<
1
0 < \alpha < 1
0<α<1,
c
>
0
c>0
c>0。
解: 不妨设
α
≥
1
−
α
\alpha \ge 1-\alpha
α≥1−α,则有
0
<
1
−
α
≤
1
/
2
0 < 1-\alpha \le 1/2
0<1−α≤1/2,
1
/
2
≤
α
<
1
1/2 \le \alpha < 1
1/2≤α<1。
递归树的前
log
1
/
(
1
−
α
)
n
\log_{1/(1-\alpha)}n
log1/(1−α)n 层是完全递归树,每层代价为
c
n
cn
cn,所以猜测
Ω
(
n
log
1
/
(
1
−
α
)
n
)
=
Ω
(
n
lg
n
)
\Omega(n \log_{1/(1-\alpha)}n) = \Omega(n\lg n)
Ω(nlog1/(1−α)n)=Ω(nlgn)。
递归树有
log
1
/
α
n
\log_{1/\alpha}n
log1/αn 层,每层代价
≤
c
n
\le cn
≤cn,所以猜测
O
(
n
log
1
/
α
n
)
=
O
(
n
lg
n
)
O(n\log_{1/\alpha}n) = O(n\lg n)
O(nlog1/αn)=O(nlgn)。
现在使用替换法证明
T
(
n
)
=
Θ
(
n
lg
n
)
T(n) = \Theta(n\lg n)
T(n)=Θ(nlgn)。
为了证明上界,需要证明存在常数
d
>
0
d>0
d>0,有
T
(
n
)
≤
d
n
lg
n
T(n) \le dn\lg n
T(n)≤dnlgn。
T
(
n
)
=
T
(
α
n
)
+
T
(
(
1
−
α
)
n
)
+
c
n
≤
d
α
n
lg
(
α
n
)
+
d
(
1
−
α
)
n
lg
(
(
1
−
α
)
n
)
+
c
n
=
d
α
n
lg
α
+
d
α
n
lg
n
+
d
(
1
−
α
)
n
lg
(
1
−
α
)
+
d
(
1
−
α
)
n
lg
n
+
c
n
=
d
n
lg
n
+
d
n
(
α
lg
α
+
(
1
−
α
)
lg
(
1
−
α
)
)
+
c
n
≤
d
n
lg
n
T(n) = T(\alpha n) + T((1-\alpha)n) + cn \\ \le d\alpha n \lg(\alpha n) + d(1-\alpha)n\lg((1-\alpha)n) + cn \\ =d\alpha n\lg\alpha + d\alpha n\lg n + d(1-\alpha)n\lg(1-\alpha) + d(1-\alpha)n\lg n + cn \\ =dn\lg n + dn(\alpha\lg\alpha + (1-\alpha)\lg(1-\alpha)) + cn \\ \le dn\lg n
T(n)=T(αn)+T((1−α)n)+cn≤dαnlg(αn)+d(1−α)nlg((1−α)n)+cn=dαnlgα+dαnlgn+d(1−α)nlg(1−α)+d(1−α)nlgn+cn=dnlgn+dn(αlgα+(1−α)lg(1−α))+cn≤dnlgn,
如果
d
n
(
α
lg
α
+
(
1
−
α
)
lg
(
1
−
α
)
)
+
c
n
≤
0
dn(\alpha\lg\alpha + (1-\alpha)\lg(1-\alpha)) + cn \le 0
dn(αlgα+(1−α)lg(1−α))+cn≤0,这个条件等于
d
(
α
lg
α
+
(
1
−
α
)
lg
(
1
−
α
)
)
≤
−
c
d(\alpha\lg\alpha + (1-\alpha)\lg(1-\alpha)) \le -c
d(αlgα+(1−α)lg(1−α))≤−c。
因为
1
/
2
≤
α
<
1
1/2 \le \alpha < 1
1/2≤α<1,
0
<
1
−
α
≤
1
/
2
0 < 1-\alpha \le 1/2
0<1−α≤1/2,则有
lg
α
<
0
\lg \alpha < 0
lgα<0,
lg
(
1
−
α
)
<
0
\lg(1-\alpha) < 0
lg(1−α)<0。
所以
d
(
α
lg
α
+
(
1
−
α
)
lg
(
1
−
α
)
)
<
0
d(\alpha\lg\alpha + (1-\alpha)\lg(1-\alpha)) < 0
d(αlgα+(1−α)lg(1−α))<0,
所以
d
≥
−
c
α
lg
α
+
(
1
−
α
)
lg
(
1
−
α
)
d \ge \frac{-c}{\alpha\lg\alpha + (1-\alpha)\lg(1-\alpha)}
d≥αlgα+(1−α)lg(1−α)−c。
右边的分数是一个正的常数,所以只要
d
d
d 的值大于等于这个分数就足够了。
为了证明下界,需要证明存在常数
d
>
0
d>0
d>0,有
T
(
n
)
≥
d
n
lg
n
T(n) \ge dn\lg n
T(n)≥dnlgn。
可以使用与上界相同的证明,将
≥
\ge
≥ 替换
≤
\le
≤,我们得到的要求是
0
<
d
≤
−
c
α
lg
α
+
(
1
−
α
)
lg
(
1
−
α
)
0 < d \le \frac{-c}{\alpha\lg\alpha + (1-\alpha)\lg(1-\alpha)}
0<d≤αlgα+(1−α)lg(1−α)−c。
综上所述,得
T
(
n
)
=
Θ
(
n
lg
n
)
T(n) = \Theta(n\lg n)
T(n)=Θ(nlgn)。
4.5 主方法求解递归式
主方法提供了求解如下形式的递归式的“食谱”方法:
T
(
n
)
=
a
T
(
n
/
b
)
+
f
(
n
)
T(n) = aT(n/b) + f(n)
T(n)=aT(n/b)+f(n), (4.20)
其中,常数
a
≥
1
a \ge 1
a≥1 且
b
>
1
b > 1
b>1,
f
(
n
)
f(n)
f(n) 是渐近正函数。
主定理
主方法依赖于下面的定理。
定理 4.1(主定理)
设
a
≥
1
a \ge 1
a≥1 和
b
>
1
b > 1
b>1 为常数,设
f
(
n
)
f(n)
f(n) 是一个常数,设
T
(
n
)
T(n)
T(n) 由递归式
T
(
n
)
=
a
T
(
n
/
b
)
+
f
(
n
)
T(n) = aT(n/b) + f(n)
T(n)=aT(n/b)+f(n)
对非负整数定义。其中
n
/
b
n/b
n/b 解释为
⌊
n
/
b
⌋
\lfloor n/b \rfloor
⌊n/b⌋ 或
⌈
n
/
b
⌉
\lceil n/b \rceil
⌈n/b⌉。那么
T
(
n
)
T(n)
T(n) 有下面的渐近界:
- 若存在常数 ϵ > 0 \epsilon > 0 ϵ>0,有 f ( n ) = O ( n log b a − ϵ ) f(n) = O(n^{\log_b a - \epsilon}) f(n)=O(nlogba−ϵ),则 T ( n ) = Θ ( n log b a ) T(n) = \Theta(n^{\log_b a}) T(n)=Θ(nlogba)。
- 若 f ( n ) = Θ ( n log b a ) f(n) = \Theta(n^{\log_b a}) f(n)=Θ(nlogba),则 T ( n ) = Θ ( n log b a lg n ) T(n) = \Theta(n^{\log_b a}\lg n) T(n)=Θ(nlogbalgn)。
- 若存在常数 ϵ > 0 \epsilon > 0 ϵ>0,有 f ( n ) = Ω ( n log b a + ϵ ) f(n) = \Omega(n^{\log_b a + \epsilon}) f(n)=Ω(nlogba+ϵ),且存在常数 c < 1 c < 1 c<1,对所有足够大的 n n n,有 a f ( n / b ) ≤ c f ( n ) af(n/b) \le cf(n) af(n/b)≤cf(n),则 T ( n ) = Θ ( f ( n ) ) T(n) = \Theta(f(n)) T(n)=Θ(f(n))。
练习
4.5-1 使用主方法给出下列递归式的紧确渐近界。
a.
T
(
n
)
=
2
T
(
n
/
4
)
+
1
T(n) = 2T(n/4) + 1
T(n)=2T(n/4)+1。
b.
T
(
n
)
=
2
T
(
n
/
4
)
+
n
T(n) = 2T(n/4) + \sqrt{n}
T(n)=2T(n/4)+n。
c.
T
(
n
)
=
2
T
(
n
/
4
)
+
n
T(n) = 2T(n/4) + n
T(n)=2T(n/4)+n。
d.
T
(
n
)
=
2
T
(
n
/
4
)
+
n
2
T(n) = 2T(n/4) + n^2
T(n)=2T(n/4)+n2。
解:
a
=
2
a = 2
a=2,
b
=
4
b=4
b=4,所以
n
log
b
a
=
n
log
4
2
=
n
1
/
2
=
n
n^{\log_b a} = n^{\log_4 2} = n^{1/2} = \sqrt{n}
nlogba=nlog42=n1/2=n。
a.
f
(
n
)
=
1
f(n)=1
f(n)=1,因为存在
ϵ
=
1
/
4
\epsilon = 1/4
ϵ=1/4,有
f
(
n
)
=
O
(
n
1
/
2
−
ϵ
)
f(n) = O(n^{1/2 - \epsilon})
f(n)=O(n1/2−ϵ),情况 ① 适用,所以
T
(
n
)
=
Θ
(
n
)
T(n) = \Theta(\sqrt{n})
T(n)=Θ(n)。
b.
f
(
n
)
=
n
f(n) = \sqrt{n}
f(n)=n,情况 ② 适用,因为
f
(
n
)
=
Θ
(
n
)
f(n) = \Theta(\sqrt{n})
f(n)=Θ(n),所以
T
(
n
)
=
n
lg
n
T(n) = \sqrt{n}\lg n
T(n)=nlgn。
c.
f
(
n
)
=
n
f(n) = n
f(n)=n,存在
ϵ
=
1
/
2
\epsilon = 1/2
ϵ=1/2,有
f
(
n
)
=
Ω
(
n
1
/
2
+
ϵ
)
f(n) = \Omega(n^{1/2+\epsilon})
f(n)=Ω(n1/2+ϵ),
且对于足够大的
n
n
n,有
a
f
(
n
/
b
)
=
2
(
n
/
4
)
=
(
1
/
2
)
n
≤
(
1
/
2
)
f
(
n
)
af(n/b) = 2(n/4) = (1/2)n \le (1/2)f(n)
af(n/b)=2(n/4)=(1/2)n≤(1/2)f(n),存在
c
=
1
/
2
c = 1/2
c=1/2。
因此,情况 ③ 适用,所以
T
(
n
)
=
Θ
(
n
)
T(n) = \Theta(n)
T(n)=Θ(n)。
d.
f
(
n
)
=
n
2
f(n) = n^2
f(n)=n2,存在
ϵ
=
1
\epsilon = 1
ϵ=1,有
f
(
n
)
=
Ω
(
n
1
/
2
+
ϵ
)
f(n) = \Omega(n^{1/2+\epsilon})
f(n)=Ω(n1/2+ϵ),
且对于足够大的
n
n
n,有
a
f
(
n
/
b
)
=
2
(
n
/
4
)
2
=
(
1
/
8
)
n
2
≤
(
1
/
8
)
f
(
n
)
af(n/b) = 2(n/4)^2 = (1/8)n^2 \le (1/8)f(n)
af(n/b)=2(n/4)2=(1/8)n2≤(1/8)f(n),存在
c
=
1
/
8
c = 1/8
c=1/8。
因此,情况 ③ 适用,所以
T
(
n
)
=
Θ
(
n
2
)
T(n) = \Theta(n^2)
T(n)=Θ(n2)。
4.5-2 Caesar 教授想要开发一个比 Strassen 算法渐近更快的矩阵相乘算法。他的算法将使用分治方法,将每个矩阵分割成
n
/
4
×
n
/
4
n/4 \times n/4
n/4×n/4 的子矩阵,分割和结合步骤花费
Θ
(
n
2
)
\Theta(n^2)
Θ(n2) 时间。为了打败 Strassen 算法,他需要确定他的算法需要创建多少个子问题。如果他的算法创建
a
a
a 个子问题,那么运行时间
T
(
n
)
T(n)
T(n) 的递归式为
T
(
n
)
=
a
T
(
n
/
4
)
+
Θ
(
n
2
)
T(n) = aT(n/4) + \Theta(n^2)
T(n)=aT(n/4)+Θ(n2)。Caesar 教授的算法要比 Strassen 算法渐近更快,
a
a
a 的最大整数值是多少?
解: Strassen 算法的运行时间为
S
(
n
)
=
Θ
(
n
lg
7
)
S(n) = \Theta(n^{\lg7})
S(n)=Θ(nlg7)。
2.80
<
lg
7
<
2.81
2.80 < \lg7 < 2.81
2.80<lg7<2.81。
使用主方法解递归式
T
(
n
)
=
a
T
(
n
/
4
)
+
Θ
(
n
2
)
T(n) = aT(n/4) + \Theta(n^2)
T(n)=aT(n/4)+Θ(n2),比较
n
2
n^{2}
n2 与
n
log
4
a
n^{\log_4 a}
nlog4a。
a. 如果
log
4
a
=
2
\log_4 a = 2
log4a=2,符合情况②,
T
(
n
)
=
Θ
(
n
2
lg
n
)
T(n) = \Theta(n^2\lg n)
T(n)=Θ(n2lgn)。此时,
a
=
16
a = 16
a=16,
T
(
n
)
=
o
(
n
lg
7
)
T(n) = o(n^{\lg7})
T(n)=o(nlg7)。(因为
lg
n
=
o
(
n
0.8
)
\lg n = o(n^{0.8})
lgn=o(n0.8))
b. 如果
log
4
a
<
2
\log_4 a < 2
log4a<2,符合情况③,
T
(
n
)
=
Θ
(
n
2
)
T(n) = \Theta(n^2)
T(n)=Θ(n2)。此时,
a
<
16
a < 16
a<16,
T
(
n
)
=
o
(
n
lg
7
)
T(n) = o(n^{\lg7})
T(n)=o(nlg7)。
c. 如果
log
4
a
>
2
\log_4 a > 2
log4a>2,符合情况①,
T
(
n
)
=
Θ
(
n
log
4
a
)
T(n) = \Theta(n^{\log_4 a})
T(n)=Θ(nlog4a)。此时,
a
>
16
a > 16
a>16。当
log
4
a
<
lg
7
\log_4a < \lg7
log4a<lg7 时,
a
<
49
a<49
a<49,
T
(
n
)
=
o
(
n
lg
7
)
T(n) = o(n^{\lg7})
T(n)=o(nlg7)。
a
a
a 的最大值为 48。
综上,
a
a
a 的最大整数值为 48,比 Strassen 算法渐近更快。
4.5-3 使用主方法证明二分递归式
T
(
n
)
=
T
(
n
/
2
)
+
Θ
(
1
)
T(n) = T(n/2) + \Theta(1)
T(n)=T(n/2)+Θ(1) 的解是
T
(
n
)
=
Θ
(
lg
n
)
T(n) = \Theta(\lg n)
T(n)=Θ(lgn)。(见练习 2.3-5 二分查找的描述。)
证:
a
=
1
a=1
a=1,
b
=
2
b=2
b=2,
f
(
n
)
=
Θ
(
1
)
f(n) = \Theta(1)
f(n)=Θ(1)。所以有
n
log
b
a
=
n
log
2
1
=
n
0
=
1
n^{\log_ba} = n^{\log_2 1} = n^0 = 1
nlogba=nlog21=n0=1。
情况②适用,因为
f
(
n
)
=
Θ
(
1
)
f(n) = \Theta(1)
f(n)=Θ(1),所以
T
(
n
)
=
Θ
(
lg
n
)
T(n) = \Theta(\lg n)
T(n)=Θ(lgn)。
4.5-4 主方法可以应用到递归式
T
(
n
)
=
4
T
(
n
/
2
)
+
n
2
lg
n
T(n) = 4T(n/2) + n^2\lg n
T(n)=4T(n/2)+n2lgn 吗?为什么?给出一个该递归式的渐近上界。
解: 不可以。
a
=
4
a = 4
a=4,
b
=
2
b = 2
b=2,
f
(
n
)
=
n
2
lg
n
f(n) = n^2\lg n
f(n)=n2lgn。所以,
n
log
b
a
=
n
log
2
4
=
n
2
n^{\log_ba} = n^{\log_2 4} = n^2
nlogba=nlog24=n2。
f
(
n
)
f(n)
f(n) 渐近大于
n
2
n^2
n2,不符合情况①和②。
对于情况③,对于任何正常数
ϵ
\epsilon
ϵ,比值
f
(
n
)
/
n
log
b
a
=
lg
n
f(n)/n^{\log_ba} = \lg n
f(n)/nlogba=lgn 渐近小于
n
ϵ
n^{\epsilon}
nϵ。所以,
f
(
n
)
f(n)
f(n) 多项式小于
n
log
b
a
n^{\log_b a}
nlogba。
因此,这个递归式落入情况②和③之间。该递归式与主定理中的 3 个方法均不符合。、
使用递归树方法猜测递归树的渐近上界。
一共有
lg
n
\lg n
lgn 层。每层代价如下:
第 1 层:
n
2
lg
n
n^2\lg n
n2lgn
第 2 层:
4
(
n
/
2
)
2
lg
(
n
/
4
)
=
n
2
lg
(
n
/
4
)
=
n
2
(
lg
n
−
2
)
4(n/2)^2\lg(n/4) = n^2 \lg(n/4) = n^2(\lg n - 2)
4(n/2)2lg(n/4)=n2lg(n/4)=n2(lgn−2)
……
第
i
i
i 层:
n
2
lg
(
n
/
(
2
i
)
)
=
n
2
(
lg
n
−
i
)
n^2 \lg(n/(2^i)) = n^2(\lg n - i)
n2lg(n/(2i))=n2(lgn−i)
将所有层次的代价加起来,得
T
(
n
)
≤
n
2
lg
n
⋅
lg
n
T(n) \le n^2 \lg n \cdot \lg n
T(n)≤n2lgn⋅lgn。
给出渐近上界:
O
(
n
2
lg
2
n
)
O(n^2 \lg^2n)
O(n2lg2n)。
4.5-5
★
\bigstar
★ 考虑正则条件
a
f
(
n
/
b
)
≤
c
f
(
n
)
af(n/b) \le cf(n)
af(n/b)≤cf(n),其中常数
c
<
1
c < 1
c<1,这是主定理情况3 的部分。给出一个例子,满足以下情况:常数
a
≥
1
a\ge1
a≥1 和
b
>
1
b>1
b>1,一个满足主定理情况3 中除了正则条件外所有条件的函数
f
(
n
)
f(n)
f(n)。
解: 例子:
f
(
n
)
=
2
T
(
n
/
2
)
+
2
n
f(n) =2T(n/2) + 2^n
f(n)=2T(n/2)+2n。
a
=
2
a = 2
a=2,
b
=
2
b = 2
b=2,
f
(
n
)
=
2
n
f(n) = 2^{n}
f(n)=2n,所以
n
log
b
a
=
n
log
2
2
=
n
n^{\log_ba} = n^{\log_2 2} = n
nlogba=nlog22=n。
a
f
(
n
/
b
)
=
2
⋅
2
n
−
1
=
2
n
>
c
⋅
2
n
=
c
⋅
f
(
n
)
af(n/b) = 2\cdot 2^{n-1} = 2^{n} > c\cdot 2^n = c\cdot f(n)
af(n/b)=2⋅2n−1=2n>c⋅2n=c⋅f(n),对于所有的
c
<
1
c<1
c<1。不满足正则条件,符合题意。
存在常数
ϵ
>
0
\epsilon > 0
ϵ>0,有
f
(
n
)
=
2
n
=
Ω
(
n
1
+
ϵ
)
f(n) = 2^n = \Omega(n^{1+\epsilon})
f(n)=2n=Ω(n1+ϵ),因为对任意实数
a
>
1
a > 1
a>1 和
b
b
b,有
n
b
=
o
(
a
n
)
n^b = o(a^n)
nb=o(an)。
所以满足主定理情况3 中除正则条件外的所有条件,符合题意。
学习笔记目录:【算法导论】目录