算法导论课后习题解析 第四章 下

算法导论课后习题解析 第四章 下

4.5-1

a)

a=2,b=4,f(n)=Θ(1),logba=12>0 a=2,b=4,f(n)=Θ(1),logb⁡a=12>0
符合情况1, T(n)=Θ(n1/2) T(n)=Θ(n1/2)

b)

a=2,b=4,f(n)=Θ(n1/2),logba=12 a=2,b=4,f(n)=Θ(n1/2),logb⁡a=12
符合情况2, T(n)=Θ(n1/2lgn) T(n)=Θ(n1/2lg⁡n)

c)

a=2,b=4,f(n)=Θ(n),logba=12 a=2,b=4,f(n)=Θ(n),logb⁡a=12
af(nb)=2f(n4)=n2cf(n)(12c<1) af(nb)=2f(n4)=n2≤cf(n)(12≤c<1)
符合情况3, T(n)=Θ(n) T(n)=Θ(n)

d)

a=2,b=4,f(n)=Θ(n2),logba=12 a=2,b=4,f(n)=Θ(n2),logb⁡a=12
af(nb)=2f(n4)=n22cf(n)(12c<1) af(nb)=2f(n4)=n22≤cf(n)(12≤c<1)
符合情况3, T(n)=Θ(n2) T(n)=Θ(n2)


4.5-2
同4.2-4

  • 如果 log4a=2  k=16 log4⁡a=2 ⇒ k=16,那么满足第2种情况, T(n)=Θ(n2lgn)=o(nlg7) T(n)=Θ(n2lg⁡n)=o(nlg⁡7)
  • 如果 log4a<2  k<16 log4⁡a<2 ⇒ k<16,那么满足第1种情况, T(n)=Θ(n2)=o(nlg7) T(n)=Θ(n2)=o(nlg⁡7)
  • 如果 log4a>2  k>16 log4⁡a>2 ⇒ k>16,那么满足第3种情况,这时 log4a<lg7a<4lg7=49 log4⁡a<lg⁡7⇒a<4lg⁡7=49
所以最大的a为48。


4.5-3

a=1,b=2,f(n)=Θ(1),logba=0 a=1,b=2,f(n)=Θ(1),logb⁡a=0
符合情况2, T(n)=Θ(lgn) T(n)=Θ(lg⁡n)


4.5-4

a=4,b=2,logba=2,f(n)=Ω(n2) a=4,b=2,logb⁡a=2,f(n)=Ω(n2)
但不存在 ϵ>0 ϵ>0,使得
f(n)=Ω(n2+ϵ) f(n)=Ω(n2+ϵ)
所以不能使用主方法(master method)来求解。可以利用递归树来估计
T(n)=i=0lgn1n2(lgni)+Θ(n2)=n2lg2nn2lgn12n2lg2n+12n2lgn+Θ(n2)=12n2lg2nn2lgn+Θ(n2)=O(n2lg2n) T(n)=∑i=0lg⁡n−1n2(lg⁡n−i)+Θ(n2)=n2lg2⁡n−n2lg⁡n−12n2lg2⁡n+12n2lg⁡n+Θ(n2)=12n2lg2⁡n−n2lg⁡n+Θ(n2)=O(n2lg2⁡n)


4.5-5
不会,求指教


4-1

a)

a=2,b=2,f(n)=n4=Ω(nlog22+3) a=2,b=2,f(n)=n4=Ω(nlog2⁡2+3)
af(nb)=2(n2)4=18n4cf(n)(18c<1) af(nb)=2(n2)4=18n4≤cf(n)(18≤c<1)
满足情况3,所以 T(n)=Θ(n4) T(n)=Θ(n4)

b)

a=1,b=107,f(n)=n=Ω(nlog10/71+1)af(nb)=7n10cf(n)(710c<1) a=1,b=107,f(n)=n=Ω(nlog10/7⁡1+1)af(nb)=7n10≤cf(n)(710≤c<1)
满足情况3,所以 T(n)=Θ(n) T(n)=Θ(n)

c)

a=16,b=4,f(n)=n2=Θ(nlog416) a=16,b=4,f(n)=n2=Θ(nlog4⁡16)
满足情况2,所以 T(n)=Θ(n2lgn) T(n)=Θ(n2lg⁡n)

d)

a=7,b=3,f(n)=n2=Ω(nlog37+ϵ)(0<ϵ2log37)af(nb)=7(n3)2cf(n)(79c<1) a=7,b=3,f(n)=n2=Ω(nlog3⁡7+ϵ)(0<ϵ≤2−log3⁡7)af(nb)=7(n3)2≤cf(n)(79≤c<1)
满足情况3,所以 T(n)=Θ(n2) T(n)=Θ(n2)

e)

a=7,b=2,f(n)=n2=O(nlog27ϵ)(0<ϵlog272) a=7,b=2,f(n)=n2=O(nlog2⁡7−ϵ)(0<ϵ≤log2⁡7−2)
满足情况1,所以 T(n)=Θ(nlg7) T(n)=Θ(nlg⁡7)

f)

a=2,b=4,f(n)=n=Θ(nlog42) a=2,b=4,f(n)=n=Θ(nlog4⁡2)
满足情况2,所以 T(n)=Θ(nlgn) T(n)=Θ(nlg⁡n)

g) 利用递归树可以看出第i层的规模为n-2i,所以总时间为

T(n)=i=0n/21(n2i)2=n(n+1)2=Θ(n3) T(n)=∑i=0n/2−1(n−2i)2=n(n+1)2=Θ(n3)
证明:假定有 m<n,T(m)clgm3 ∀m<n,T(m)≤clg⁡m3,代入递推式可得
T(n)c(n2)3+n2=c(n36n2+12n8)+n2cn3(6c112c1n)n2cn3(6c14c)n2cn3(n3)(c12) T(n)≤c(n−2)3+n2=c(n3−6n2+12n−8)+n2≤cn3−(6c−1−12c1n)n2≤cn3−(6c−1−4c)n2(n≥3)≤cn3(c≥12)


4-2

a)

  • 方法1的时间递推式为 T(n)=T(n/2)+Θ(1) T(n)=T(n/2)+Θ(1),可以得出 T(n)=O(lgn) T(n)=O(lg⁡n)
  • 方法2的时间递推式为 T(n)=T(n/2)+Θ(n) T(n)=T(n/2)+Θ(n),可以得出 T(n)=O(n) T(n)=O(n)
  • 方法3的时间递推式为 T(n)=T(n/2)+Θ(N) T(n)=T(n/2)+Θ(N),可以得出 T(n)=O(nlgn) T(n)=O(nlg⁡n)

b)

  • 方法1的时间递推式为 T(n)=2T(n/2)+Θ(n) T(n)=2T(n/2)+Θ(n),可以得出 T(n)=O(nlgn) T(n)=O(nlg⁡n)
  • 方法2的时间递推式为 T(n)=2T(n/2)+Θ(n) T(n)=2T(n/2)+Θ(n),可以得出 T(n)=O(nlgn) T(n)=O(nlg⁡n)
  • 方法3的时间递推式为 T(n)=2T(n/2)+Θ(N) T(n)=2T(n/2)+Θ(N),可以得出 T(n)=O(n2) T(n)=O(n2)


4-3

a)

a=4,b=3,f(n)=O(nlog34ϵ)(0<ϵ<log341)) a=4,b=3,f(n)=O(nlog3⁡4−ϵ)(0<ϵ<log3⁡4−1))
满足情况1,所以 T(n)=Θ(nlog34) T(n)=Θ(nlog3⁡4)

b)  a=3,b=3,f(n)=o(n) a=3,b=3,f(n)=o(n),不存在 ϵ>0 ϵ>0,使得 f(n)=O(nlog33ϵ) f(n)=O(nlog3⁡3−ϵ),所以不能使用主方法。
利用递归树来求解,第i层的时间为 n/lg(n/3i) n/lg⁡(n/3i),层数为 log3n log3⁡n,最底层时间为 3log3n=n 3log3⁡n=n,可得总时间为

T(n)=i=0log3n1nlg(n/3i)=ni=0log3n11lgnilg3=ni=0log3n111+ilg3 T(n)=∑i=0log3n−1nlg⁡(n/3i)=n∑i=0log3⁡n−11lg⁡n−ilg⁡3=n∑i=0log3⁡n−111+ilg⁡3
ai=11+ilg3,Sn=i=1nai ai=11+ilg⁡3,Sn=∑i=1nai
1(i+1)lg3<ai<1ilg3 ∵1(i+1)lg⁡3<ai<1ilg⁡3
1lg3ln(n+1)+C1<Sn<1lg3lnn+C2 ∴1lg⁡3ln⁡(n+1)+C1<Sn<1lg⁡3ln⁡n+C2
可以得到
{T(n)<1lg3nlnlog3n+Θ(n)=O(nlglgn)T(n)>1lg3nln(log3n+1)+Θ(n)=Ω(nlglgn) ⇒{T(n)<1lg⁡3nln⁡log3⁡n+Θ(n)=O(nlg⁡lg⁡n)T(n)>1lg⁡3nln⁡(log3⁡n+1)+Θ(n)=Ω(nlg⁡lg⁡n)
所以 T(n)=Θ(nlglgn) T(n)=Θ(nlg⁡lg⁡n)

c)

a=4,b=2,f(n)=n2.5=Ω(nlog24+0.5) a=4,b=2,f(n)=n2.5=Ω(nlog2⁡4+0.5)
af(nb)=4(n2)2.5=12n<cf(n)(12c<1) af(nb)=4(n2)2.5=12n<cf(n)(12≤c<1)
满足情况3,所以 T(n)=Θ(n2n) T(n)=Θ(n2n)

d) 通过递归树可得第0层规模为n,第1层为n-2 \times 3,第2层为n-2 \times 3 - 2 \times 3^2,层数区间为 [log3n1,log3n] [log3⁡n−1,log3⁡n]所以总时间为

T(n)12i=0log3n2(n2j=1i3j)+Θ(n)=12nlog3ni=1log3n13i+112+Θ(n)<12nlog3n32n+Θ(n)=O(nlgn) T(n)≤12∑i=0log3⁡n−2(n−2∑j=1i3j)+Θ(n)=12nlog3⁡n−∑i=1log3⁡n−13i+1−12+Θ(n)<12nlog3⁡n−32n+Θ(n)=O(nlg⁡n)
T(n)12i=0log3n2(n2j=1i3j)+Θ(n)=12n(log3n1)i=1log3n13i+112+Θ(n)>12nlog3n32n+log3n+Θ(n)=Ω(nlgn) T(n)≥12∑i=0log3⁡n−2(n−2∑j=1i3j)+Θ(n)=12n(log3⁡n−1)−∑i=1log3⁡n−13i+1−12+Θ(n)>12nlog3⁡n−32n+log3⁡n+Θ(n)=Ω(nlg⁡n)
证明:假定有 m<n,T(m)cmlgm ∀m<n,T(m)≤cmlg⁡m,代入递推式可得
T(n)3c(n32)lg(n32)+n2<3cn3lgn3+n2=cnlgn(clg312)ncnlgn(c12lg3) T(n)≤3c(n3−2)lg⁡(n3−2)+n2<3cn3lg⁡n3+n2=cnlg⁡n−(clg⁡3−12)n≤cnlg⁡n(c≥12lg⁡3)
假定有 m<n,T(m)c(m+d)log3(m+d) ∀m<n,T(m)≥c(m+d)log3⁡(m+d),代入递推式可得
T(n)3c(n32+d)log3(n32+d)+n2=3c(n3+d2)(log3(n6+3d)1)+n2=cnlog3(n6+3d)+(12c)n+3c(d1)log3(n6+3d)+3c(d1)cnlog3(n+d) T(n)≥3c(n3−2+d)log3⁡(n3−2+d)+n2=3c(n3+d−2)(log3⁡(n−6+3d)−1)+n2=cnlog3⁡(n−6+3d)+(12−c)n+3c(d−1)log3⁡(n−6+3d)+3c(d−1)≥cnlog3⁡(n+d)
其中 2d60,12c0,d100<c12,d3 2d−6≥0,12−c≥0,d−1≥0⇒0<c≤12,d≥3

e) 同b), T(n)=nlglgn T(n)=nlg⁡lg⁡n

f) 根据递归树可知第i层的规模为 (78)in (78)in,最长路径为 lgn lg⁡n,最短路径为 log8n log8⁡n,所以

T(n)<i=0lgn1(78)in=1(7/8)lgn1(7/8)n=8(nn1+lg(7/8))=O(n) T(n)<∑i=0lg⁡n−1(78)in=1−(7/8)lg⁡n1−(7/8)n=8(n−n1+lg⁡(7/8))=O(n)
T(n)>i=0log8n1(78)in=1(7/8)log8n1(7/8)n=8(nn1+log8(7/8))=Ω(n) T(n)>∑i=0log8⁡n−1(78)in=1−(7/8)log8⁡n1−(7/8)n=8(n−n1+log8⁡(7/8))=Ω(n)
证明:假定有 m<n,T(m)cm ∀m<n,T(m)≤cm,代入递推式可得
T(n)cn2+cn4+cn8+n=cn(18c1)ncn(c8) T(n)≤cn2+cn4+cn8+n=cn−(18c−1)n≤cn(c≥8)
假定有 m>n,T(m)cm ∀m>n,T(m)≤cm,代入递推式可得
T(n)cn2+cn4+cn8+n=cn+(118c)ncn(c8) T(n)≥cn2+cn4+cn8+n=cn+(1−18c)n≥cn(c≤8)

g) 根据递归树可知,第i层的规模为 ni n−i,层数为n,总时间为

T(n)=i=0n11ni=i=1n1i=lnn+C=Θ(lgn) T(n)=∑i=0n−11n−i=∑i=1n1i=ln⁡n+C=Θ(lg⁡n)

h) 根据递归树可知,第i层的规模为 ni n−i,层数为n,总时间为

T(n)=i=0n1lg(ni)=i=1nlgi=lg(n!)=Θ(nlgn) T(n)=∑i=0n−1lg⁡(n−i)=∑i=1nlg⁡i=lg⁡(n!)=Θ(nlg⁡n)

i) 根据递归树可知,第i层的规模为 n2i n−2i,层数为 n/2 n/2,总时间为

T(n)=i=0n/211lg(n2i)=i=2n/211+lgi T(n)=∑i=0n/2−11lg⁡(n−2i)=∑i=2n/211+lg⁡i
ai=11+lgi,Sn=i=2nai ai=11+lg⁡i,Sn=∑i=2nai
12lgiai<1lgi ∵12lg⁡i≤ai<1lg⁡i
i=2n1lgin2dxlgxnlgn ∑i=2n1lg⁡i∼∫2ndxlg⁡x∼nlg⁡n
Snnlgn ∴Sn∼nlg⁡n
所以可知 T(n)=Θ(n/lgn) T(n)=Θ(n/lg⁡n)

j) 根据递归树可知,每层的规模都是n,层数为 lglgn lg⁡lg⁡n,所以总时间为

T(n)=nlglgn=Θ(nlglgn) T(n)=nlg⁡lg⁡n=Θ(nlg⁡lg⁡n)


4-4

a)

z+zF(z)+z2F(z)=z+zi=0Fizi+z2i=0Fizi=z+i=0Fizi+1+i=0Fizi+2=z+i=2(Fi2+Fi1)zi=0+z+i=2Fizi=F(z) z+zF(z)+z2F(z)=z+z∑i=0∞Fizi+z2∑i=0∞Fizi=z+∑i=0∞Fizi+1+∑i=0∞Fizi+2=z+∑i=2∞(Fi−2+Fi−1)zi=0+z+∑i=2∞Fizi=F(z)

b) 根据a)的结论,解 F(z) F(z)关于 z z的方程即可得到

F(z)=z1zz2 F(z)=z1−z−z2

c) 根据斐波那契数列(Fibonacci numbers)通项

Fi=ϕiϕ^i5 Fi=ϕi−ϕ^i5
可得
i=0nFizi=i=0nϕiϕ^i5zi ∑i=0nFizi=∑i=0nϕi−ϕ^i5zi

d) 由于

Fi=ϕiϕ^i5ϕi5=Fiϕ^i5 Fi=ϕi−ϕ^i5⇒ϕi5=Fi−ϕ^i5
ϕ^i5<0.5Fi=ϕi5±c(0<c<0.5) ∵ϕ^i5<0.5∴Fi=ϕi5±c(0<c<0.5)
得证。


4-5

a) 由于有一半以上是坏的零件,所以假定现在一共有三个零件,那么其中至少有两个是坏的。假如每个坏的零件在测试别的零件的时候都说是坏的,那么没有一个零件会说对方是好的,由于所有的结果都一样,所以无法判断到底哪个是好的零件。

b) 假如现在有k个零件,将他们两两一组进行测试,然后将出现第一种情况(互相说对方是好的)的零件取任意一个留下,另一个舍弃,其他情况的都不留下。如果零件的数量是奇数,那么没有配对的零件也留下。然后对剩下的零件重复以上操作,直至只剩一个零件,该零件为所求。
分析:一组出现的情况有三种:2个好零件、1好1坏、2个坏零件。假设:

  • 2个好零件有x组
  • 1好1坏有y组
  • 2个坏零件有z组
  • 共有g个好零件,b个坏零件
那么:
  • 如果k是偶数,那么 g=2x+y>b=y+2zx>z g=2x+y>b=y+2z⇒x>z,这种情况下x个好零件和z个坏零件留下了,剩下的数量 x+z(2x+2y+2z)/2 x+z≤(2x+2y+2z)/2
  • 如果k是奇数,且多余的零件是坏的,那么 g=2x+y>b=y+2z+1x>z+1 g=2x+y>b=y+2z+1⇒x>z+1,这种情况有x个好零件和z+1个坏零件留下了,剩下的数量 x+z+1(2x+2y+2z+1)/2 x+z+1≤⌈(2x+2y+2z+1)/2⌉
  • 如果k是奇数,且多余的零件是好的,那么 g=2x+y+1>b=y+2zx+1>z g=2x+y+1>b=y+2z⇒x+1>z,这种情况有x+1个好零件和z个坏零件留下了,剩下的数量 x+z+1(2x+2y+2z+1)/2 x+z+1≤⌈(2x+2y+2z+1)/2⌉
所以,不管什么情况下剩余的好零件都多于坏零件,并且总数量不大于原来的一半,共需 k/2 ⌊k/2⌋次比较。

c) 当找到一个好零件之后只要用它测试其他的零件即可找出其他的好零件。找出一个好零件的时间 T1(n)=T1(n/2)+O(n)O(n) T1(n)=T1(n/2)+O(n)=O(n),找出其他好零件的时间 T2(n)=n1=O(n) T2(n)=n−1=O(n),所以总的时间 T(n)=O(n) T(n)=O(n)


4-6

a) 令 k=i+1,l=j+1 k=i+1,l=j+1显然当

A[i,j]+A[k,l]A[i,l]+A[k,j] A[i,j]+A[k,l]≤A[i,l]+A[k,j]
时有
A[i,j]+A[i+1,j+1]A[i+1,j]+A[i,j+1] A[i,j]+A[i+1,j+1]≤A[i+1,j]+A[i,j+1]
接下来证另一个方向。 假设对于 x<m,y<n x′<m,y′<n,有:
1xx,1yy,A[i,j]+A[i+x,j+y]A[i+x,j]+A[i,j+y] ∀1≤x≤x′,1≤y≤y′,A[i,j]+A[i+x,j+y]≤A[i+x,j]+A[i,j+y]
于是要证对于 x=x+1,y=y x=x′+1,y=y′也成立。根据假设,可知:
A[i,j]+A[i+x,j+y]A[i+x,j]+A[i,j+y](1) (1)A[i,j]+A[i+x′,j+y′]≤A[i+x′,j]+A[i,j+y′]
同时有:
1ky,A[i+x,j+k1]+A[i+x+1,j+k]A[i+x+1,j+k1]+A[i+x,j+k] ∀1≤k≤y′,A[i+x′,j+k−1]+A[i+x′+1,j+k]≤A[i+x′+1,j+k−1]+A[i+x′,j+k]
A[i+x,j]+A[i+x+1,j+y]A[i+x+1,j]+A[i+x,j+y](2) (2)⇒A[i+x′,j]+A[i+x′+1,j+y′]≤A[i+x′+1,j]+A[i+x′,j+y′]
式(1)+式(2):
A[i,j]+A[i+x,j+y]+A[i+x,j]+A[i+x+1,j+y]A[i+x,j]+A[i,j+y]+A[i+x+1,j]+A[i+x,j+y] A[i,j]+A[i+x′,j+y′]+A[i+x′,j]+A[i+x′+1,j+y′]≤A[i+x′,j]+A[i,j+y′]+A[i+x′+1,j]+A[i+x′,j+y′]
A[i,j]+A[i+x+1,j+y]A[i+x+1,j]+A[i+x,j+y] ⇒A[i,j]+A[i+x′+1,j+y′]≤A[i+x′+1,j]+A[i+x′,j+y′]
得证。同理可证对于 x=x,y=y+1 x=x′,y=y+1′也成立。

b) 改动红色的元素

37215332432363413212253091532103168 (37232232216510533430313213964321158)

c) 假设 i,f(i)>f(i+1) ∃i,f(i)>f(i+1),那么有

A[i,f(i)]>A[i+1,f(i+1)] A[i,f(i)]>A[i+1,f(i+1)]
A[i,f(i+1)]+A[i+1,f(i)]>A[i,f(i)]+A[i+1,f(i+1)] ⇒A[i,f(i+1)]+A[i+1,f(i)]>A[i,f(i)]+A[i+1,f(i+1)]
与蒙赫阵列(Monge array)的定义矛盾,所以得证。

d) 由于我们已经知道偶数行最小值的位置,根据c)的结论可知,对于奇数行2k+1, f(2k)f(2k+1)f(2k+2) f(2k)≤f(2k+1)≤f(2k+2),所以只要求该区间元素的最小值即可。

T(n)=i=1m/2(f(2k)f(2k2)+1)m+n=O(m+n) T(n)=∑i=1m/2(f(2k)−f(2k−2)+1)≤m+n=O(m+n)

e) 每次迭代行数减半,所以 T(m)=T(m/2)+O(m+n) T(m)=T(m/2)+O(m+n)

T(n)=i=0lgm1(m2i+n)2m+nlgm=O(m+nlgm)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值