算法设计与分析C++语言描述(陈慧南版)课后答案
算法设计与分析C语言描述(陈慧南版)课后答案

算法设计与分析C语⾔描述(陈慧南版)课后答案第⼀章15P1-3. 最⼤公约数为1。
快1414倍。
主要考虑循环次数,程序1-2的while 循环体做了10次,程序1-3的while 循环体做了14141次(14142-2循环)若考虑其他语句,则没有这么多,可能就601倍。
第⼆章32P2-8.(1)画线语句的执⾏次数为log n 。
(log )n O 。
划线语句的执⾏次数应该理解为⼀格整体。
(2)画线语句的执⾏次数为111(1)(2)16jnii j k n n n ===++=∑∑∑。
3()n O 。
(3)画线语句的执⾏次数为。
O 。
(4)当n 为奇数时画线语句的执⾏次数为(1)(3)4n n ++,当n 为偶数时画线语句的执⾏次数为 2(2)4n +。
2()n O 。
2-10.(1)当 1n ≥ 时,225825n n n -+≤,所以,可选 5c =,01n =。
对于0n n ≥,22()5825f n n n n =-+≤,所以,22582()n n n -+=O 。
(2)当 8n ≥ 时,2222582524n n n n n -+≥-+≥,所以,可选 4c =,08n =。
对于0n n ≥,22()5824f n n n n =-+≥,所以,22582()n n n -+=Ω。
(3)由(1)、(2)可知,取14c =,25c =,08n =,当0n n ≥时,有22212582c n n n c n ≤-+≤,所以22582()n n n -+=Θ。
2-11. (1) 当3n ≥时,3log log n n n <<,所以()20log 21f n n n n =+<,3()log 2g n n n n =+>。
可选 212c =,03n =。
对于0n n ≥,()()f n cg n ≤,即()(())f n g n =O 。
注意:是f (n )和g (n )的关系。
算法设计与分析-课后习题集答案

第一章3. 最大公约数为1。
快1414倍。
程序1-2的while 循环体做了10次,程序1-3的while 循环体做了14141次(14142-2循环)8.(1)画线语句的执行次数为log n ⎡⎤⎢⎥。
(log )n O 。
(2)画线语句的执行次数为111(1)(21)16jnii j k n n n ===++=∑∑∑。
3()n O 。
(3)画线语句的执行次数为。
O 。
(4)当n 为奇数时画线语句的执行次数为(1)(1)4n n +-, 当n 为偶数时画线语句的执行次数为 (2)4n n +。
2()n O 。
10.(1) 当 1n ≥ 时,225825n n n -+≤,所以,可选 5c =,01n =。
对于0n n ≥,22()5825f n n n n =-+≤,所以,22582()-+=O n n n 。
(2) 当 8n ≥ 时,2222582524n n n n n -+≥-+≥,所以,可选 4c =,08n =。
对于0n n ≥,22()5824f n n n n =-+≥,所以,22582()-+=Ωn n n 。
(3) 由(1)、(2)可知,取14c =,25c =,08n =,当0n n ≥时,有22212582c n n n c n ≤-+≤,所以22582()-+=Θn n n 。
11. (1) 当3n ≥时,3log log n n n <<,所以()20log 21f n n n n =+<,3()log 2g n n n n =+>。
可选212c =,03n =。
对于0n n ≥,()()f n cg n ≤,即()(())f n g n =O 。
(2) 当 4n ≥ 时,2log log n n n <<,所以 22()/log f n n n n =<,22()log g n n n n =≥。
可选 1c =,04n =。
(陈慧南 第3版)算法设计与分析——第3章课后习题答案

第三章课后习题姓名:赵文浩学号:16111204082 班级:2016级计算机科学与技术3-2 在如下图所示的二叉搜索树上完成下列运算及随后的伸展操作,画出每次运算加伸展操作后的结果伸展树。
5030601040201585 70901)搜索80从图中可以看出,元素80不存在,因此伸展结点应为搜索过程中遇到的最后一个结点,即70,伸展过程如下图所示:503060104020158570905030601040201585709050301040201585907060状态1状态2状态32)插入80元素80插入后的状态以及将元素8作为伸展结点的伸展过程如下图所示:5030601040201585 709080插入元素80后50306010402015857090805030601040201585709080变换1变换25030601040201585908070变换33)删除30首先,将元素30结点伸展至根结点,然后删除根结点30,并将结点20(左边最大的结点、右边最小的结点)作为伸展结点,伸展过程如下图所示:3010402015709050856030102015709085605040102070908560504015709085605040变换1将30作为根结点删除结点30并变换将20作为伸展结点伸展至根节点102015。
(陈慧南 第3版)算法设计与分析——第6章课后习题答案

⑥ 选择作业 1,则 X 6, 2,3,5,1 。将其按照期限 di 非减次序排列可
得:
ID
di
5
1
6
2
3
3
1
3
2
4
作业5
作业3 作业2
-1
0
1
2
3
4
作业6 作业1(冲突)
该集合无可行排序,因此 X 6, 2,3,5,1 不可行, X 6, 2,3,5 ;
3
⑦ 选择作业 0,则 X 6, 2,3,5, 0 。将其按照期限 di 非减次序排列
可得:
ID
di
5
1
0
1
6
2
3
3
2
4
作业5
作业3 作业2
-1
0
1
2
3
4
作业0(冲突)作业6
该集合无可行排序,因此 X 6, 2,3,5, 0 不可行,X 6, 2,3,5 ;
⑧ 选择作业 4,则 X 6, 2,3,5, 4 。将其按照期限 di 非减次序排列
可得:
ID
Hale Waihona Puke di516
12,5,8,32, 7,5,18, 26, 4,3,11,10, 6 。请给出最优存储方案。
解析:首先将这 13 个程序按照程序长度非降序排列,得:
程序 ID
9 8 1 5 12 4 2 11 10 0 6 7 3
程序长度 ai 3 4 5 5 6 7 8 10 11 12 18 26 32
根据定理可知,按照程序编号存放方案如下:
解析:已知 Prim 算法时间复杂度为 O n2 ,受顶点 n 影响;
Kruskal 算法时间复杂度为 O m logm ,受边数 m 影响;
数据结构-C语言描述(第三版)(陈慧南)章 (11)

第11章 内 排 序
First 12
q 21
p 33
sorted
…
55
unsorted
26
42
…
(a)
First
③
q
p
sorted
unsorted
12
21
33
…
55
26
42
…
① ②
(b)
图11-3 链表的直接插入排序 (a) 插入26前;(b) 插入26后
第11章 内 排 序
与顺序表的直接插入排序一样,链表上的直接插入排序算 法首先将第一个记录视为只有一个记录的有序子序列,将第二 个记录插入该有序子序列中,再插入第三个记录,……,直到 插入最后一个记录为止。每趟插入,总是从链表的表头开始搜 索适当的插入位置。程序11-3中,指针p指示表中与待插入的 记录比较的结点,q指示p的前驱结点。指针sorted总是指向单链 表中已经有序的部分子表的尾部,而指针unsorted指向sorted的 后继结点,即待插入的记录结点,见图11-3(a)。如果待插入的 记录小于第一个记录,则应将其插在最前面。请注意,下面的 while循环总会终止。
1)
n(n 4
1)
(n
1)
O(n 2
)
(11-5)
AM(n)
n1
i1
i 2
2
1 2
n 1 i1
i+2(n
1)
n(n 1) 4
2(n
1)
O(n 2
)
(11-6)
第11章 内 排 序
2.链表上的直接插入排序
直接插入排序也可以在链表上实现。程序11-3是在单 链表上的直接插入排序算法的C语言程序。单链表采用程序 11-1中描述的单链表结构类型。在单链表表示下,将一个 记录插入到一个有序子序列中,搜索适当的插入位置的操作 可从链表的表头开始。图11-3中,从11到55之间的记录已 经有序,现要插入26。我们从表头开始,将26依次与12、21 和33比较。直到遇到大于或等于26的记录33为止,将26插在 21与33之间。该插入操作如图11-3(b)所示。
数据结构-C语言描述(第三版)(陈慧南)章 (6)

第6章 树 例如,设有序表为(21, 25, 28, 33, 36, 43),若要在表中 查找元素36,通常的做法是从表中第一个元素开始,将待查元素 与表中元素逐一比较进行查找,直到找到36为止。粗略地说,如 果表中每个元素的查找概率是相等的,则平均起来,成功查找一 个元素需要将该元素与表中一半元素作比较。如果将表中元素组 成图6-3所示的树形结构,情况就大为改观。我们可以从根结点 起,将各结点与待查元素比较,在查找成功的情况下,所需的最 多的比较次数是从根到待查元素的路径上遇到的结点数目。当表 的长度n很大时,使用图6-3所示的树形结构组织表中数据,可 以很大程度地减少查找所需的时间。为了查找36,我们可以让36 与根结点元素28比较,36比28大,接着查右子树,查找成功。显 然,采用树形结构能节省查找时间。
第6章 树
E
E
A
F
B
G
CD
LJ
M
N
T1
X
YZ
U T2
B
F
A
DC
G
JL
T3 N
M
(a)
(b)
图6-2 树的例子
(a) 树T1和T2组成森林;(b) 树T3
第6章 树
6.2 二 叉 树
二叉树是非常重要的树形数据结构。很多从实际问题中抽 象出来的数据都是二叉树形的,而且许多算法如果采用二叉树 形式解决则非常方便和高效。此外,以后我们将看到一般的树 或森林都可通过一个简单的转换得到与之相应的二叉树,从而 为树和森林的存储及运算的实现提供了有效方法。
第6章 树
图6-1描述了欧洲部分语言的谱系关系,它是一个后裔图, 图中使用的描述树形结构数据的形式为倒置的树形表示法。在 前几章中,我们学习了多种线性数据结构,但是一般来讲,这 些数据结构不适合表示如图6-1所示的层次结构的数据。为了 表示这类层次结构的数据,我们采用树形数据结构。在本章中 我们将学习多种不同特性的树形数据结构,如一般树、二叉树、 穿线二叉树、堆和哈夫曼树等。
(陈慧南 第3版)算法设计与分析——第7章课后习题答案
③ 其余元素
w[0][2] q[2] p[2] w[0][1] 15
k 1: c[0][0] c[1][2] c[0][2] min k 2 : c[0][1] c[2][2] w[0][2] 22 r[0][2] 2
17000
s[0][2]
0
m[1][3]
min
k k
1: m[1][1] m[2][3] 2 : m[1][2] m[3][3]
p1 p2 p4 p1 p3 p4
10000
s[1][3]
2
m[1][3]
min
k k
0 : m[0][0] m[1][3] 1: m[0][1] m[2][3]
第七章课后习题
姓名:赵文浩 学号:16111204082 班级:2016 级计算机科学与技术 7-1 写出对图 7-19 所示的多段图采用向后递推动态规划算法求解时的计算过程。
3
1
3
1
6
5
0
2
6
6
3
4
4 6
5
2
7
8
3
2
8
5
2
7
解析:
V 5 cost(5,8) 0 d (5,8) 8
V4
cos t(4, 6) minc(6,8) cos t(5,8) 7 cos t(4, 7) minc(7,8) cos t(5,8) 3
k 1: c[0][0] c[1][3] c[0][3] min k 2 : c[0][1] c[2][3] w[0][3] 25
算法设计与分析-课后习题集答案
(2)当 时, ,所以,可选 , 。对于 , ,所以, 。
(3)由(1)、(2)可知,取 , , ,当 时,有 ,所以 。
11. (1)当 时, ,所以 , 。可选 , 。对于 , ,即 。
(2)当 时, ,所以 , 。可选 , 。对于 , ,即 。
(3)因为 , 。当 时, , 。所以,可选 , ,对于 , ,即 。
第二章
2-17.证明:设 ,则 。
当 时, 。所以, 。
第五章
5-4.SolutionType DandC1(int left,int right)
{while(!Small(left,right)&&left<right)
{int m=Divide(left,right);
所以n-1<=m<=n (n-1)/2;
O(n)<=m<=O(n2);
克鲁斯卡尔对边数较少的带权图有较高的效率,而 ,此图边数较多,接近完全图,故选用普里姆算法。
10.
T仍是新图的最小代价生成树。
证明:假设T不是新图的最小代价生成树,T’是新图的最小代价生成树,那么cost(T’)<cost(T)。有cost(T’)-c(n-1)<cost(t)-c(n-1),即在原图中存在一颗生成树,其代价小于T的代价,这与题设中T是原图的最小代价生成树矛盾。所以假设不成立。证毕。
13.template <class T>
select (T&x,int k)
{
if(m>n) swap(m,n);
if(m+n<k||k<=0) {cout<<"Out Of Bounds"; return false;}
(陈慧南 第3版)算法设计与分析——第2章课后习题答案
g n
(1) f n 20n logn , g n n+ log 3 n
f n 20n logn 21n , g n n+ log 3 当 n 3 时, logn n log3 n 2n n 因此
因此可取 n0 3, c
1 ,当 2
n 足 够 大 时 , a f (n b) c f (n) 恒 成 立 。 所 以 符 合 主 定 理 的 情 况 3 , 因 此
T (n) (n)
(2) a 5, b 4, f n cn 2
解析: nlogb a nlog4 5 n1.161 ,则 f (n) c n2 (nlogb a ) ,其中可取 =0.9 。
n0 3, c 1 ,当 n n0 时, f n g n ,所以 f n = g n
(5) f (n) n 2n g (n) 3n 当 n 1 时 , 有 f (n) n 2n 3n g (n) , 因 此 可 取 n0 1, c 1 , 当 n n0 时 ,
第二章课后习题
姓名:赵文浩 学号:16111204082 班级:2016 级计算机科学与技术
2-10 试用定义证明下列等式的正确性 (1) 5n 2 8n 2 O n 2 证明: 当 n 1 时, f (n) 5n 2 8n 2 5n 2 。 因此可选取 n0 1, c 5 。 当 n n0 时, f (n) 5n 2 8n 2 5n 2 ,因此 5n 2 8n 2 O n 2 (2) 5n 2 8n 2 n 2 证 明 : f (n) 5n 2 8n 2 5n 2 (8n 2) 。 当 n 4 时 , 8n 2 2n2 即 :
算法分析与设计(陈慧南,电子科技出版社)复习资料
《算法分析与设计C》复习总成绩=平时成绩(30%)+考试成绩(70%)考试时间:2015年06月28日(16:00-17:50)试卷题型:一、 选择题(每空2分,共20分)二、 填空题(每空2分,共20分)三、 证明题(每题5分,共10分)四、 问答题(每题10分,共50分)第一章 算法求解基础算法的概念算法特征(输入、输出、确定性、可行性、有穷性)——掌握每种特征的含义、算法和程序的区别描述算法的方法(自然语言、流程图、伪代码、程序设计语言)欧几里德算法(辗转相除法)——递归/迭代程序实现及其变形常见算法种类——精确算法、启发式算法、近似算法、概率算法第二章 算法分析基础算法复杂度——运行一个算法所需的时间和空间。
好算法的四个特征(正确性、简明性、效率、最优性)正确性vs健壮性vs可靠性最优性——算法(最坏情况下)的执行时间已达到求解该类问题所需时间的下界。
影响程序运行时间的因素(程序所依赖的算法、问题规模和输入数据、计算机系统性能)算法的渐近时间复杂度 ——数量级上估计(Ο、Ω、Θ)最好、最坏、平均时间复杂度——定义——课后习题2-8(通过考察关键操作的执行次数)时间复杂度证明——课后习题2-10,2-13,2-17算法按时间复杂度分类:多项式时间算法、指数时间算法多项式时间算法:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3) 指数时间算法:O(2n)<O(n!)<O(n n)第五章 分治法分治法——求解的基本要素:将一个难以直接求解的复杂问题分解成若干个规模较小、相互独立但类型相同的子问题,然后求解这些子问题;如果这些子问题还比较复杂而不能直接求解,还可以继续细分,直到子问题足够小,能够直接求解为止;最后将子问题的解组合成原始问题的解。
这种问题求解策略称为分治法。
分治法很自然的导致一个递归算法。
平衡子问题思想递归算法的时间复杂度分析:递推式T(n)=aT(n/b)+cn k,T(1)=c——递推式中每部分的含义——求解得到算法的渐近时间复杂度(分三种情况)——改进思路求最大最小元二分搜索算法框架对半搜索——程序实现——对半搜索二叉判定树(树的构成)——对半搜索二叉判定树性质(左右子树结点数、树高等)——对半搜索的时间复杂度分析(搜索成功/失败、最好/最坏/平均)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
向前递推过程如下:
cost(5,8)=0
cost(4,6)=7,cost(4,7)=3
cost(3,3)=min{1+cost(4,6),4+cost(4,7)}=7,
cost(3,4)=min{6+cost(4,6),2+cost(4,7)}=5
cost(3,5)=min{6+cost(4,6),2+cost(4,7)}=5
StoogeSort(left,right-k);
首次递归StoogeSort(left,right-k);时,序列的前2/3的子序列有序。
当递归执行StoogeSort(left+k,right);时,使序列的后2/3的子序列有序,经过这两次递归排序,使原序列的后1/3的位置上是整个序列中较大的数,即序列后1/3的位置上数均大于前2/3的数,但此时,前2/3的序列并不一定是有序的。
克鲁斯卡尔对边数较少的带权图有较高的效率,而 ,此图边数较多,接近完全图,故选用普里姆算法。
6-10.
T仍是新图的最小代价生成树。
证明:假设T不是新图的最小代价生成树,T’是新图的最小代价生成树,那么cost(T’)<cost(T)。有cost(T’)-c(n-1)<cost(t)-c(n-1),即在原图中存在一颗生成树,其代价小于T的代价,这与题设中T是原图的最小代价生成树矛盾。所以假设不成立。证毕。
cost(2,1)=min{3+cost(3,3),3+cost(3,5)}=8
cost(2,2)=min{6+cost(3,3),8+cost(3,5),5+cost(3,4)}=10
cost(1,0)=min{5+cost(2,1),2+cost(2,2)}=12
所以,d(4,6)=d(4,7)=8, d(3,3)=d(3,4)=d(3,5)=7, d(2,1)=5, d(2,2)=4, d(1,0)=2
从s到t的最短路径为(0, d(4,7)=8),路径长为12。
第七章
9. char A[8]={‘0’,’x’,’z’,’y’,’z’,’z’,’y’,’x’ }
B[8]={‘0’,’z’,’x’,’y’,’y’,’z’,’x’,’z’}
(a) c[i][j](b)s[i][j]
for (i =1; i<=m; i++)
for (int j =1; j<=n; j++)
if (x[i]= =y[j]) c[i][j]=c[i-1][j-1]+1;
else if (c[i-1][j]>=c[i][j-1]) c[i][j]=c[i-1][j];
else c[i][j]=c[i][j-1];
再次执行StoogeSort(left,right-k);使序列的前2/3有序。
经过三次递归,最终使序列有序。
所以,这一排序算法是正确的。
(2)最坏情况发生在序列按递减次序排列。
, , 。
设 ,则 。
冒泡排序最坏时间复杂度为 ,队排序最坏时间复杂度为 ,快速排序最坏时间复杂度为 。所以,该算法不如冒泡排序,堆排序,快速排序。
Bcost(4,7)=min{c(3,7)+Bcost(3,3),c(4,7)+Bcost(3,4),c(5,7)+Bcost(3,5)}=min{4+8,2+7,6+8}=9
Bcost(5,8)=min{c(6,8)+Bcost(4,6),c(7,8)+Bcost(4,7)}=min{7+9,3+9}=12
}
else if ( c[i-1][j]>=c[i][j-1]) CLCS (i-1,j);
else CLCS (i,j-1);
}
12. int LCS::LCSLength()
{
for ( int i =1; i<=m; i++) c[i][0]=0;
for (i =1; i<=n; i++) c[0][i]=0;
第七章
1. Bcost(1,0)=0;
Bcost(2,1)=c(1,1)+Bcost(1.0)=5
Bcost(2,2)=c(1,2)+Bcost(1,0)=2
Bcost(3,3)=min{c(2,3)+Bcost(2,2),c(1,3)+Bcost(2,1)}=min{6+2,3+5}=8
Bcost(3,4)=c(2,4)+Bcost(2,2)=5+2=7
13.template <class T>
select (T&x,int k)
{
if(m>n) swap(m,n);
if(m+n<k||k<=0) {cout<<"Out Of Bounds"; return false;}
int *p=new temp[k];
int mid,left=0,right=n-1,cnt=0,j=0,r=0;
答案状态:如果从根到树中某个状态的路径代表一个作为可行解的元组,则该状态为解状态。
活结点:回溯法从开始结点出发,以深度优先的方式搜索整个解空间,这个开始结点就成为一个活结点。未检测的结点称为活结点
扩展结点:算法从x出发,访问x的摸个后继结点y,则x被称为扩展结点
约束函数:一个约束函数是关于部分向量的函数Bk(x0,x1.....xk),它被定义为:如果可以判定Y的子树上不含任何答案状态,则Bk(x0,x1.....xk)为false,否则为true.
return c[m][n];
}
15. , ,
, ,
, ,
,
8-1.
状态空间:描述问题的各种可能的情况,一种情况对呀状态空间的一个状态。
显示约束:用于规定每个xi取值的约束条件称为显示约束
隐式约束:用于判定一个候选解是否为可行解的条件
问题状态:在状态空间树中的每个节点称为一个问题状态
解状态:如果从根到树中某个状态的路径代表一个作为候选解的元组,则该状态为解状态
Bcost(3,5)=min{c(1,5)+Bcost(2,1),c(2,5)+Bcost(2,2)}=min{3+5,8+2}=8
Bcost(4,6)=min{c(3,6)+Bcost(3,3),c(4,6)+Bcost(3,4),c(5,6)+Bcost(3,5)}=min{1+8,6+7,6+8}=9
所以,最长公共字串为(x,y,z,z)。
第七章
11. void LCS::CLCS ( int i , int j )
{
if ( i = = 0 || j = = 0) return;
if (c[i][j] = = c[i-1][j-1]+1)
{
CLCS ( i-1,j-1);
Cout<<a[i];
for(int i=0;i<m;i++)
{
while(k>0)
{
do
{
mid=(left+right)/2;
if(a[mid]<b[i]) left=mid;
else if(a[mid]>b[i]) right=mid;
else {cnt=mid; break;}
}while(left<right-1)
2-11. (1)当 时, ,所以 , 。可选 , 。对于 , ,即 。注意:是f(n)和g(n)的关系。
(2)当 时, ,所以 , 。可选 , 。对于 , ,即 。
(3)因为 , 。当 时, , 。所以,可选 , ,对于 , ,即 。
第二章
2-17.证明:设 ,则 。
当 时, 。所以, 。
第五章
5-4.SolutionType DandC1(int left,int right)
3
4
5
[8
5]
∞
4
[2]
3
3
4
5
[8
5]
∞
5
2
3
3
4
5
[5]
8
∞
排序结果
2
3
3
4
5
5
8
∞
12.(1)证明:当 或 或 时,程序显然正确。
当n=right-left+1>2时,程序执行下面的语句:
int k=(right-left+1)/3;
StoogeSort(left,right-k);
StoogeSort(left+k,right);
其中, 是二叉判定树的内路径长度, 是外路径长度,并且 。
11.
步数
0
1
2
3
4
5
初始时
1
1
1
1
1
1
[1
1]
1
[1
1]
∞
2
[1]
1
1
[1
1]
∞
3
1
1
1
[1
1]
∞
4
1
1
1
[1]
1
∞
排序结果
1
1
1
1
1
∞
步数
0
1
2
3
4
5
6
7
初始时
5
5