当前位置:文档之家› 算法设计技巧与分析答案上课讲义

算法设计技巧与分析答案上课讲义

算法设计技巧与分析
答案
算法设计技巧与分析
参考答案
第1章算法分析基本概念
1.1
(a)6 (b)5 (c)6 (d)6
1.4
算法执行了7+6+5+4+3+2+1=28次比较
1.5
(a)算法MODSELECTIONSORT执行的元素赋值的最少次数是0,元素已按非降序排列的时候达到最小值。

(b) 算法MODSELECTIONSORT 执行的元素赋值的最多次数是3(1)2
n n ,元素已按非升序排列的时候达到最小值。

1.7
由上图可以看到执行的比较次数为1+1+2+2+2+6+2=16次。

1.11
由上图可以得出比较次数为5+6+6+9=26次。

1.13
FTF,TTT,FTF,TFF,FTF 1.16
(a) 执行该算法,元素比较的最少次数是n-1。

元素已按非降序排列时候达到最小值。

(b) 执行该算法,元素比较的最多次数是(1)2
n n -。

元素已
按非升序排列时候达到最大值。

(c) 执行该算法,元素赋值的最少次数是0。

元素已按非降序排列时候达到最小值。

(d) 执行该算法,元素赋值的最多次数是3(1)2
n n -。

元素已
按非升序排列时候达到最大值。

(e)n 用O 符号和Ω符号表示算法BUBBLESORT 的运行时间:2()t O n =,()t n =Ω
(f)不可以用Θ符号来表示算法的运行时间:Θ是用来表示算法的精确阶的,而本算法运行时间由线性到平方排列,因此不能用这一符号表示。

1.27
不能用p 关系来比较2n 和2100n 增长的阶。

∵221
lim
0100100
n n n →∞=≠ 2n ∴不是2(100)o n 的,即不能用p 关系来比较2n 和2100n 增长
的阶。

1.32
(a)当n 为2的幂时,第六步执行的最大次数是:
12,2k k n j -==时,
1
1
[log ]log n n
i i k n n n ====∑∑
(b)由(a)可以得到:当每一次循环j 都为2的幂时,第六步执行的次数最大,
则当33,22k k
m
n j ===(其中
32
k 取整)时,
1
1
[log(3
1)]log(1)n n
k
i
i i m n n ===-=-∑∑
(c)用O 符号表示的算法的时间复杂性是(log )O n n 已证明n=2k 的情况,下面证明n=2k +1的情况:
因为有⎥⎦

⎢⎣⎢+=⎥⎦⎥⎢⎣⎢21222k k
所以n=2k +1时,第六步执行的最大次数仍是n log n 。

(d) 用Ω符号表示的算法的时间复杂性是()n
Ω。

当n满足/2
=取整为奇数时,算法执行的次数是n次,
j n
其他情况算法执行次数均大于n。

(e) O更适合表示算法的时间复杂性。

因为本算法时间复
杂性从()n
O n n,而Θ是表示精确阶的。

Ω到(log)
1.38
对n个数进行排序。

第5章归纳法
5.3(本题不仅有以下一个答案)
1.max(n)
过程:max(i)
if n=1 return a[1]
t=max(i-1)
if a[i-1]>t return a[i-1]
else return t
end if
5.6 最多次数:
0,1
()(1)(1),2n C n c n n n =⎧=⎨
-+-≥⎩
1(1)
()2
n
j n n C n j =-==
∑ 最少次数:



≥+-==2,1)1(1,0)(n n C n n C C(n)=n-1 5.7
参考例5.1 5.14
(a)不稳定,例如:
可见SELECTIONSORT 中相等元素的序在排序后改变。

(b)(c)(d)(f)稳定 5.17
(a)利用10()()n n P x xP x a -=+
取3x =,
543210(3)(3)(3)(3)(3)(3)P P P P P P →→→→→
21100(3)3*(3)437(3)3*(3)211(3)3P P P P P =+=←=+=←=
3243543*(3)1112(3)3*(3)2338(3)3*(3)51019
P P P P P P =+=→=+=→=+=5.18
(a) (2,5)(2,2)(2,1)(2,0)p p p p →→→
2224*2241*21y y y y =←==←=←=
第6章 分 治
6.3
输入:A[1,2,…n] 输出:max,min 1.for i=1 to mid 2. j=high-i
3. if a[i]>a[j], then exchange a[i],a[j]
4.end for
5.for i=low to mid
6. if a[i+1]<a[low], then exchange a[low],a[i+1]
7.end for
8.for i=mid+1 to high
9. if a[i+1]>a[high], then exchange a[high],a[i+1] 10.end for 6.5
输入:一个整数数组A[1,2,…,n] 输出:sum
1.if high-low=1 then
2. sum=a[low]+a[high]
3.else
4. mid=(low+high)/2
5 sum1=sum(low,mid)
6 sum2=sum(mid+1,high)
7. sum=sum1+sum2
8.end if
9.return sum
算法需要的工作空间为3
6.10.
6.31
彩色代表i,j所指的数字j总在i前6.36
6.42
Quicksort 不是稳定的。

6.43
bcefg 均为适应的,a 、h 不是适应的。

第7章 动态规划
7.1
(c),算法BOTTOMUPSORT 7.5
字符串A=”xzyzzyx ”和B=”zxyyzxz ”的最长公共子序列长度为4,共有6个最长公共子序列,分别是:①zyyx ②zyzz ③zyzx ④xyyx ⑤xyzz ⑥xyzx 7.9
C[1,5]=C[1,1]+C[2,5]+r[1]*r[2]*r[6]=307 C[1,5]=C[1,2]+C[3,5]+r[1]*r[3]*r[6]=252 C[1,5]=C[1,3]+C[4,5]+r[1]*r[4]*r[6]=372 C[1,5]=C[1,4]+C[5,5]+r[1]*r[5]*r[6]=260 所以最优括号表达式为(M1M2)((M3M4)M5) 7.15
1000[,]min{[,],[,1][1,]}
D i j D i j D i D j =+4051
312091134021620D ⎛⎫ ⎪

= ⎪

⎝⎭
1071
60944021
820D ⎛⎫ ⎪
∞∞
⎪= ⎪

⎝⎭
2111[,]min{[,],[,2][2,]}
D i j D i j D i D j =+
2071
60944021
820D ⎛⎫ ⎪
∞∞
⎪= ⎪

⎝⎭
3222[,]min{[,],[,3][3,]}
D i j D i j D i D j =+
3051
313091144021
620D ⎛⎫ ⎪
⎪= ⎪

⎝⎭
4333[,]min{[,],[,4][4,]}
D i j D i j D i D j =+
4051
312091134021
620D ⎛⎫ ⎪
⎪= ⎪

⎝⎭
7.21
7.23
当物品体积为负值时,运行算法会发生溢出错误。

第八章贪心算法
8.12
由算法从s 到t 要选择先到a 然后到t,其结果为4,而从s 到t 距离为2,所以探索不总是产生从s 到t 的距离 8.13
8.23(共有4棵最小生成树,此处仅举一例)
3
4 1
3
2
8
8.24(共有4棵最小生成树,此处仅举一例)
8.31
每一个二叉树都取左边为0,右边为1 则最优编码为a:10 b:001 c:0001
d:0000 e:01 f:11
注意:编码不唯一
回溯法。

相关主题