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

来源:互联网 发布:中国毫无言论自由知乎 编辑:程序博客网 时间:2024/06/05 18:14

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

4.5-1

a)

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


4.5-3

a=1,b=2,f(n)=Θ(1),logba=0a=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),层数为log3nlog3⁡n,最底层时间为3log3n=n3log3⁡n=n,可得总时间为

T(n)=i=0log3n1nlg(n/3i)=ni=0log3n11lgnilg3=ni=0log3n111+ilg3T(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=1naiai=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,d32d−6≥0,12−c≥0,d−1≥0⇒0<c≤12,d≥3

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

f) 根据递归树可知第i层的规模为(78)in(78)in,最长路径为lgnlg⁡n,最短路径为log8nlog8⁡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层的规模为nin−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层的规模为nin−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层的规模为n2in−2i,层数为n/2n/2,总时间为

T(n)=i=0n/211lg(n2i)=i=2n/211+lgiT(n)=∑i=0n/2−11lg⁡(n−2i)=∑i=2n/211+lg⁡i
ai=11+lgi,Sn=i=2naiai=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,层数为lglgnlg⁡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)关于zz的方程即可得到

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

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

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

d) 由于

Fi=ϕiϕ^i5ϕi5=Fiϕ^i5Fi=ϕ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>zg=2x+y>b=y+2z⇒x>z,这种情况下x个好零件和z个坏零件留下了,剩下的数量x+z(2x+2y+2z)/2x+z≤(2x+2y+2z)/2
  • 如果k是奇数,且多余的零件是坏的,那么g=2x+y>b=y+2z+1x>z+1g=2x+y>b=y+2z+1⇒x>z+1,这种情况有x个好零件和z+1个坏零件留下了,剩下的数量x+z+1(2x+2y+2z+1)/2x+z+1≤⌈(2x+2y+2z+1)/2⌉
  • 如果k是奇数,且多余的零件是好的,那么g=2x+y+1>b=y+2zx+1>zg=2x+y+1>b=y+2z⇒x+1>z,这种情况有x+1个好零件和z个坏零件留下了,剩下的数量x+z+1(2x+2y+2z+1)/2x+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+1k=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<nx′<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=yx=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+1x=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 0
原创粉丝点击