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

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

4.1-1
返回只包含绝对值最小的元素的子数组。

 

4.1-2

1
2
3
4
5
6
7
8
9
10
11
Maximun-Subarray(A)
     max = -infinity
     for  i = 1 to A.length
         sum = 0
         for  j = i to A.length
             sum = sum + A[i]
             if  sum > max
                 max = sum
                 low = i
                 high = j
     return  (low, high, max)

每次内循环都利用上次累加的结果,避免重复运算。外层循环执行n次,第i次外循环内层循环执行n-i+1次,所以总的时间复杂度为 Θ(n2) Θ(n2)

 

4.1-3
这道题 n0 n0的结果因人而异,我这里的结果是 n0=63 n0=63。利用这种方法虽然可以改善总体的运行速度,但是不能够改变两种方法运行时间相同时输入规模的大小。

 

4.1-4
在算法的最后判断最大子数组的总和是否小于零,如果小于零则返回空子数组(empty subarray)。

 

4.1-5
算法的思想就是从前往后累加,如果当前子数组的累加和小于零,则意味着最大子数组(maximun subarray)肯定不包括该子数组,所以果断舍弃,重新开始累加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Maximun-Subarray(A)
     max = 0, sum = 0, cur_low = 1
     for  i = 1 to A.length
         sum = sum + A[i]
         if  sum > max
             max = sum
             low = cur_low
             high = i
         else  if  sum < 0
             cur_low = i + 1
             sum = 0
     if  max > 0
         return  (low, high, max)
     return  NIL

 

4.2-1
突然发现这个算法算起来真够麻烦的。

S1={6}S2={4}S3={12}S4={2}S5={6} S1={6}S2={4}S3={12}S4={−2}S5={6}
S6={8}S7={2}S8={6}S9={6}S10={14} S6={8}S7={−2}S8={6}S9={−6}S10={14}
P1={6}P2={8}P3={72}P4={10}P5={48}P6={12}P7={84} P1={6}P2={8}P3={72}P4={−10}P5={48}P6={−12}P7={−84}
C11={18}C12={14}C21={62}C22={66} C11={18}C12={14}C21={62}C22={66}

 

4.2-2
伪码还是比实际代码简单得多的,不用考虑一些中间存储的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Strassen-Method(A, B)
     n = A.rows
     let C be a new  m*n matrix
     if  n == 1
         c11 = a11 * b11
     else
         S1 = B12 - B22
         S2 = A11 + A12
         S3 = A21 + A22
         S4 = B21 - B11
         S5 = A11 + A22
         S6 = B11 + B22
         S7 = A12 - A22
         S8 = B21 + B22
         S9 = A11 - A21
         S10 = B11 + B12
         P1 = Strassen-Method(A11, S1)
         P2 = Strassen-Method(S2, B22)
         P3 = Strassen-Method(S3, B11)
         P4 = Strassen-Method(A22, S4)
         P5 = Strassen-Method(S5, S6)
         P6 = Strassen-Method(S7, S8)
         P7 = Strassen-Method(S9, S10)
         C11 = P5 + P4 - P2 + P6
         C12 = P1 + P2
         C21 = P3 + P4
         C22 = P5 + P1 - P3 - P7
     return  C

 

4.2-3
如果分割矩阵的时候矩阵的行数或列数为奇数,那么就把一个全零行或列补在矩阵上。最坏的情况下,每次分割都需要补行和列,所以递推公式变为

T(n)=7T(n/2+1)+Θ((n+1)2)=7T(n/2+1)+Θ(n2) T(n)=7T(n/2+1)+Θ((n+1)2)=7T(n/2+1)+Θ(n2)
可得最终时间复杂度保持不变,还是 Θ(nlg7) Θ(nlg⁡7)

 

4.2-4
利用这种方法的递推公式为

T(n)=kT(n/3)+Θ(n2) T(n)=kT(n/3)+Θ(n2)
所以可以根据主方法(master method)算出k

  • 如果 log3k=2  k=9 log3⁡k=2 ⇒ k=9,那么满足第2种情况, T(n)=Θ(n2lgn)=o(nlg7) T(n)=Θ(n2lg⁡n)=o(nlg⁡7)
  • 如果 log3k<2  k<9 log3⁡k<2 ⇒ k<9,那么满足第1种情况, T(n)=Θ(n2)=o(nlg7) T(n)=Θ(n2)=o(nlg⁡7)
  • 如果 log3k>2  k>9 log3⁡k>2 ⇒ k>9,那么满足第3种情况,这时 log3k<lg7k<3lg721 log3⁡k<lg⁡7⇒k<3lg⁡7≈21

所以最大的k为21。

 

4.2-5

  • 第一种情况下的复杂度递推公式为 T(n)=132464T(n/68)+Θ(n2) T(n)=132464T(n/68)+Θ(n2) log681324642.79512849 log68⁡132464≈2.79512849
  • 第二种情况下的复杂度递推公式为 T(n)=143640T(n/70)+Θ(n2) T(n)=143640T(n/70)+Θ(n2) log701436402.79512269 log70⁡143640≈2.79512269
  • 第二种情况下的复杂度递推公式为 T(n)=155424T(n/72)+Θ(n2) T(n)=155424T(n/72)+Θ(n2) log721554242.79514739 log72⁡155424≈2.79514739

所以三种情况都比Strassen的方法稍好,其中第二种方法最好。

 

4.2-6
分别将两个将矩阵拆分为k个 n×n n×n矩阵,然后再利用Strassen方法计算n阶方阵乘法。

A1A2Ak(B1B2Bk)=A1B1A2B1AkB1A1B2A2B2AkB2A1BkA2BkAkBk (A1A2⋮Ak)⋅(B1B2⋯Bk)=(A1B1A1B2⋯A1BkA2B1A2B2⋯A2Bk⋮⋮⋱⋮AkB1AkB2⋯AkBk)
(B1B2Bk)A1A2Ak=(A1B1+A2B2++AkBk) (B1B2⋯Bk)⋅(A1A2⋮Ak)=(A1B1+A2B2+⋯+AkBk)

 

4.2-7
由于 (a+bi)(c+di)=(acbd)+(ad+bc)i (a+bi)(c+di)=(ac−bd)+(ad+bc)i,需要4次乘法,为了节省一次乘法需要利用到之前计算的结果。可以发现 ad+bc=(a+b)(c+d)acbd ad+bc=(a+b)(c+d)−ac−bd,所以只需要计算3次乘法即可。

 

4.3-1
假定有 m<n,T(m)cm2 ∀m<n,T(m)≤cm2,代入递推式可得

T(n)c(n1)2+n=cn2+(12c)n+ccn2(n>0,c1) T(n)≤c(n−1)2+n=cn2+(1−2c)n+c≤cn2(n>0,c≥1)

 

4.3-2
假定有 m<n,T(m)clgm ∀m<n,T(m)≤clg⁡m,代入递推式可得

T(n)clgn2+1clg(n2+1)+1=clg(n2n+2n)+1=clgnc+clgn+2n+1clgnc+clg53+1clgn(n3)(c (1lg53)1) T(n)≤clg⁡⌈n2⌉+1≤clg⁡(n2+1)+1=clg⁡(n2n+2n)+1=clg⁡n−c+clg⁡n+2n+1≤clg⁡n−c+clg⁡53+1(n≥3)≤clg⁡n(c≥ (1−lg⁡53)−1)
或者,假定有 m<n,T(m)clg(md) ∀m<n,T(m)≤clg⁡(m−d),代入递推式可得
T(n)clg(n2d)+1clg(n2d+1)+1=clg(n2d+2)c+1clg(nd)(c1,d2) T(n)≤clg⁡(⌈n2⌉−d)+1≤clg⁡(n2−d+1)+1=clg⁡(n−2d+2)−c+1≤clg⁡(n−d)(c≥1,d≥2)

 

4.3-3
假定有 m<n,T(m)c(m+d)lg(m+d) ∀m<n,T(m)≥c(m+d)lg⁡(m+d),代入递推式可得

T(n)2c(n2+d)lg(n2+d)+n2c(n2+d1)lg(n21+d)+n=2c(n2+d1)(lg(n2+2d)1)+n=cnlg(n2+2d)+(1c)n+2c(d1)lg(n2+2d)+2c(d1)cnlg(n+d) T(n)≥2c(⌊n2⌋+d)lg⁡(⌊n2⌋+d)+n≥2c(n2+d−1)lg⁡(n2−1+d)+n=2c(n2+d−1)(lg⁡(n−2+2d)−1)+n=cnlg⁡(n−2+2d)+(1−c)n+2c(d−1)lg⁡(n−2+2d)+2c(d−1)≥cnlg⁡(n+d)
其中 2d2d,1c0,d10,c00c1,d2 2d−2≥d,1−c≥0,d−1≥0,c≥0⇒0≤c≤1,d≥2

 

4.3-4
假定有 m<n,T(m)cmlgm+d ∀m<n,T(m)≤cmlg⁡m+d,代入递推式可得

T(n)2cn2lgn2+2d+ncnlgn2+n+2d=cnlgn(c1)n+2dcnlgn+d T(n)≤2c⌊n2⌋lg⁡⌊n2⌋+2d+n≤cnlg⁡n2+n+2d=cnlg⁡n−(c−1)n+2d≤cnlg⁡n+d
其中 (c1)n+d0c1,dc1 (c−1)n+d≥0⇒c≥1,d≤c−1,为了保证 T(1)=1c1lg1+d=d T(1)=1≤c⋅1⋅lg⁡1+d=d,所以 d1,cd+1 d≥1,c≥d+1

 

4.3-5
归并排序(merge sort)的时间复杂度递推公式为 T(n)=2T(n/2)+n T(n)=2T(n/2)+n,分别证明其上下界
假定有 m<n,T(m)cmlgm ∀m<n,T(m)≤cmlg⁡m,代入递推式可得

T(n)2cn2lgn2+n=cnlgncn+ncnlgn(c1) T(n)≤2cn2lg⁡n2+n=cnlg⁡n−cn+n≤cnlg⁡n(c≥1)
假定有 m<n,T(m)cmlgm ∀m<n,T(m)≥cmlg⁡m,代入递推式可得
T(n)2cn2lgn2+n=cnlgncn+ncnlgn(c1) T(n)≥2cn2lg⁡n2+n=cnlg⁡n−cn+n≥cnlg⁡n(c≤1)

 

4.3-6
类似于4.3-3,假定有 m<n,T(m)c(md)lg(md) ∀m<n,T(m)≤c(m−d)lg⁡(m−d),代入递推式可得

T(n)2c(n2+17d)lg(n2+17d)+n2c(n2+18d)lg(n2+18d)+n=2c(n2+18d)(lg(n+362d)1)+n=cnlg(n+362d)(c1)n2c(d18)lg(n+362d)2c(d18)cnlg(nd) T(n)≤2c(⌊n2⌋+17−d)lg⁡(⌊n2⌋+17−d)+n≤2c(n2+18−d)lg⁡(n2+18−d)+n=2c(n2+18−d)(lg⁡(n+36−2d)−1)+n=cnlg⁡(n+36−2d)−(c−1)n−2c(d−18)lg⁡(n+36−2d)−2c(d−18)≤cnlg⁡(n−d)
其中 2d36d,c10,d180c1,d36 2d−36≥d,c−1≥0,d−18≥0⇒c≥1,d≥36

 

4.3-7
假定有 m<n,T(m)cmlog34 ∀m<n,T(m)≤cmlog3⁡4,代入递推式可得

T(n)4c(n3)log34+n=cnlog34+ncnlog34 T(n)≤4c(n3)log3⁡4+n=cnlog3⁡4+n≥cnlog3⁡4
证明失败,改变断言式为 m<n,T(m)cmlog34dm ∀m<n,T(m)≤cmlog3⁡4−dm,代入递推式可得
T(n)4c(n3)log3443dn+n=cnlog34dn(13d1)ncnlog34dn(c0,d3) T(n)≤4c(n3)log3⁡4−43dn+n=cnlog3⁡4−dn−(13d−1)n≤cnlog3⁡4−dn(c≥0,d≥3)
得证。

 

4.3-8
这道题目有错误,递推式应该为 T(n)=4T(n/2)+n T(n)=4T(n/2)+n
假定有 m<n,T(m)cm2 ∀m<n,T(m)≤cm2,代入递推式可得

T(n)4c(n2)2+n=cn2+ncn2 T(n)≤4c(n2)2+n=cn2+n≥cn2
证明失败,改变断言式为 m<n,T(m)cm2dm ∀m<n,T(m)≤cm2−dm,代入递推式可得
T(n)4c(n2)24dn2+n=cn2dn(d1)ncn2dn(c0,d1) T(n)≤4c(n2)2−4dn2+n=cn2−dn−(d−1)n≤cn2−dn(c≥0,d≥1)
得证。

 

4.3-9
m=lgn m=lg⁡n,得到 T(2m)=3T(2m/2)+m T(2m)=3T(2m/2)+m,再令 S(m)=T(2m) S(m)=T(2m),得到 S(m)=3S(m/2)+m S(m)=3S(m/2)+m,利用主方法(master method)可以求得 T(n)=T(2m)=S(m)=O(mlg3)=O((lgn)lg3) T(n)=T(2m)=S(m)=O(mlg⁡3)=O((lg⁡n)lg⁡3)

 

4.4-1
第一层 n n,第二层 3/2n 3/2n,第三层 9/4n 9/4n,共 lgn lg⁡n层,最底层有 3lgn=nlg3 3lg⁡n=nlg⁡3个子过程,可得总时间

T(n)=i=0lgn1(32)in+Θ(nlg3)=(3/2)lgn1(3/2)1n+Θ(nlg3)=2(nlg3/21)n+Θ(nlg3)<2nlg3+Θ(nlg3)=O(nlg3) T(n)=∑i=0lg⁡n−1(32)in+Θ(nlg⁡3)=(3/2)lg⁡n−1(3/2)−1n+Θ(nlg⁡3)=2(nlg⁡3/2−1)n+Θ(nlg⁡3)<2nlg⁡3+Θ(nlg⁡3)=O(nlg⁡3)
证明:假定有 m<n,T(m)cmlg3dm ∀m<n,T(m)≤cmlg⁡3−dm,代入递推式可得
T(n)3c(n2)lg33dn+n=cnlg3d(2d1)ncnlg3d(c0,d12) T(n)≤3c(n2)lg⁡3−3dn+n=cnlg⁡3−d−(2d−1)n≤cnlg⁡3−d(c≥0,d≥12)

 

4.4-2
总时间为

T(n)=i=0lgn12in+Θ(n2)2n+Θ(n2)=O(n2) T(n)=∑i=0lg⁡n−12−in+Θ(n2)≤2n+Θ(n2)=O(n2)
证明:假定有 m<n,T(m)cm2 ∀m<n,T(m)≤cm2,代入递推式可得
T(n)c(n2)2+n2=cn2(34c1)n2cn2(c43) T(n)≤c(n2)2+n2=cn2−(34c−1)n2≤cn2(c≥43)

 

4.4-3
第一层 n n,第二层 2n+4×2 2n+4×2,第三层 4n+42×(2+1) 4n+42×(2+1),共 lgn lg⁡n层,最底层有 4lgn=n2 4lg⁡n=n2个子过程,总时间为

T(n)=i=0lgn12in+i=1lgn1(4ij=0i21j)+Θ(n2)i=0lgn12in+i=1lgn14i4+Θ(n2)=2lgn121n+44lgn141+Θ(n2)n2+43n2+Θ(n2)=O(n2) T(n)=∑i=0lg⁡n−12in+∑i=1lg⁡n−1(4i∑j=0i21−j)+Θ(n2)≤∑i=0lg⁡n−12in+∑i=1lg⁡n−14i4+Θ(n2)=2lg⁡n−12−1n+44lg⁡n−14−1+Θ(n2)≤n2+43n2+Θ(n2)=O(n2)
证明:假定有 m<n,T(m)cm2dm ∀m<n,T(m)≤cm2−dm,代入递推式可得
T(n)4c(n2+2)24dn+n=cn2+8cn+16c4dn+n=cn2dn(3d8c)n+16ccn2dn T(n)≤4c(n2+2)2−4dn+n=cn2+8cn+16c−4dn+n=cn2−dn−(3d−8c)n+16c≤cn2−dn
其中 (3d8c1)n16c0c0,n>0,d16c+8cn+n3n (3d−8c−1)n−16c≥0⇒c≥0,n>0,d≥16c+8cn+n3n

 

4.4-4
第i层总时间为 2i(ni) 2i(n−i),共n层,总时间为

T(n)=i=0n2i(ni)=i=0n2ini=1ni2i=2n+1n(2n+1n2n+11)=2n+1+1=O(2n) T(n)=∑i=0n2i(n−i)=∑i=0n2in−∑i=1ni2i=2n+1n−(2n+1n−2n+1−1)=2n+1+1=O(2n)
证明:假定有 m<n,T(m)c2md ∀m<n,T(m)≤c2m−d,代入递推式可得
T(n)2c2n12d+1=c2nd(d1)c2nd(c0,d1) T(n)≤2c2n−1−2d+1=c2n−d−(d−1)≤c2n−d(c≥0,d≥1)

 

4.4-5
第一层 n n,第二层 (3/2)n1 (3/2)n−1,第三层 (9/4)n31/2 (9/4)n−3−1/2,最长的路径n层,由于该递归树不是满的,所以总时间小于满递归树

T(n)i=0n(32)in=(3/2)n+113/21n2n(32)n+1=O(n(32)n) T(n)≤∑i=0n(32)in=(3/2)n+1−13/2−1n≤2n(32)n+1=O(n(32)n)
证明:假定有 m<n,T(m)cm(3/2)m ∀m<n,T(m)≤cm(3/2)m,代入递推式可得
T(n)c(n1)(32)n1+c(n2)(32)n/2+n=cn(32)n12cn(32)n1c(32)n1+12cn(32)n/2+n=cn(32)n12cn(32)n/2((32)n/211)(c(32)n1n)cn(32)n(c1,n2) T(n)≤c(n−1)(32)n−1+c(n2)(32)n/2+n=cn(32)n−12cn(32)n−1−c(32)n−1+12cn(32)n/2+n=cn(32)n−12cn(32)n/2((32)n/2−1−1)−(c(32)n−1−n)≤cn(32)n(c≥1,n≥2)

 

4.4-6
第一层 cn cn,第二层 cn cn,最短路径为 log3n log3⁡n层,所以总时间大于 log3n log3⁡n层的递归树

T(n)i=0log3ncn=cnlog3n=Ω(nlgn) T(n)≥∑i=0log3⁡ncn=cnlog3⁡n=Ω(nlg⁡n)

 

4.4-7
第一层 n n,第二层 2n44n/22n 2n−4≤4⌊n/2⌋≤2n,最长 lgn lg⁡n层,最短 lgn1 lg⁡n−1层,所以总时间

T(n)i=0lgn12icn+Θ(n2)cn2+Θ(n2)=O(n2) T(n)≤∑i=0lg⁡n−12icn+Θ(n2)≤cn2+Θ(n2)=O(n2)
T(n)i=0lgn22icni=1lgn2(cj=0i14i2j)+Θ(n2)Θ(n2)c(n1)22ci=1lgn24i+Θ(n2)c(n1)232c(n1)2+Θ(n2)=Ω(n2) T(n)≥∑i=0lg⁡n−22icn−∑i=1lg⁡n−2(c∑j=0i−14i2−j)+Θ(n2)Θ(n2)≥c(n−1)2−2c∑i=1lg⁡n−24i+Θ(n2)≥c(n−1)2−32c(n−1)2+Θ(n2)=Ω(n2)
证明: 假定有 m<n,T(m)dm2bm ∀m<n,T(m)≤dm2−bm,代入递推式可得
T(n)4dn224bn2+cn=dn2bn(bc)ndn2bn(d0,bc) T(n)≤4d⌊n2⌋2−4bn2+cn=dn2−bn−(b−c)n≤dn2−bn(d≥0,b≥c)
假定有 m<n,T(m)dm2bm ∀m<n,T(m)≤dm2−bm,代入递推式可得
T(n)4dn22+cn4d(n21)2+cn=dn24dn+4d+cndn2 T(n)≥4d⌊n2⌋2+cn≥4d(n2−1)2+cn=dn2−4dn+4d+cn≥dn2
其中 cn+4d4dn0n2,dc2 cn+4d−4dn≥0⇒n≥2,d≤c2

 

4.4-8
每一层都是 cn cn,层数为 n/a n/a,所以

T(n)=i=0n/acn=can2=Θ(n2) T(n)=∑i=0n/acn=can2=Θ(n2)

 

4.4-9
类似于4.4-7,每层都是 cn cn,最多 logmin(1α,11α)n logmin(1α,11−α)⁡n层,最少 logmax(1α,11α)n logmax(1α,11−α)⁡n层,所以

T(n)cnlogmin(1α,11α)n=O(nlgn) T(n)≤cnlogmin(1α,11−α)n=O(nlg⁡n)
T(n)cnlogmax(1α,11α)n=Ω(nlgn) T(n)≥cnlogmax(1α,11−α)n=Ω(nlg⁡n)
综上 T(n)=Θ(nlgn) T(n)=Θ(nlg⁡n)

你可能感兴趣的:(算法导论课后习题解析 第四章 上)