《算法设计与分析》第05章

合集下载

算法设计与分析王晓东

算法设计与分析王晓东

习题2-1 求下列函数的渐进表达式:3n^2+10n; n^2/10+2n; 21+1/n; logn^3; 10 log3^n 。

解答:3n^2+10n=O(n^2),n^2/10+2^n=O(2^n),21+1/n=O(1),logn^3=O(logn),10log3^n=O(n).习题2-3 照渐进阶从低到高的顺序排列以下表达式:n!,4n^2,logn,3^n,20n,2,n^2/3。

解答:照渐进阶从高到低的顺序为:n!、3^n、4n^2 、20n、n^2/3、logn、2习题2-4(1)假设某算法在输入规模为n时的计算时间为T(n)=3*2^n。

在某台计算机上实现并完成该算法的时间为t秒。

现有另外一台计算机,其运行速度为第一台计算机的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题?(2)若上述算法的计算时间改进为T(n)=n^2,其余条件不变,则在新机器上用t秒时间能解输入规模多大的问题?(3)若上述算法的计算时间进一步改进为,其余条件不变,那么在新机器上用t秒时间能解输入规模多大的问题?解答:(1)设能解输入规模为n1的问题,则t=3*2^n=3*2^n/64,解得n1=n+6(2)n1^2=64n^2得到n1=8n(3)由于T(n)=常数,因此算法可解任意规模的问题。

习题2-5 XYZ公司宣称他们最新研制的微处理器运行速度为其竞争对手ABC公司同类产品的100倍。

对于计算复杂性分别为n,n^2,n^3和n!的各算法,若用ABC公司的计算机能在1小时内能解输入规模为n的问题,那么用XYZ公司的计算机在1小时内分别能解输入规模为多大的问题?解答:n'=100nn'^2=100n^2得到n'=10nn'^3=100n^3得到n'=4.64nn'!=100n!得到n'<n+log100=n+6.64习题2-6对于下列各组函数f(n)和g(n),确定f(n)=O(g(n))或f(n)=Ω(g(n))或f(n)=θ(g(n)),并简述理由。

算法分析与设计概论

算法分析与设计概论

9
How to Study Algorithm?
“Sometimes we have experiences, and sometimes not. Therefore, the better way is to learn more."
10
1.1 算法与程序
算法:是满足下述性质的指令序列。
输 入:有零个或多个外部量作为算法的输入。 输 出:算法产生至少一个量作为输出。 确定性:组成算法的每条指令清晰、无歧义。 有限性:算法中每条指令的执行次数有限,执行 每条指令的时间也有限。
1) 第一种解法:
输入:所购买的三种鸡的总数目n 输出:满足问题的解的数目k,公鸡,母鸡,小鸡的只数g[ ],m[ ],s[ ] 1. void chicken_question(int n,int &k,int g[ ],int m[ ],int s[ ]) 2. { int a,b,c; 4. k = 0; 5. for (a=0;a<=n;a++) 6. for (b=0;b<=n;b++) 7. for (c=0;c<=n;c++) { 8. if ((a+b+c==n)&&(5*a+3*b+c/3==n)&&(c%3==0)) { 9. g[k] = a; 10. m[k] = b; 11. s[k] = c; 12. k++; 13. }}}
矩阵。
数组 T:表示售货员的路线,依次存放旅行路线中的城 市编号。
售货员的每一条路线,对应于城市编号的一个排列。
n 个城市共有 n! 个排列,采用穷举法逐一计算每一条路线的费 用,从中找出费用最小的路线,便可求出问题的解。

算法分析与设计教程习题解答_秦明

算法分析与设计教程习题解答_秦明

算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。

频率计数是指计算机执行程序中的某一条语句的执行次数。

多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。

指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。

2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。

3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。

4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。

5. 解:①n=11; ②n=12; ③n=982; ④n=39。

第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。

2. 解:通过分治算法的一般设计步骤进行说明。

3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解:void hanoi(int n,int a,int b,int c) {if(n>0) {hanoi(n-1,a,c,b); move(a,b);hanoi(n-1,c,b,a); } } 5. 解:①22*2)(--=n n f n② )log *()(n n n f O =6. 解:算法略。

算法分析与设计-第05章

算法分析与设计-第05章
南京邮电大学计算机学院 10/22/2013
分治法的适用条件
分治法所能解决的问题一般具有以下几个特征: 该问题的规模缩小到一定的程度就可以容易地解 决; 该问题可以分解为若干个规模较小的相同问题; 因为问题的计算复杂性一般是随着问题规模的增加而增加, 因此大部分问题满足这个特征。 利用该问题分解出的子问题的解可以合并为该问 这条特征是应用分治法的前提,它也是大多数问题可以满 题的解; 足的,此特征反映了递归思想的应用。 该问题所分解出的各个子问题是相互独立的,即 能否利用分治法完全取决于问题是否具有这条特征,如果 子问题之间不包含公共的子问题。
template <class T> class SortableList //可排序表类 { public: SortableList(int mSize); ~SortableList(); private: T *l ; int maxSize; int n; };
南京邮电大学计算机学院 10/22/2013
m
logb a
log n ) ( n k log n )
r m 1 1 ( rm ) (3)若r>1,则 r i r 1 i 0 所以 T(n) (a m r m ) ( b km ) ( nk )
南京邮电大学计算机学院 10/22/2013
本章算法的数据结构
5.2 求最大最小元
南京邮电大学计算机学院 10/22/2013
问题 在一个元素集合中寻找最大元素和最小 元素的问题,即在互不相同的n个数{x1, x2, …, xn}中,找出最大和最小的数。
南京邮电大学计算机学院 10/22/2013
5.2.1 分治法求解
方法一:分别求最大元和最小元。 分别需要n-1次和n-2次元素间的比较, 共需2n-3次比较。 在n个元素中 找最大元 在n-1个元素 中找最小元

《算法设计与分析》课件

《算法设计与分析》课件

常见的贪心算法包括最小生成树算法 、Prim算法、Dijkstra算法和拓扑排 序等。
贪心算法的时间复杂度和空间复杂度 通常都比较优秀,但在某些情况下可 能需要额外的空间来保存状态。
动态规划
常见的动态规划算法包括斐波那契数列、背包 问题、最长公共子序列和矩阵链乘法等。
动态规划的时间复杂度和空间复杂度通常较高,但通 过优化状态转移方程和状态空间可以显著提高效率。
动态规划算法的时间和空间复杂度分析
动态规划算法的时间复杂度通常为O(n^2),空间复杂度为O(n)。
04 经典问题与算法实现
排序问题
冒泡排序
通过重复地遍历待排序序列,比较相邻元素的大小,交换 位置,使得较大的元素逐渐往后移动,最终达到排序的目 的。
快速排序
采用分治策略,选取一个基准元素,将比基准元素小的元 素移到其左边,比基准元素大的元素移到其右边,然后对 左右两边的子序列递归进行此操作。
动态规划是一种通过将原问题分解为若干个子 问题,并从子问题的最优解推导出原问题的最 优解的算法设计方法。
动态规划的关键在于状态转移方程的建立和状态 空间的优化,以减少不必要的重复计算。
回溯算法
01
回溯算法是一种通过穷举所有可能情况来求解问题的算法设计方法。
02
常见的回溯算法包括排列组合、八皇后问题和图的着色问题等。
空间换时间 分治策略 贪心算法 动态规划
通过增加存储空间来减少计算时间,例如使用哈希表解决查找 问题。
将问题分解为若干个子问题,递归地解决子问题,最终合并子 问题的解以得到原问题的解。
在每一步选择中都采取当前状态下最好或最优(即最有利)的 选择,从而希望导致结果是最好或最优的。
通过将问题分解为相互重叠的子问题,并保存子问题的解,避 免重复计算,提高算法效率。

《算法设计与分析》(全)

《算法设计与分析》(全)
巢湖学院计算机科学与技术系
1.1、算法与程序
程序:是算法用某种程序设计语言的具体实现。 程序可以不满足算法的性质(4)。 例如操作系统,是一个在无限循环中执行的程序, 因而不是一个算法。 操作系统的各种任务可看成是单独的问题,每一个 问题由操作系统中的一个子程序通过特定的算法来实 现。该子程序得到输出结果后便终止。
渐近分析记号的若干性质
(1)传递性: ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= O(g(n)), g(n)= O (h(n)) f(n)= O (h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); ➢ f(n)= o(g(n)), g(n)= o(h(n)) f(n)= o(h(n)); ➢ f(n)= (g(n)), g(n)= (h(n)) f(n)= (h(n)); (2)反身性: ➢ f(n)= (f(n));f(n)= O(f(n));f(n)= (f(n)). (3)对称性: ➢ f(n)= (g(n)) g(n)= (f(n)) . (4)互对称性: ➢ f(n)= O(g(n)) g(n)= (f(n)) ; ➢ f(n)= o(g(n)) g(n)= (f(n)) ;
巢湖学院计算机科学与技术系
渐近分析记号的若干性质
规则O(f(n))+O(g(n)) = O(max{f(n),g(n)}) 的证明: ➢ 对于任意f1(n) O(f(n)) ,存在正常数c1和自然数n1,使得对
所有n n1,有f1(n) c1f(n) 。 ➢ 类似地,对于任意g1(n) O(g(n)) ,存在正常数c2和自然数
巢湖学院计算机科学与技术系
第1章 算法引论

《算法分析与设计》(李春葆版)课后选择题答案与解析

《算法分析与设计》(李春葆版)课后选择题答案与解析

《算法及其分析》课后选择题答案及详解第1 章——概论1.下列关于算法的说法中正确的有()。

Ⅰ.求解某一类问题的算法是唯一的Ⅱ.算法必须在有限步操作之后停止Ⅲ.算法的每一步操作必须是明确的,不能有歧义或含义模糊Ⅳ.算法执行后一定产生确定的结果A.1个B.2个C.3个D.4个2.T(n)表示当输入规模为n时的算法效率,以下算法效率最优的是()。

A.T(n)=T(n-1)+1,T(1)=1B.T(n)=2nC.T(n)= T(n/2)+1,T(1)=1D.T(n)=3nlog2n答案解析:1.答:由于算法具有有穷性、确定性和输出性,因而Ⅱ、Ⅲ、Ⅳ正确,而解决某一类问题的算法不一定是唯一的。

答案为C。

2.答:选项A的时间复杂度为O(n)。

选项B的时间复杂度为O(n)。

选项C 的时间复杂度为O(log2n)。

选项D的时间复杂度为O(nlog2n)。

答案为C。

第3 章─分治法1.分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题,分别解决子问题,最后将子问题的解组合起来形成原问题的解。

这要求原问题和子问题()。

A.问题规模相同,问题性质相同B.问题规模相同,问题性质不同C.问题规模不同,问题性质相同D.问题规模不同,问题性质不同2.在寻找n个元素中第k小元素问题中,如快速排序算法思想,运用分治算法对n个元素进行划分,如何选择划分基准?下面()答案解释最合理。

A.随机选择一个元素作为划分基准B.取子序列的第一个元素作为划分基准C.用中位数的中位数方法寻找划分基准D.以上皆可行。

但不同方法,算法复杂度上界可能不同3.对于下列二分查找算法,以下正确的是()。

A.intbinarySearch(inta[],intn,int x){intlow=0,high=n-1;while(low<=high){intmid=(low+high)/2;if(x==a[mid])returnmid;if(x>a[mid])low=mid;elsehigh=mid;}return –1;}B.intbinarySearch(inta[],intn,int x) { intlow=0,high=n-1;while(low+1!=high){intmid=(low+high)/2;if(x>=a[mid])low=mid;elsehigh=mid;}if(x==a[low])returnlow;elsereturn –1;}C.intbinarySearch(inta[],intn,intx) { intlow=0,high=n-1;while(low<high-1){intmid=(low+high)/2;if(x<a[mid])high=mid;elselow=mid;}if(x==a[low])returnlow;elsereturn –1;}D.intbinarySearch(inta[],intn,int x) {if(n>0&&x>=a[0]){intlow= 0,high=n-1;while(low<high){intmid=(low+high+1)/2;if(x<a[mid])high=mid-1;elselow=mid;}if(x==a[low])returnlow;}return –1;}答案解析:1.答:C。

算法设计与分析第五章1

算法设计与分析第五章1
V1 V
, (u, v) E1当且仅当 (u, v) E 。
1
2
1
2
3
3
4
(a)
5
1
2
4 3
(b)
5
4
(c)
5
回溯法-最大团问题
1
2 3
1
(b)
2
4
(a)
5
5
图(a)、补图的最大独立集
*若 U 是 G 的一个最大团, 则 U 是 G 的补图 G 的一个最大独 立集。
{1,2,5},{2,3,5},{1,4,5}
3
4
(n 1)!
E
C
3 完 全 图 59 4 2
D
4 2
3
F
4
G H
3 4
I J
2 3
K
2
L
M N
O P
Q
回溯法
剪枝函数:
用约束函数在扩展结点处剪去不满足约束的子树;
用限界函数剪去得不到最优解的子树。
回溯法-0-1背包问题
w {16,15,15}
p {45,25,25}
1
A
0
c 30
回溯法-最大团问题
设无向图 G (V , E ) , V n ,用邻接矩阵 A 表示图 G , 问题的解可表示为 n 元向量 ( x1 , x2 ,, xn ), xi {0,1} 。 问题的解空间用子集树表示。
xi 0
xi 1
回溯法-最大团问题
约束条件:{x1 , x2 ,, xi } {xi 1} 不是团 剪枝
1
2 3
1
2 3
?
5
(a)

算法分析与设计(李清勇)课后习题答案

算法分析与设计(李清勇)课后习题答案

算法分析与设计(李清勇)课后习题答案5-1凸多边形最优三⾓剖分问题//3d5 凸多边形最优三⾓剖分#include "stdafx.h"#includeusing namespace std;constint N = 7;//凸多边形边数+1int weight[][N] = {{0,2,2,3,1,4},{2,0,1,5,2,3},{2,1,0,2,1,4},{3,5,2,0,6,2},{1,2,1,6,0,1},{4,3,4,2,1,0}};//凸多边形的权intMinWeightTriangulation(intn,int **t,int **s);void Traceback(inti,intj,int **s);//构造最优解int Weight(inta,intb,int c);//权函数int main(){int **s = new int *[N];int **t = new int *[N];for(inti=0;is[i] = new int[N];t[i] = new int[N];}cout<<"此多边形的最优三⾓剖分值为:"<cout<<"最优三⾓剖分结构为:"<Traceback(1,5,s); //s[i][j]记录了Vi-1和Vj构成三⾓形的第3个顶点的位置return 0;}intMinWeightTriangulation(intn,int **t,int **s){for(inti=1; i<=n; i++){t[i][i] = 0;}for(int r=2; r<=n; r++) //r为当前计算的链长(⼦问题规模){for(inti=1; i<=n-r+1; i++)//n-r+1为最后⼀个r链的前边界{int j = i+r-1;//计算前边界为r,链长为r的链的后边界t[i][j] = t[i+1][j] + Weight(i-1,i,j);//将链ij划分为A(i) * ( A[i+1:j] )这⾥实际上就是k=i s[i][j] = i; for(int k=i+1; k//将链ij划分为( A[i:k] )* (A[k+1:j])int u = t[i][k] + t[k+1][j] + Weight(i-1,k,j);if(ut[i][j] = u;s[i][j] = k;}}}}return t[1][N-2];}voidTraceback(inti,intj,int **s){if(i==j) return;Traceback(i,s[i][j],s);Traceback(s[i][j]+1,j,s);cout<<"三⾓剖分顶点:V"<int Weight(inta,intb,int c){return weight[a][b] + weight[b][c] + weight[a][c];}5-4 数字三⾓形最短路径5-2 游艇租赁问题#includeusing namespace std;#define N 210int cost[N][N];int m[N];int main(){intn,i,j;while(cin>>n){for(i=1;ifor(j=i+1;j<=n;j++)cin>>cost[i][j];m[1]=0;int min;for(i=2;i<=n;i++){min=cost[1][i];for(j=1;j<=i-1;j++){if(cost[j][i]!=0 && m[j]+cost[j][i]min=m[j]+cost[j][i];}m[i]=min;}cout<}return 0;}5-6 合唱队形问题#include/doc/d0aa713f51e79b8969022686.html ing namespace std; 2.3.//⽤于保存⼦问题最优解的备忘录4.typedef struct5.{6.int maxlen; //当前⼦问题最优解7.int prev; //构造该⼦问题所⽤到的下⼀级⼦问题序号(⽤于跟踪输出最优队列)8.}Memo;9.10.//⽤于递归输出Memo B中的解11.void Display(int* A, Memo* M, int i)12.{13.if (M[i].prev == -1)14. {15. cout<16.return;17. }18. Display(A, M, M[i].prev);19. cout<20.}21.22.//算法主要部分23.void GetBestQuence(int* A, int n)24.{25.//定义备忘录并作必要的初始化26. Memo *B = new Memo[n]; //B[i]代表从A[0]到A[i]满⾜升序剔除部分元素后能得到的最多元素个数27. Memo *C = new Memo[n]; //C[i]代表从A[i]到A[n-1]满⾜降序剔除部分元素后能得到的最多元素个数28. B[0].maxlen = 1; //由于B[i]由前向后构造初始化最前⾯的⼦问题 (元素本⾝就是⼀个满⾜升序降序的序列)29. C[n-1].maxlen = 1; //同样C[i]由后向前构造30.for (int i=0; i31.//⽤于在跟踪路径时终⽌递归或迭代(因为我们并不知道最终队列从哪⾥开始)32. {33. B[i].prev = -1;34. C[i].prev = -1;35. }36.37.for (i=1; i38. {39.int max=1;40.for (int j=i-1; j>=0; j--) //查看前⾯的⼦问题找出满⾜条件的最优解并且记录41. {42.if (A[j]max)43. {44. max = B[j].maxlen+1; //跟踪当前最优解45. B[i].prev = j; //跟踪构造路径46. }47. }48. B[i].maxlen = max; //构造最优解49. }50.51.for (i=n-1; i>0; i--)52. {53.int max=1;54.for (int j=i; j解时可以直接⽤B[i]+C[i]-155.//否则我们得到的最优解始终为B[n-1]+C[n-1]56. {57.if (A[j]max) //⽐当前长度更长记录并构造58. {59. max = C[j].maxlen+1;60. C[i].prev = j;61. }62. }63. C[i].maxlen = max;64. }65.66.//遍历i 得到最⼤的B[i]+C[i]-1(-1是因为我们在B[i]和C[i]中均加上了A[i]这个数因此需要减去重复的)67.int maxQuence = 0; //记录当前最优解68.int MostTall; //记录i ⽤于跟踪构造路径69.for (i=0; i70. {71.if (B[i].maxlen+C[i].maxlen-1 > maxQuence)72. {73. maxQuence = B[i].maxlen+C[i].maxlen-1;74. MostTall = i;75. }76. }77.78. cout<<"最⼤合唱队形长度: "<79.80.//B由前向后构造因此prev指向前⾯的元素需要递归输出81. Display( A, B, MostTall);82.//C的prev指向后⾯元素直接迭代输出83.while (C[MostTall].prev != -1)84. {85. MostTall = C[MostTall].prev;86. cout<87. }88. cout<89.90.delete []B;91.delete []C;92.}93.int main()94.{95.//测试96.int *A;97.int n;98. cout<<"请输⼊合唱队员个数: "<99. cin>>n;100.101. A = new int[n];102. cout<<"输⼊队员⾝⾼ :"<103.for (int i=0; i104. {105. cin>>A[i];106. }107. GetBestQuence(A, n);108.delete []A;109.return 0;110.}5-7买票问题状态转移⽅程是f[i] := min(f[i - 1] + t[i], f[i - 2] + r[i - 1]); {i = 2 ~ n} 初值f[0] := 0; f[1] := t[1]; constmaxn = 1000;vari, j, n : longint;f, t, r : array[0..maxn] of longint;function min(a, b : longint) : longint;begin if a < b then exit(a); exit(b); end;beginreadln(n);for i := 1 to n do read(t[i]);for i := 1 to n - 1 do read(r[i]);f[0] := 0; f[1] := t[1];for i := 2 to n dof[i] := min(f[i - 1] + t[i], f[i - 2] + r[i - 1]);writeln(f[n]);end.伪代码BuyTicks(T, R)1n ← length[T]2f[0] ← 03f[1] ← T[1]4for i ← 2to n do5f[i] ← f[i-2]+R[i-1]6if f[i] > f[i-1]+T[i] then7f[i] ← f[i-1]+T[i]8return f5-8最⼤⼦段和问题#include#includeintmax_sum(intn,int *a,int *besti,int *bestj){ int *b = (int *)malloc(n * sizeof(int));int sum = 0;int i = -1;int temp = 0;for (i=0;i<=n-1;i++) {if (temp > 0)temp += a[i];elsetemp = a[i];b[i] = temp;}sum = b[0];for (i=1;i<=n-1;i++) {if (sum < b[i]) {sum = b[i];*bestj = i;}}for (i = *bestj;i>= 0;i--) {if (b[i] == a[i]) {*besti = i;break;}}free(b);return sum;}int main(void){int a[] = {-2,1,-4,13,-5,-2,-10,20,100};int length = sizeof(a)/sizeof(int);intbesti = -1;intbestj = -1;sum = max_sum(length,a,&besti,&bestj);printf("besti = %d,bestj = %d,max_sum=%d\n",besti,bestj,sum); return 0;}5-9 装箱问题发现就是0-1背包问题每个物品的体积就是花费同时也是价值,也就是说这题可以转化为在总体积为w下,可以得到最⼤的价值最后⽤总体积减去最⼤的价值就是剩下最少的空间状态转移⽅程d[j] = max(d[j], d[j - a[i]] + a[i]);第⼆⾏为⼀个整数,表⽰有n个物品;接下来n⾏,每⾏⼀个整数表⽰这n个物品的各⾃体积。

算法分析与设计(习题答案)

算法分析与设计(习题答案)

算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。

频率计数是指计算机执行程序中的某一条语句的执行次数。

多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。

指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。

2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。

3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。

4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。

5. 解:①n=11; ②n=12; ③n=982; ④n=39。

第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。

2. 解:通过分治算法的一般设计步骤进行说明。

3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解:void hanoi(int n,int a,int b,int c) {if(n>0) {hanoi(n-1,a,c,b); move(a,b);hanoi(n-1,c,b,a); } } 5. 解:①22*2)(−−=n n f n② )log *()(n n n f O =6. 解:算法略。

算法分析与设计第二版习题答案-第三章到第五章

算法分析与设计第二版习题答案-第三章到第五章
{
int bool=1;
int min;
int j;
int i;
int k;
int flag;
for(i=0;i<count;i++)
{
if(buf[i]=='(')
push(buf[i],i);
if(buf[i]==')')
{
flag=pop();
算法设计与分析(第二版)习题答案 主编:吕国英
算法设计与分析(第二版)习题答案(第三章)
第三章:
1.#include<stdlib.h>#include<stdio.h>int main(int argc,char **argv){int n;int i,j,k;int *buf;printf("请输入n的数值:");
;}for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("]",buf[i][j]); printf("\n");}return
0;}6.#include<stdio.h>#include<stdlib.h>typedef struct s_node s_list;typedef s_list *link;struct s_node{char ch;int flag;link next;};link top;void push(char ch,int flag){link newnode;newnode=(link)malloc(sizeof(s_list));newnode->ch=ch;newnode- >flag=flag;newnode-

安徽工业大学《算法设计与分析》考试内容

安徽工业大学《算法设计与分析》考试内容

1.算法的定义:算法是解某一特定问题的一组有穷规则的集合。

2.算法的性质:有限性、确定性、输入、输出、能行性4.算法的时间复杂性越高,算法的执行时间越长;反之,执行时间越短。

算法的空间复杂性越高,算法所需的存储空间越多;反之越少。

5.初等操作:所有的操作都具有相同的固定字长;所有操作的时间花费都是一个常数时间间隔。

6. 算法分析的目的:分析算法占用计算机资源的情况,对算法做出比较和评价,设计出额更好的算法7.算法的时间复杂性与问题的规模相关,是问题大小n 的函数。

8.因此可以用T(n)的数量级(阶)评价算法。

时间复杂度T(n)的数量级(阶)称为渐进时间复杂性。

设算法执行时间为T (n ),如果存在)(*n T ,使得:0)()()(lim*=-∞→n T n T n T n就称)(*n T 为算法的渐进时间复杂性。

9.运行时间的上界:令N 为自然数集合,R+为正实数集合。

函数f :N →R+,函数g :N →R+。

若存在自然数n 0和正常数c ,使得对所有的n ≥n 0,都有,f (n )≤cg (n ),就称函数f (n )的阶至多是O (g (n ))f (n )的增长最多像g (n )的增长那样快。

这时称O (g (n ))是f (n )的上界。

第二章堆可以看做一课完全二叉树,假设高度为d ,具有如下性质: 1.所有叶节点不是处于第d 层,就是处于d-1层 2.当d ≥1时,第d-1层上有2d-1个结点3.第d-1层上如果有分支节点,则这些分支节点都集中在树的最左边4.每个结点所存放元素的关键字,都大于或者小于它的孩子结点的关键字 第四章1.对于一个规模为n 的问题p(n),归纳法的思想方法是: a )基础步:a1是问题p(1)的解。

b )归纳步:对所有的k ,1<k <n ,若b 是问题p(k)的解,则p(b)是问题p(k+1)的解。

其中, p(b)是对问题的某种运算或处理。

田翠华著《算法设计与分析》课后习题参考答案

田翠华著《算法设计与分析》课后习题参考答案

参考答案第1章一、选择题1. C2. A3. C4. C A D B5. B6. B7. D 8. B 9. B 10. B 11. D 12. B二、填空题1. 输入;输出;确定性;可行性;有穷性2. 程序;有穷性3. 算法复杂度4. 时间复杂度;空间复杂度5. 正确性;简明性;高效性;最优性6. 精确算法;启发式算法7. 复杂性尽可能低的算法;其中复杂性最低者8. 最好性态;最坏性态;平均性态9. 基本运算10. 原地工作三、简答题1. 高级程序设计语言的主要好处是:(l)高级语言更接近算法语言,易学、易掌握,一般工程技术人员只需要几周时间的培训就可以胜任程序员的工作;(2)高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;(3)高级语言不依赖于机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好、重用率高;(4)把复杂琐碎的事务交给编译程序,所以自动化程度高,发用周期短,程序员可以集中集中时间和精力从事更重要的创造性劳动,提高程序质量。

2. 使用抽象数据类型带给算法设计的好处主要有:(1)算法顶层设计与底层实现分离,使得在进行顶层设计时不考虑它所用到的数据,运算表示和实现;反过来,在表示数据和实现底层运算时,只要定义清楚抽象数据类型而不必考虑在什么场合引用它。

这样做使算法设计的复杂性降低了,条理性增强了,既有助于迅速开发出程序原型,又使开发过程少出差错,程序可靠性高。

(2)算法设计与数据结构设计隔开,允许数据结构自由选择,从中比较,优化算法效率。

(3)数据模型和该模型上的运算统一在抽象数据类型中,反映它们之间内在的互相依赖和互相制约的关系,便于空间和时间耗费的折衷,灵活地满足用户要求。

(4)由于顶层设计和底层实现局部化,在设计中出现的差错也是局部的,因而容易查找也容易2 算法设计与分析纠正,在设计中常常要做的增、删、改也都是局部的,因而也都容易进行。

算法设计与分析 ppt

算法设计与分析 ppt
算法设计与分析 >目录
第一章 算法概述 第二章 递归与分治策略 第三章 动态规划 第四章 贪心算法 第五章 回朔法 第六章 分支限界法 第七章 随机化算法
1
算法设计与分析 >第一章 目录
1.1 算法与程序 1.2 算法复杂度分析 1.3 NP完全性理论
2
算法设计与分析>算>法算概法述概述
1.1 算法与程序 1 算法定义及其特性
A


条件成立?
条件成立?


B
A
B
A
C
14
算法设计与分>析算>法算概法述概述
5. 算法分类
从解法上 数值型算法:算法中的基本运算为算术运算. 非数值型算法:算法中的基本运算为逻辑运算.
从处理方式上 串行算法:串行计算机上执行的算法. 并行算法:并行计算机上执行的算法.
本课程主要介绍非数值型的串行算法.
如果存在一个函数 ~T(n)使得当n ,有
(T(n) - ~T(n)) / T(n)0
称 ~T(n)是T(n)当 n 时的渐进性态 或 渐进复杂性
27
算法设计与分>>析算算法>法算复概法杂述概性分述析 >渐进性态
在数学上,T(n)与 ~T(有n)相同的最高阶项.可取 为~T(略n去) T(n)的低阶项后剩余的主项. 例如 T(n)=3n2+4nlogn+7, 则 ~T(n) 可以是3n2 当n充分大时用 ~T(n)代替T(n)作为算法复杂性的度量, 以简化分析 比较两个算法时,如果他们的阶不同,就可分出效率高低 。故此时只需关心 ~T最(n高) 限的阶即可。可忽略最高项系 数或低阶项。
4
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

30
【程序5-10】两路合并排序 template <class T> void SortableList<T>::MergeSort(int left,int right) { if (left<right) { int mid = (left+right)/2; MergeSort(left,mid); MergeSort(mid+1,right); Merge(left,mid,right); } }
20
5.3.2 对半搜索
对半搜索 对半搜索是一种二分搜索。设当前搜索的子表 为(aleft,aleft+1,…,aright), 令 m=(left+right)/2 对半搜索将原表划分为两个几乎大小相等的子表。
21
【程序5-7】 对半搜索递归算法 template <class T> int SortableList<T>::BSearch(const T& x, int left, int right)const { if (left<=right){ int m=(left+right)/2; if (x<l[m]) return BSearch(x,left,m-1); else if (x>l[m]) return BSearch(x,m+1,right); else return m; } return -1; }
当n=1时没有进行比较,T(1)=0 当n=2时算法进行1次比较, T(1)=1
n2
一般地,规模为n的序列,算法两次递归调用自身, 另外还需要进行两次额外比较,就是从两个子表的最 大元和最小元求的原表的最大元和最小元。所以得到 上述递推式。用迭代法计算可得
16
T(n)=3n/2-2
5.3 二分搜索
第5章 分治法
1
5.1 分治法的基本思想 5.2 求最大最小元 5.3 二分搜索 5.4 排序问题 5.5 选择问题 5.6 斯特拉森矩阵乘法
2
5.1 一般方法35.1.1 分治法的基本思想
分治法顾名思义就是分而治之。一个问题能够用分治法 求解的要素是: 第一,问题能够按照某种方式分解成若干个规模较小、 相互独立且与原问题类型相同的子问题; 第二,子问题足够小时可以直接求解; 第三,能够将子问题的解组合成原问题的解。 由于分治法要求分解成同类子问题,并允许不断分解, 使问题规模逐步减小,最终可用已知的方法求解足够小 的问题,因此,分治法求解很自然导致一个递归算法。
28
29
分治法求解
将待排序的元素序列一分为二分,得到两个长度 基本相等的子序列,如同对半搜索的做法;然后对 两个子序列分别排序,如果子序列较长,还可继续 细分,直到子序列的长度不超过1为止;当分解所得 的子序列已排列有序,可以采用上面介绍的将两个 有序子序列,合并成一个有序子序列的方法,实现 将子问题的解组合成原问题解,这是分治法不可缺 少的一步。
设有n个元素的表,假定n是2的幂,即n=2k,k 是正整数,程序5-5在最好、平均和最坏情况下 的比较次数都为3n/2–2。
n1 0 T ( n ) 1 n2 T ( n / 2 ) T ( n / 2 ) 2
15
n2
n1 0 T ( n ) 1 n2 T ( n / 2 ) T ( n / 2 ) 2
d T( n ) 2T ( n / 2 ) cn
n1 n1
10
【程序5-4修改】 求最大最小元 template <class T> void SortableList<T>::MaxMin(T& max, T& min)const { if (n==0)return; max=min=l[0]; for (int i=1; i<n; i++) { if(l[i]>max) max=l[i]; else if(l[i]<min) min=l[i]; } } 在最好和平均情况下的性能得到改善了,但是当 序列是有序递减时比较次数也是2(n-1)。
17
问题 在有序表(已按关键字值非减排序)中搜索给 定元素的问题。
二分搜索法,它充分利用了元素间的次序关系,采用分治
策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思 想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找 的x作比较, 如果x=a[n/2]则找到x,算法终止。 如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这 里假设数组元素呈升序排列)。 如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。
27
【程序5-9】 Merge函数 template <class T> void SortableList<T>::Merge(int left, int mid,int right) { T* temp=new T[right-left+1]; int i=left,j=mid+1,k=0; while (( i<=mid )&& (j<=right)) if (l[i]<=l[j]) temp[k++]=l[i++]; else temp[k++]=l[j++]; while (i<=mid) temp[k++]=l[i++]; while (j<=right) temp[k++]=l[j++]; for (i=0,k=left;k<=right;) l[k++] = temp[i++]; }
19
【程序5-6】二分搜索算法框架 template <class T> int SortableList<T>::BSearch(const T& x, int left,int right)const { if (left<=right){ int m=Divide(left+right); //按照某种规则求分割点 if (x<l[m]) return BSearch(x,left,m-1); else if (x>l[m]) return BSearch(x,m+1,right); else return m; } return -1; }
18
5.3.1 分治法求解
int SortableList<T>::BSearch(const T& x, int left,int right)const 后置条件: 在范围为[left,right]的表中搜索与x有相同 关键字值的元素;如果存在该元素,则函数返回该 元素在表中的位置,否则函数返回-1,表示搜索失 败。

6
【程序5-2】 一分为二的分治法 SolutionType DandC(int left,int right) { if (Small(left, right)) return S(left,right); else { int m=Divide(left,right); Return Combine(DandC(left,m), DandC(m+1,right)); } }
23
【程序5-8】 对半搜索迭代算法 template <class T> int SortableList<T>::BSearch(const T& x, int left, int right)const { while(left<=right){ int m=(left+right)/2; if (x<l[m]) right= m+1 ;
7
5.2 求最大最小元
8
问题 在一个元素集合中寻找最大元素和最小元素的 问题。 寻找的方法有很多种, 可通过n1次比较找到最 大的值,然后再从余下的n1个元素中用类似的 方法通过n2次比较找出最小的值,这种方法的 比较总次数为2n3。 另一种方法是同时求最大元和最小元,程序 5-4,是这种方法,它的最好最坏和平均情况下 都要2(n-1)次元素间的比较。
31
template <class T> void SortableList<T>::MergeSort() { MergeSort(0,n-1); }
32
33
性能分析
合并排序递归算法的时间复杂度为O(n log n)。
d T( n ) 2T(n / 2) cn
n 1 n 1
9
5.2.1 分治法求解
【程序5-4】 求最大最小元 template <class T> void SortableList<T>::MaxMin(T& max, T& min)const { if (n==0)return; max=min=l[0]; for (int i=1; i<n; i++) { if(l[i]>max) max=l[i]; if(l[i]<min) min=l[i]; } }
22
定理5-3 对 于 n0 , 程 序 5 - 7 的 对 半 搜 索 递 归 函 数 BSearch是正确的。 归纳法证明;n=0时正确返回-1 假设函数对长度小于n=right-left+1的 有序表能 正确运行,当长度为n时,算法执行下列程序段
int m=(left+right)/2; if (x<l[m]) return BSearch(x,left,m-1); else if (x>l[m]) return BSearch(x,m+1,right); else return m;
相关文档
最新文档