4.5 用主方法求解递归式
一.
1.主定理
令
a
≥
1
a≥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(\frac{n}{b})+f(n)
T(n)=aT(bn)+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) 有如下渐近线:
1. 若对某个常数
ϵ
>
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) 。
2. 若
f
(
n
)
=
Θ
(
n
log
b
a
)
f(n)=\Theta(n^{\log_{b}a})
f(n)=Θ(nlogba) ,则
T
(
n
)
=
Θ
(
n
log
a
b
lg
n
)
T(n)=\Theta(n^{\log_{a}b}\lg n)
T(n)=Θ(nlogablgn) 。
3. 若对某个常数
ϵ
>
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)≤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
解:四个式子都需要与
n
log
4
1
/
2
=
n
n^{\log_4 1/2}=\sqrt n
nlog41/2=n 做出比较。
a. 由于
1
=
O
(
n
1
/
2
−
ϵ
)
1=O(n^{1/2-\epsilon})
1=O(n1/2−ϵ) ,其中
0
<
ϵ
≤
1
/
2
0<\epsilon≤1/2
0<ϵ≤1/2 ,故而
T
(
n
)
=
Θ
(
n
)
T(n)=\Theta(\sqrt n)
T(n)=Θ(n) 。
b. 由于
1
=
Θ
(
n
1
/
2
)
1=\Theta(n^{1/2})
1=Θ(n1/2) ,故而
T
(
n
)
=
Θ
(
n
lg
n
)
T(n)=\Theta(\sqrt n\lg n)
T(n)=Θ(nlgn) 。
c. 由于
1
=
Ω
(
n
1
/
2
+
ϵ
)
1=\Omega(n^{1/2+\epsilon})
1=Ω(n1/2+ϵ) ,其中
0
<
ϵ
≤
1
/
2
0<\epsilon≤1/2
0<ϵ≤1/2 ,故而
T
(
n
)
=
Θ
(
n
)
T(n)=\Theta(n)
T(n)=Θ(n) 。
d. 由于
1
=
O
(
n
1
/
2
−
ϵ
)
1=O(n^{1/2-\epsilon})
1=O(n1/2−ϵ) ,其中
0
<
ϵ
≤
2
0<\epsilon≤2
0<ϵ≤2 ,故而
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 的最大整数值应是多少?
解:关键在于讨论 n log 4 a n^{\log_4 a} nlog4a 与 Θ ( n lg 7 ) \Theta(n^{\lg7}) Θ(nlg7) 的关系,其中 Strassen 算法时间复杂度为 Θ ( n lg 7 ) \Theta(n^{\lg 7}) Θ(nlg7) 。若 a = 49 a=49 a=49 ,则 n lg 7 = Θ ( n lg 7 ) n^{\lg7}=\Theta(n^{\lg 7}) nlg7=Θ(nlg7) ,而若 a < 49 , n log 4 a = O ( n lg 7 − ϵ ) a<49,n^{\log_4 a}=O(n^{\lg 7-\epsilon}) a<49,nlog4a=O(nlg7−ϵ) ,其中 0 < ϵ < lg 7 0<\epsilon<\lg7 0<ϵ<lg7 ,从而 T ( n ) = Θ ( n lg 7 ) T(n)=\Theta(n^{\lg7}) T(n)=Θ(nlg7) 。从而 a a a 的最大整数值为 48 48 48 。
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 2.3-5 2.3−5 )
证明:由于 log 2 1 = Θ ( 1 ) \log_2 1=\Theta(1) log21=Θ(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 吗?请说明为什么可以或者为什么不可以。给出这个递归式的一个渐近上界。
解:不可以。由于
n
2
lg
n
=
O
(
n
log
2
4
)
=
O
(
n
2
)
n^2\lg n=O(n^{\log_2 4})=O(n^2)
n2lgn=O(nlog24)=O(n2) 并不是多项式的渐近上界,于是不符合主方法的三个条件。
由递归树猜想结果为
Θ
(
n
2
lg
2
n
)
\Theta(n^2\lg^2n)
Θ(n2lg2n) 。假设当
n
<
m
n<m
n<m 时
T
(
n
)
≤
c
n
2
lg
2
n
T(n)≤cn^2\lg^2n
T(n)≤cn2lg2n ,那么当
n
=
m
n=m
n=m 时,
T
(
m
)
=
4
T
(
m
/
2
)
+
m
2
lg
m
≤
4
c
(
m
2
)
2
lg
2
m
2
+
m
2
lg
m
≤
c
m
2
lg
2
m
−
(
2
c
−
1
)
m
2
lg
m
+
c
m
2
≤
c
m
2
lg
m
取c≥1/lg 2
\begin{aligned}T(m)&=4T(m/2)+m^2\lg m\\ &≤4c(\frac{m}{2})^2\lg^2\frac{m}{2}+m^2\lg m\\ &≤cm^2\lg^2m-(2c-1)m^2\lg m+cm^2\\ &≤cm^2\lg m&\text{取c≥1/lg 2} \end{aligned}
T(m)=4T(m/2)+m2lgm≤4c(2m)2lg22m+m2lgm≤cm2lg2m−(2c−1)m2lgm+cm2≤cm2lgm取c≥1/lg 2
4.5-5
考虑主定理情况 3 3 3 的一部分:对某个常数 c < 1 c<1 c<1 ,正则条件 a f ( n / b ) ≤ c f ( n ) af(n/b)≤cf(n) af(n/b)≤cf(n) 是否成立。给出一个例子,其中常数 a ≥ 1 , b > 1 a≥1,b>1 a≥1,b>1 且函数 f ( n ) f(n) f(n) 满足主定理情况 3 3 3 中除正则条件外的所有条件。
解:确定 a = 1 , b = 2 a=1,b=2 a=1,b=2 且 f ( n ) = n ( 2 − cos n ) f(n)=n(2-\cos n) f(n)=n(2−cosn) ,此时 n 2 ( 2 − cos n 2 ) ≤ c n \frac{n}{2}(2-\cos\frac{n}{2})≤cn 2n(2−cos2n)≤cn 1 − c o s ( n / 2 ) 2 ≤ c \frac{1-cos(n/2)}{2}≤c 21−cos(n/2)≤c 1 − c o s ( n / 2 ) 2 ≤ c 1-\frac{cos(n/2)}{2}≤c 1−2cos(n/2)≤c 因而 c ≥ 1 c≥1 c≥1 ,然而 c < 1 c < 1 c<1 。