(更多的递归式例子)对下列每个递归式,给出
T
(
n
)
T(n)
T(n)的渐近上界和下界。假定对足够小的
n
n
n,
T
(
n
)
T(n)
T(n)是常数。给出尽量紧确的界,并验证其正确性。
a.
T
(
n
)
=
4
T
(
n
/
3
)
+
n
l
g
n
T(n)=4T(n/3)+n{\rm lg}n
T(n)=4T(n/3)+nlgn
b.
T
(
n
)
=
3
T
(
n
/
3
)
+
n
/
l
g
n
T(n)=3T(n/3)+n/{\rm lg}n
T(n)=3T(n/3)+n/lgn
c.
T
(
n
)
=
4
T
(
n
/
2
)
+
n
2
n
T(n)=4T(n/2)+n^2\sqrt{n}
T(n)=4T(n/2)+n2n
d.
T
(
n
)
=
3
T
(
n
/
3
−
2
)
+
n
/
2
T(n)=3T(n/3-2)+n/2
T(n)=3T(n/3−2)+n/2
e.
T
(
n
)
=
2
T
(
n
/
2
)
+
n
/
l
g
n
T(n)=2T(n/2)+n/{\rm lg}n
T(n)=2T(n/2)+n/lgn
f.
T
(
n
)
=
T
(
n
/
2
)
+
T
(
n
/
4
)
+
T
(
n
/
8
)
+
n
T(n)=T(n/2)+T(n/4)+T(n/8)+n
T(n)=T(n/2)+T(n/4)+T(n/8)+n
g.
T
(
n
)
=
T
(
n
−
1
)
+
1
/
n
T(n)=T(n-1)+1/n
T(n)=T(n−1)+1/n
h.
T
(
n
)
=
T
(
n
−
1
)
+
l
g
n
T(n)=T(n-1)+{\rm lg}n
T(n)=T(n−1)+lgn
i.
T
(
n
)
=
T
(
n
−
2
)
+
1
/
l
g
n
T(n)=T(n-2)+1/{\rm lg}n
T(n)=T(n−2)+1/lgn
j.
T
(
n
)
=
n
T
(
n
)
+
n
T(n)=\sqrt{n}T(\sqrt{n})+n
T(n)=nT(n)+n
解
a.
T
(
n
)
=
4
T
(
n
/
3
)
+
n
l
g
n
T(n)=4T(n/3)+n{\rm lg}n
T(n)=4T(n/3)+nlgn
应用主定理,根据递归式有
a
=
4
a = 4
a=4,
b
=
3
b = 3
b=3,
f
(
n
)
=
n
l
g
n
f(n) = n{\rm lg}n
f(n)=nlgn,所以有
n
l
o
g
b
a
=
n
l
o
g
3
4
n^{{\rm log}_b a}=n^{{\rm log}_3 4}
nlogba=nlog34。于是有
f
(
n
)
=
n
l
g
n
=
O
(
n
l
o
g
3
4
−
ε
)
=
O
(
n
l
o
g
b
a
−
ε
)
f(n)=n{\rm lg}n=O(n^{{\rm log}_3 4-ε})=O(n^{{\rm log}_b a-ε})
f(n)=nlgn=O(nlog34−ε)=O(nlogba−ε),任取
0
<
ε
<
l
o
g
3
4
−
1
0<ε<{\rm log}_3 4-1
0<ε<log34−1即可。因此,可以应用主定理情况1,于是
T
(
n
)
=
Θ
(
n
l
o
g
b
a
)
=
Θ
(
n
l
o
g
3
4
)
T(n)=Θ(n^{{\rm log}_b a})=Θ(n^{{\rm log}_3 4})
T(n)=Θ(nlogba)=Θ(nlog34)。
b.
T
(
n
)
=
3
T
(
n
/
3
)
+
n
/
l
g
n
T(n)=3T(n/3)+n/{\rm lg}n
T(n)=3T(n/3)+n/lgn
应用递归树方法,递归树如下图所示。
在递归树中,深度为
i
i
i的结点对应规模为
n
/
3
i
n/3^i
n/3i的子问题。当
n
/
3
i
=
1
n/3^i = 1
n/3i=1时,即
i
=
l
o
g
3
n
i = {\rm log}_3n
i=log3n时,子问题规模变为
1
1
1,这对应于叶结点
T
(
1
)
T(1)
T(1),因此叶结点的深度为
l
o
g
3
n
{\rm log}_3n
log3n。
每层的结点数都是上一层的
3
3
3倍,因此深度为i的结点数为
3
i
3^i
3i。并且由于深度为
i
i
i的结点对应的子问题规模为
n
/
3
i
n/3^i
n/3i,故深度为
i
i
i的每个结点的代价为
c
(
n
/
3
i
)
/
l
g
(
n
/
3
i
)
c(n/3^i)/{\rm lg}(n/3^i)
c(n/3i)/lg(n/3i)。因此,除叶结点外,深度为
i
i
i的所有结点的代价之和为
3
i
•
(
c
(
n
/
3
i
)
/
l
g
(
n
/
3
i
)
)
=
c
n
/
(
l
g
n
−
i
•
l
g
3
)
3^i•(c(n/3^i)/{\rm lg}(n/3^i))=cn/({\rm lg}n-i•{\rm lg}3)
3i•(c(n/3i)/lg(n/3i))=cn/(lgn−i•lg3)。又由于深度为
i
i
i的结点数为
3
i
3^i
3i,并且叶结点深度为
l
o
g
3
n
{\rm log}_3n
log3n,故叶结点一共有
3
l
o
g
3
n
=
n
3^{{\rm log}_3n}=n
3log3n=n个,于是所有叶结点的代价之和为
Θ
(
n
)
Θ(n)
Θ(n)。
现在将每一层的代价加起来,得到
代入法证明省略。
c.
T
(
n
)
=
4
T
(
n
/
2
)
+
n
2
n
T(n)=4T(n/2)+n^2\sqrt{n}
T(n)=4T(n/2)+n2n
应用主定理,根据递归式有
a
=
4
a = 4
a=4,
b
=
2
b = 2
b=2,
f
(
n
)
=
n
2
n
=
n
2.5
f(n)=n^2\sqrt{n}=n^{2.5}
f(n)=n2n=n2.5,所以有
n
l
o
g
b
a
=
n
l
o
g
2
4
=
n
2
n^{{\rm log}_ba}=n^{{\rm log}_2 4}=n^2
nlogba=nlog24=n2。于是有
f
(
n
)
=
n
2.5
=
Ω
(
n
2
+
ε
)
=
Ω
(
n
l
o
g
b
a
+
ε
)
f(n)=n^{2.5}=Ω(n^{2+ε})=Ω(n^{{\rm log}_b a+ε})
f(n)=n2.5=Ω(n2+ε)=Ω(nlogba+ε),其中ε = 0.5。并且当
1
/
2
≤
c
<
1
1/\sqrt{2}≤c<1
1/2≤c<1时,有
a
f
(
n
/
b
)
=
4
f
(
n
/
2
)
=
4
•
(
n
/
2
)
2.5
=
n
2.5
/
2
≤
c
f
(
n
)
=
c
n
2.5
af(n/b)=4f(n/2)=4•(n/2)^{2.5}=n^{2.5}/\sqrt{2}≤cf(n)=cn^{2.5}
af(n/b)=4f(n/2)=4•(n/2)2.5=n2.5/2≤cf(n)=cn2.5。因此,可以应用主定理情况3,于是
T
(
n
)
=
Θ
(
f
(
n
)
)
=
Θ
(
n
2.5
)
T(n) = Θ(f(n)) = Θ(n^{2.5})
T(n)=Θ(f(n))=Θ(n2.5)。
d.
T
(
n
)
=
3
T
(
n
/
3
−
2
)
+
n
/
2
T(n)=3T(n/3-2)+n/2
T(n)=3T(n/3−2)+n/2
猜想这个递归式的解应该和递归式
T
(
n
)
=
3
T
(
n
/
3
)
+
n
/
2
T(n)=3T(n/3)+n/2
T(n)=3T(n/3)+n/2的解一致,现在用主方法求解这个新的递归式。根据新的递归式有
a
=
3
a = 3
a=3,
b
=
3
b = 3
b=3,
f
(
n
)
=
n
/
2
f(n) = n/2
f(n)=n/2,所以有
n
l
o
g
b
a
=
n
l
o
g
3
3
=
n
n^{{\rm log}_b a}=n^{{\rm log}_3 3}=n
nlogba=nlog33=n。于是有
f
(
n
)
=
n
/
2
=
Θ
(
n
)
=
Θ
(
n
l
o
g
b
a
)
f(n)=n/2=Θ(n)=Θ(n^{{\rm log}_b a})
f(n)=n/2=Θ(n)=Θ(nlogba)。因此,可以应用主定理情况2,于是
T
(
n
)
=
Θ
(
n
l
o
g
b
a
l
g
n
)
=
Θ
(
n
l
g
n
)
T(n)=Θ(n^{{\rm log}_b a}{\rm lg}n)=Θ(n{\rm lg}n)
T(n)=Θ(nlogbalgn)=Θ(nlgn)。
下面将这个结果代入原递归式进行验证。我们要证明的是:存在正常数
c
1
c_1
c1和
c
2
c_2
c2,使得
c
1
n
l
g
n
≤
T
(
n
)
≤
c
2
n
l
g
n
c_1n{\rm lg}n≤T(n)≤c_2n{\rm lg}n
c1nlgn≤T(n)≤c2nlgn对足够大的
n
n
n都成立。然而,直接证明
c
1
n
l
g
n
≤
T
(
n
)
≤
c
2
n
l
g
n
c_1n{\rm lg}n≤T(n)≤c_2n{\rm lg}n
c1nlgn≤T(n)≤c2nlgn很困难,我们不妨尝试证明
c
1
(
n
+
3
)
l
g
(
n
+
3
)
≤
T
(
n
)
≤
c
2
(
n
+
3
)
l
g
(
n
+
3
)
c_1 (n+3){\rm lg}(n+3)≤T(n)≤c_2 (n+3){\rm lg}(n+3)
c1(n+3)lg(n+3)≤T(n)≤c2(n+3)lg(n+3)。
(1) 证明存在正常数
c
1
c_1
c1,使得
T
(
n
)
≥
c
1
(
n
+
3
)
l
g
(
n
+
3
)
T(n)≥c_1(n+3){\rm lg}(n+3)
T(n)≥c1(n+3)lg(n+3)对足够大的
n
n
n都成立
将归纳假设代入递归式得到
现在要选取合适的
c
1
c_1
c1,使得不等式
c
1
(
n
+
3
)
l
g
(
n
+
3
)
−
c
1
(
n
+
3
)
l
g
3
+
n
/
2
≥
c
1
(
n
+
3
)
l
g
(
n
+
3
)
c_1 (n+3){\rm lg}(n+3)-c_1 (n+3){\rm lg}3+n/2≥c_1 (n+3){\rm lg}(n+3)
c1(n+3)lg(n+3)−c1(n+3)lg3+n/2≥c1(n+3)lg(n+3)成立。对这个不等式做一些变换。
显然,
1
2
(
1
+
3
/
n
)
l
g
3
\frac{1}{2(1+3/n){\rm lg}3}
2(1+3/n)lg31是关于
n
n
n的单调递增函数。为使递归式
T
(
n
)
=
3
T
(
n
/
3
−
2
)
+
n
/
2
T(n)=3T(n/3-2)+n/2
T(n)=3T(n/3−2)+n/2有意义,必须使
n
≥
9
n ≥ 9
n≥9。当
n
=
9
n = 9
n=9时,
1
2
(
1
+
3
/
n
)
l
g
3
\frac{1}{2(1+3/n){\rm lg}3}
2(1+3/n)lg31取得最小值
3
8
l
g
3
\frac{3}{8{\rm lg}3}
8lg33。因此,只要取
c
1
≤
3
8
l
g
3
c_1 ≤ \frac{3}{8{\rm lg}3}
c1≤8lg33,就能使得不等式
c
1
≤
1
2
(
1
+
3
/
n
)
l
g
3
c_1≤\frac{1}{2(1+3/n){\rm lg}3}
c1≤2(1+3/n)lg31成立,此时
T
(
n
)
≥
c
1
(
n
+
3
)
l
g
(
n
+
3
)
T(n)≥c_1 (n+3){\rm lg}(n+3)
T(n)≥c1(n+3)lg(n+3)成立。
(2) 证明存在正常数
c
2
c_2
c2,使得
T
(
n
)
≤
c
2
(
n
+
3
)
l
g
(
n
+
3
)
T(n)≤c_2 (n+3){\rm lg}(n+3)
T(n)≤c2(n+3)lg(n+3)对足够大的
n
n
n都成立
证明过程与前文类似的分析,最终得到:只要取
c
2
≥
1
2
l
g
3
c_2 ≥ \frac{1}{2{\rm lg}3}
c2≥2lg31,就能使得不等式
T
(
n
)
≤
c
2
(
n
+
3
)
l
g
(
n
+
3
)
T(n)≤c_2 (n+3){\rm lg}(n+3)
T(n)≤c2(n+3)lg(n+3)成立。具体证明过程就不赘述。
e.
T
(
n
)
=
2
T
(
n
/
2
)
+
n
/
l
g
n
T(n)=2T(n/2)+n/{\rm lg}n
T(n)=2T(n/2)+n/lgn
该递归式的求解过程与b类似,其解也为
T
(
n
)
=
Θ
(
n
l
g
l
g
n
)
T(n)=Θ(n{\rm lglg}n)
T(n)=Θ(nlglgn)。具体求解过程就不赘述。
f.
T
(
n
)
=
T
(
n
/
2
)
+
T
(
n
/
4
)
+
T
(
n
/
8
)
+
n
T(n)=T(n/2)+T(n/4)+T(n/8)+n
T(n)=T(n/2)+T(n/4)+T(n/8)+n
应用递归树方法。递归树如下图所示。
这不是一棵满二叉树。从第
0
0
0层到第
l
o
g
8
n
{\rm log}_8 n
log8n层是满的,从第
l
o
g
8
n
+
1
{\rm log}_8 n+1
log8n+1层到最底层是不满的。考虑从第
0
0
0层到第
l
o
g
8
n
{\rm log}_8 n
log8n层的代价,有
因此,可以得到
T
(
n
)
T(n)
T(n)的下界为
Ω
(
n
)
Ω(n)
Ω(n)。我们猜测
T
(
n
)
T(n)
T(n)的上界也为
O
(
n
)
O(n)
O(n)。于是,我们猜测的解为
T
(
n
)
=
Θ
(
n
)
T(n) = Θ(n)
T(n)=Θ(n)。下面将这个猜测代入原递归式进行验证。我们要证明的是:存在正常数
c
1
c_1
c1和
c
2
c_2
c2,使得
c
1
n
≤
T
(
n
)
≤
c
2
n
c_1 n≤T(n)≤c_2 n
c1n≤T(n)≤c2n对足够大的
n
n
n都成立。
(1) 证明存在正常数
c
1
c_1
c1,使得
T
(
n
)
≥
c
1
n
T(n)≥c_1 n
T(n)≥c1n对足够大的
n
n
n都成立
将归纳假设代入递归式得到
现在要选取合适的
c
1
c_1
c1,使得不等式
7
8
c
1
n
+
n
≥
c
1
n
\frac{7}{8} c_1 n+n≥c_1 n
87c1n+n≥c1n成立。将这个不等式做一下变换。
显然,只要取
c
1
≤
8
c_1 ≤ 8
c1≤8,就能使得不等式
7
8
c
1
n
+
n
≥
c
1
n
\frac{7}{8} c_1 n+n≥c_1 n
87c1n+n≥c1n成立,此时
T
(
n
)
≥
c
1
n
T(n)≥c_1 n
T(n)≥c1n成立。
(2) 证明存在正常数
c
2
c_2
c2,使得
T
(
n
)
≤
c
2
n
T(n)≤c_2 n
T(n)≤c2n对足够大的
n
n
n都成立
证明过程与上文类似,最终得到:只要取
c
2
≥
8
c_2 ≥ 8
c2≥8,就能使得不等式
T
(
n
)
≤
c
2
n
T(n)≤c_2 n
T(n)≤c2n成立。具体证明过程就不赘述。
g.
T
(
n
)
=
T
(
n
−
1
)
+
1
/
n
T(n)=T(n-1)+1/n
T(n)=T(n−1)+1/n
该递归式可以直接求解。根据递归式可以联立以下方程组。
将方程组中各方程相加,得到
左右两边约去相同项,得到
h.
T
(
n
)
=
T
(
n
−
1
)
+
l
g
n
T(n)=T(n-1)+{\rm lg}n
T(n)=T(n−1)+lgn
该递归式可以直接求解。根据递归式可以联立下列方程组。
将方程组中各方程相加,得到
左右两边约去相同项,得到
i.
T
(
n
)
=
T
(
n
−
2
)
+
1
/
l
g
n
T(n)=T(n-2)+1/{\rm lg}n
T(n)=T(n−2)+1/lgn
本题笔者解答不了,希望有高手能指教。
j.
T
(
n
)
=
n
T
(
n
)
+
n
T(n)=\sqrt{n}T(\sqrt{n})+n
T(n)=nT(n)+n
采用替代变量法。令
n
=
2
m
n = 2^m
n=2m,那么递归式变为
T
(
2
m
)
=
2
m
/
2
∙
T
(
2
m
/
2
)
+
2
m
T(2^m)=2^{m/2}∙T(2^{m/2})+2^m
T(2m)=2m/2∙T(2m/2)+2m。再令
S
(
m
)
=
T
(
2
m
)
S(m)=T(2^m)
S(m)=T(2m),得到
S
(
m
)
=
2
m
/
2
•
S
(
m
/
2
)
+
2
m
S(m)=2^{m/2}•S(m/2)+2^m
S(m)=2m/2•S(m/2)+2m。
递归式
S
(
m
)
=
2
m
/
2
•
S
(
m
/
2
)
+
2
m
S(m)=2^{m/2}•S(m/2)+2^m
S(m)=2m/2•S(m/2)+2m可以直接求解。假设
m
m
m为2的幂,可以联立下列方程组。
将方程组中各方程相加,并约去左右两边的相同项,得到
由于
n
=
2
m
n = 2^m
n=2m,所以有
m
=
l
g
n
m = {\rm lg}n
m=lgn,代入上式得到
算法导论 — 思考题4-3 更多的递归式例子
最新推荐文章于 2023-04-13 16:08:33 发布