算法设计与分析期末复习
- 格式:docx
- 大小:126.74 KB
- 文档页数:15
计算机算法设计与分析期末考试复习资料一、算法设计实例1、快速排序(分治法)int partition(float a[], int p, int r) {int i= p, j=r+1;float x = a[p];while(1){while(a[++i] < x);while(a[--j] < x);if(i >= j)break;swap (a[i], a[j]);}a[p] = a[j];a[j] = x;return j;}void Quicksort(float a[], int p, int r){//快速排序if(p < r){int q = partition(a, p, r);Quicksort(a, p, q-1);Quicksort(a, p+1, r);}}2、归并排序(分治法)void mergesort (Type a[], int left, int right) {if (left < rigth){int mid = (left + right)/2; //取中点mergesort (a, left, mid);mergesort (a, mid+1, right);mergesort (a, b, left, right);//合并到数组bmergesort (a, b, left, right);//复制到数组a}}3、背包问题(贪心算法)void knapsack (int n, float m ,float v[], float w[], float x[]) { sort(n, v, w) //非递增排序int i;for (i=1 ; i<=n; i++)x[i] = 0;float c = m;for (i= 1; i<=n; i++){if (w[i] > c)break;x[i] = 1;c -= w[i];}if (i <= n)x[i] = c/w[i] ;}4、活动安排问题(贪心算法)void Greadyselector (int n, Type s[], Type f[], bool A[]) { //s[i] 为活动结束时间,f[j]为j活动开始时间A[i] = true;int j= 1;for (i=2; i<=n; i++){if (s[i] >= f[j]){A[i] = true; j=i;}elseA[i] = false;}}5、喷水装置问题(贪心算法)void knansack (int w, int d, float r[], int n){//w为草坪长度d为草坪宽度r[]为喷水装置的喷水半径,//n为n 种喷水装置,喷水装置的喷水半径>= d/2sort (r[], n); //降序排序count = 0; //记录装置数for (i=1; i<=n; i++)x[i] = 0;//初始时,所有喷水装置没有安装x[i]=0for (i=1; w >= 0; i++){x[i] = 1;count ++;w = w - 2*sqart(r[i]*r[i] - 1);}count << 装置数: << count << end1;for (i=1; i<= n; i++)count << 喷水装置半径:<< r[i] << end1;}6、最优服务问题(贪心算法)double greedy (rector x, int s){rector st(s+1, 0);rector su(s+1 ,0);int n=x.size();//st[] 是服务数组,st[j]为第j个队列上的某一个顾客的等待时间//su[] 是求和数组,su[j]为第j个队列上所有顾客的等待时间sort(x.begin(), x.end());//每个顾客所需要的服务时间升序排列int i=0, j=0;while( i<="" p="">{st[j] += x[i]; //x[i]= x.begin-x.endsu[j] += st[j];i++;j++;if ( j==s)j=0;}double t=0;for (i=0; i<="" p="">t += su[i];t /=n;return t;}7、石子合并问题(贪心算法)float bebig (int A[], int n) {m = n;sort(A, m); //升序while (m>1){for (i=3; i<=m; i++)if ( p<="" p="">break;elseA[i-2]=A[i];for (A[i-2] = p;i<= m; i++){A[i-1] = A[i];m--;}}count << A[1] << end1}8、石子合并问题(动态规划算法)best [i][j] 表示i-j 合并化最优值sum [i][j] 表示第i个石子到第j个石子的总数量| 0f(i,j) = || min{f(i,k) + f(k+1,j)}+ sum(i,j)int sum [maxm]int best [maxm][maxn];int n, stme[maxn];int getbest();{//初始化,没有合并for (int i=0; i< n; i++)best[i][j] =0;//还需要进行合并for (int r=1; r<="">{for(i=0; i<="" p="">{int j = i+v;best[i][j]= INT- MAX;int add = sum[j] -(i>0 ! sum[i-1]: 0);//中间断开位置,取最优值for (int k=i; k<="" p="">{best[i][j]= min(best[i][j], best[i][k]+best[k+1][j])+add; }}}return best[0][n-1];}9、最小重量机器设计问题(回溯法)typedef struct Qnode{float wei;//重量float val;//价格int ceng;//层次int no; //供应商struct Qnode * Parent;//双亲指针}Qnode;float wei[n+1][m+1] = ;float val[n+1][m+1] = ;void backstack (Qnode *p){if (p->ceng == n+1){if (bestw > p->wei){testw = p->wei;best =p;}}else{for (i=1; i<=m; i++)k=p->ceng;vt = p->val + val[k][i];wt = p->wei + wei[k][i];if (vt <=d && wt <= bestw){s = new Qnode;s->val = vt;s->wei = wt;s->ceng = k+1;s->no = 1;s->parent = p;backstrack(S);}}}10、最小重量机器设计问题(分支限界法)typedef struct Qnode{float wei;//重量float val;//价格int ceng;//层次int no; //供应商struct Qnode * Parent;//双亲指针}Qnode;float wei[n+1][m+1] = ;float val[n+1][m+1] = ;void minloading(){float wt=0;float vt=0;float bestw= Max;//最小重量Qnode *best; s = new Qnode;s->wei = 0;s->val = 0;s->ceng = 1;s->no =0;s->parent=null;Iinit_Queue(Q);EnQueue(Q,S);do{p=OutQueue(Q);//出队if (p->ceng==n+1) {if(bestw > p->wei){bestw = p->wei;best =p;}}else{for (i=1; i<=m;i++){k= p->ceng;vt =p->val + val[k][i];wt =p->wei + wei[k][i];if (vt <=d && wt <=bestw){s= new Qnode;s->ceng=k+1;s->wt=wt;s->val=val;s->no=i;s->parent=p;EnQueue (Q, S);}}}}while(!empty(Q));p=best;while(p->parent){count << 部件:<< p->ceng-1 << end1; count << 供应商:<< p->no << end1; p=p->parent;}}11、快速排序(随机化算法—舍伍德算法)int partion (int a[], int l, int r){key = a[l];int i=l, j=r;while(1){while(a[++i]< key && i<=r);while(a[--j]> key && j>=l);if(i >= j)break;if (a[i] != a[j])swap(a[i] , a[j]);}if ((j !=l) && a[l] != a[j])swap(a[l], a[j]);return j;}int Ranpartion (int a[], int l, int r) {k=rand()%(r-1 + l)+1;swap(a[k], a[l]);int ans = partion(a, l, r);return ans;}int Quick_sort(int a[], int l, int r, int k) {int p= Randpartion(a, l, r);if (p == k)return a[k];else if (k< p)return Quick_sort(a, l, p-1, k);else{int j= 0;for (int i= p+1; i<=r; i++)b[j++] = a[i]return Quick_sort(b, 1, j, k-p);}}12、线性选择(随机化算法—舍伍德算法)二、简答题1.分治法的基本思想分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。
《算法分析与设计》期末测验复习题纲(完整版)————————————————————————————————作者:————————————————————————————————日期:《算法分析与设计》期末复习题一、选择题1.算法必须具备输入、输出和( D )等4个特性。
A.可行性和安全性 B.确定性和易读性C.有穷性和安全性 D.有穷性和确定性2.算法分析中,记号O表示( B ),记号Ω表示( A )A.渐进下界B.渐进上界C.非紧上界D.紧渐进界3.假设某算法在输入规模为n时的计算时间为T(n)=3*2^n。
在某台计算机上实现并完成概算法的时间为t秒。
现有另一台计算机,其运行速度为第一台的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题?( B )解题方法:3*2^n*64=3*2^xA.n+8 B.n+6C.n+7 D.n+54.设问题规模为N时,某递归算法的时间复杂度记为T(N),已知T(1)=1,T(N)=2T(N/2)+N/2,用O表示的时间复杂度为( C )。
A.O(logN) B.O(N)C.O(NlogN) D.O(N²logN)5.直接或间接调用自身的算法称为( B )。
A.贪心算法 B.递归算法C.迭代算法 D.回溯法6.Fibonacci数列中,第4个和第11个数分别是( D )。
A.5,89 B.3,89C.5,144 D.3,1447.在有8个顶点的凸多边形的三角剖分中,恰有( B )。
A.6条弦和7个三角形 B.5条弦和6个三角形C.6条弦和6个三角形 D.5条弦和5个三角形8.一个问题可用动态规划算法或贪心算法求解的关键特征是问题的( B )。
A.重叠子问题 B.最优子结构性质C.贪心选择性质 D.定义最优解9.下列哪个问题不用贪心法求解( C )。
A.哈夫曼编码问题 B.单源最短路径问题C.最大团问题 D.最小生成树问题10.下列算法中通常以自底向上的方式求解最优解的是( B )。
A卷一、选择题1.二分搜索算法是利用(A )实现的算法。
A、分治策略B、动态规划法C、贪心法D、回溯法2. 回溯法解旅行售货员问题时的解空间树是( A )。
A、子集树B、排列树C、深度优先生成树D、广度优先生成树3.下列算法中通常以自底向上的方式求解最优解的是(B )。
A、备忘录法B、动态规划法C、贪心法D、回溯法4.下面不是分支界限法搜索方式的是( D )。
A、广度优先B、最小耗费优先C、最大效益优先D、深度优先5.采用贪心算法的最优装载问题的主要计算量在于将集装箱依其重量从小到大排序,故算法的时间复杂度为 ( B ) 。
A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)6.分支限界法解最大团问题时,活结点表的组织形式是( B)。
A、最小堆B、最大堆C、栈D、数组7、下面问题(B )不能使用贪心法解决。
A 单源最短路径问题B N皇后问题C 最小花费生成树问题D 背包问题8.下列算法中不能解决0/1背包问题的是(A )A 贪心法B 动态规划C 回溯法D 分支限界法9.背包问题的贪心算法所需的计算时间为( B )A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)10.背包问题的贪心算法所需的计算时间为(B )。
A、O(n2n)B、O(nlogn)C、O(2n)D、O(n)二、填空题1.算法的复杂性有复杂性和复杂性之分。
2.算法是由若干条指令组成的有穷序列,且要满足输入、、确定性和四条性质。
其中算法的“确定性”指的是组成算法的每条是清晰的,无歧义的。
3.解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的是,需要排序的是,。
4.动态规划算法的两个基本要素是. 性质和性质。
5.回溯法是一种既带有又带有的搜索算法;分支限界法是一种既带有又带有的搜索算法。
6. 用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。
在任何时刻,算法只保存从根结点到当前扩展结点的路径。
计算机算法设计与分析期末复习资料一填空题(20x1=20分)1.当有多个算法来解决集合问题时,选择算法的主要原则是选择复杂度最低的算法。
2.函数本身定义的函数是递归函数。
该算法适用于求解动态规划问题。
4.贪心算法的两个基本要素是最优子结构性质、贪心选择性质。
5.在搜索解空间树时,回溯方法通常使用深度优先的方法来提高搜索效率,以避免无效搜索。
6.根据不同的求解目标,分枝定界法和回溯法分别通过广度优先遍历或最小代价优先和深度优先搜索解空间树。
7.分支界限法和回溯法主要区别在于求解目标和搜索方式不同。
8.在执行分支定界法时,通常使用该方法来实现最大优先级队列。
9.依据求解所花费的时间和所得到的结果不同,随机化算法大致分为数值随机化算法、蒙特卡罗算法、拉斯维加斯算法和舍伍德算法四类。
10.产生伪随机数最常用的方法是线性同余法。
11.线性规划算法中旋转轴变化的目的是调整基准内变量和基准外变量的位置。
12.在最大网络流问题中,增广路径是剩余网络中容量大于0的路径。
13.应用于动态规划的待解决问题的两个基本要素是:。
14.算法必须满足的四个特征是输入、输出、确定性和有限性。
15.算法复杂性依赖于、、三个方面的复杂因素。
16.实现递归调用的关键是17.动态规划算法解决问题的重要线索是问题的性质。
18.最优子结构性质是贪婪算法的关键特征。
19.分支界限法的求解目标是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
20.有两种常见的解空间树:子集树和置换树。
21.分支界限算法依据其从和节点表中选择获得下一扩展节点的不同方式被分为22.对于任何约束标准线性规划问题,只要基本变量设置为0,就可以得到一个解。
三概念题(6x2=12分)1.算法复杂度:指算法运行所需的计算机资源量。
需要时间资源的量称为时间复杂度,需要空间资源源的量称为空间复杂性。
2.递归算法:直接或间接调用自身的算法称为递归算法。
算法设计与分析期末复习题【试题.知识点】算法设计与分析期末考试复习题1.算法有哪些特点?为什么说⼀个具备了所有特征的算法,不⼀定就是使⽤的算法?2.证明下⾯的关系成⽴:(参考例题1.5--1.6)(1)logn!=Θ(nlogn) (2)2n=Θ(2n+1)(3)n!=Θ(n n) (4)5n2-6n=Θ(n2)13.考虑下⾯的算法:输⼊:n个元素的数组A输出:按递增顺序排序的数组A1. void sort(int A[],int n)2. {3. int i,j,temp;4. for(i=0;i5. for(j=i+1;j6. if(A[j]7. temp=A[i];8. A[i]=A[j];9. A[j]=temp;10. }11. }(1)什么时候算法所执⾏的元素赋值的次数最少?最少多少次?(2)什么时候算法所执⾏的元素赋值的次数最多?最多多少次?4.考虑下⾯的算法:输⼊:n个元素的数组A输出:按递增顺序排序的数组A1. void bubblesort(int A[],int n)2. {3. int j,i,sorted;4. i=sorted=0;5. while(i6. sorted=1;7. for(j=n-1;j>i;j--) {8. if(A[j]9. temp=A[j];210. A[j]=A[j-1];11. A[j-1]=temp;12. sorted=0;13. }14. }15. i=i+1;16. }17. }(1)算法所执⾏的元素⽐较次数最少是多少次?什么时候达到最少?(2)算法所执⾏的元素⽐较次数最多是多少次?什么时候达到最多?(3)算法所执⾏的元素赋值次数最少是多少次?什么时候达到最少?(4)算法所执⾏的元素赋值次数最多是多少次?什么时候达到最多?(5)⽤О、和Ω记号表⽰算法的运⾏时间。
(6)可以⽤Θ记号来表⽰算法的运⾏时间吗?请说明。
35.解下⾯的递归⽅程:(1)f(n)=5f(n-1)-6f(n-2) f(0)=1 f(1)=0(2)f(n)=4f(n-1)-4f(n-2) f(0)=6 f(1)=86.初始链表的内容为:3562,6381,0356,2850,9136,3715,8329,7481,写出⽤基数排序算法对它们进⾏排序的过程。
《算法分析与设计》期末复习题一、选择题1.应用Johnson法则的流水作业调度采用的算法是(D)A. 贪心算法B. 分支限界法C.分治法D. 动态规划算法2.Hanoi塔问题如下图所示。
现要求将塔座A上的的所有圆盘移到塔座B上,并仍按同样顺序叠置。
移动圆盘时遵守Hanoi塔问题的移动规则。
由此设计出解Hanoi塔问题的递归算法正确的为:(B)Hanoi塔4. 算法分析中,记号O表示(B),记号Ω表示(A),记号Θ表示(D)。
A.渐进下界B.渐进上界C.非紧上界D.紧渐进界E.非紧下界5. 以下关于渐进记号的性质是正确的有:(A)A.f(n)(g(n)),g(n)(h(n))f(n)(h(n))=Θ=Θ⇒=ΘB. f(n)O(g(n)),g(n)O(h(n))h(n)O(f(n))==⇒=C. O(f(n))+O(g(n)) = O(min{f(n),g(n)})D. f(n)O(g(n))g(n)O(f(n))=⇔=6.能采用贪心算法求最优解的问题,一般具有的重要性质为:(A)A. 最优子结构性质与贪心选择性质B.重叠子问题性质与贪心选择性质C.最优子结构性质与重叠子问题性质D. 预排序与递归调用7. 回溯法在问题的解空间树中,按(D)策略,从根结点出发搜索解空间树。
广度优先 B. 活结点优先 C.扩展结点优先 D. 深度优先8. 分支限界法在问题的解空间树中,按(A)策略,从根结点出发搜索解空间树。
A.广度优先 B. 活结点优先 C.扩展结点优先 D. 深度优先9. 程序块(A)是回溯法中遍历排列树的算法框架程序。
A.B.C.D.10.x[k]的个数。
11. 常见的两种分支限界法为(D)A. 广度优先分支限界法与深度优先分支限界法;B. 队列式(FIFO)分支限界法与堆栈式分支限界法;C. 排列树法与子集树法;D. 队列式(FIFO)分支限界法与优先队列式分支限界法;12. k带图灵机的空间复杂性S(n)是指(B)A.k带图灵机处理所有长度为n的输入时,在某条带上所使用过的最大方格数。
《算法设计与分析》复习考试题型填空10x1’选择15x2’简答2x5’大题5x10’1.5个重要特性:输入、输出、有穷性、确定性、可行性2.5个特性:正确性、健壮性、可理解性、抽象分级、高效性3.描述方法:自然语言、流程图、程序设计语言、伪代码4.问题类型:查找问题、排序问题、图问题、组合问题、几何问题5.输入规模:输入量的多少6.算法就是一组有穷的规则,它们规定了解决某一特定问题的一系列运算7.算法是由若干条指令组成的有序序列,解决问题的一种方法或一个过程8.基本语句:执行次数与整个算法的执行次数成正比的语句,它对算法运行时间的贡献最大,是算法最重要的操作9.算法的时间复杂性分析是一种事前分析估算方法,它是对算法所消耗资源的一种渐进分析方法。
10.算法的空间复杂性是指在算法的执行过程中需要的辅助空间数量,也就是除算法本身和输入输出数据所占用的空间外,算法临时开辟的存储空间,这个辅助空间数量也应该是输入规模的函数,通常记作:S(n)=O(f(n))。
其中n为输入规模,分析方法与算法的时间复杂性类似。
11.渐进分析是指忽略具体机器、编程语言和编译器的影响,只关注在输入规模增大时算法运行时间的增长趋势。
12.大O符号:当输入规模充分大时,算法中基本语句的执行次数在渐近意义下的阶,上界13.大Ω符号:问题的计算复杂性下界是求解这个问题所需的最少工作量,求解该问题的任何算法的时间复杂性都不会低于这个下界14.计算复杂性下界:对于任何待求解的问题,如果能找到一个尽可能大的函数g(n)(n为输入规模),使得求解该问题的所有算法都可以在Ω(g(n))的时间内完成,则函数g(n)即是下界15.下界紧密:如果已经知道一个和下界的效率类型相同的算法,则该下界紧密16.扩展递归:一种常用的求解递推关系式的基本技术,扩展就是将递推关系式中等式右边的项根据递推式进行替换,扩展后的项被再次扩展,依此下去,会得到一个求和表达式,然后就可以借助于求和技术了17.最优算法:一般情况下,如果能够证明某问题的时间下界是Ω(g(n)),那么对以时间O(g(n))来求解该问题的任何算法,都认为是求解该问题的最优算法18.平凡下界:对问题的输入中必须要处理的元素进行计数,同时对必须要输出的元素进行计数。
复习一、简答题(每小题5分,选答2题,共10分)1. 什么是算法?试说明算法设计分析过程的一般框架和主要步骤。
2. 简述非递归算法时间效率分析的通用方案。
3. 简述递归算法时间效率的通用方案。
4. 简述蛮力法、分治法、减治法,变治法、时空权衡、动态规划、贪婪技术、迭代改进八种算法设计技术中至少三种技术基本思想或原理。
二、分析题(每小题10分,共20分)1. 考虑下面的算法。
P52算法Mystery(n) //输入:非负整数nS=0for i 1 to n doS S + i*iReturn Sa.该算法求的是什么?b.它的基本操作是什么?c.该基本操作执行了多少次?d.该算法的效率类型是什么?2. 考虑下面的递归算法。
P52算法Secret(A[0..n-1]) //输入:包含n个实数的数组A[0..n-1]minval A[0]; maxval A[0]for i 1 to n-1 doif A[i] < minvalminval A[i]if A[i] > maxvalmaxval A[i]return maxval – minvala.该算法求的是什么?b.它的基本操作是什么?c.该基本操作执行了多少次?d.该算法的效率类型是什么?3. 考虑下面的递归算法P59算法Q(n) //输入:正整数if n=1 return 1else return Q(n-1) + 2*n -1a. 建立该函数值的递推关系并求解,以确定该算法计算的是什么;b. 建立该算法所做的乘法运算次数的递推关系并求解;c. 建立该算法所做的加减运算次数的递推关系并求解。
三、算法设计题(每小题10分,共20分)1. 应用快速排序对序列E,X,A,M,P,L,E按照字母顺序排序。
并画出相应的递归调用树。
(4章分治法)P1022. 对于下面的有向图,应用基于DFS的算法来解拓扑排序问题。
(5章减治法)P133.3. 用自底向上算法为列表1, 8, 6, 5, 3, 7, 4进行堆排序。
一、选择题1.一个.java文件中可以有()个public类。
A.一个B.两个C.多个D.零个2.一个算法应该是()A.程序B.问题求解步骤的描述C.要满足五个基本特性D.A和C3.用计算机无法解决“打印所有素数”的问题,其原因是解决该问题的算法违背了算法特征中的()A.唯一性B.有穷性C.有0个或多个输入D.有输出4.某校有6位学生参加学生会主席竞选,得票数依次为130,20,98,15,67,3。
若采用冒泡排序算法对其进行排序,则完成第二遍时的结果是()A.3,15,130,20,98,67B.3,15,20,130,98,67C.3,15,20,67,130,98 D.3,15,20,67,98,1305.下列关于算法的描述,正确的是()A.一个算法的执行步骤可以是无限的B.一个完整的算法必须有输出C.算法只能用流程图表示D.一个完整的算法至少有一个输入6.Java Application源程序的主类是指包含有()方法的类。
A、main方法B、toString方法C、init方法D、actionPerfromed方法7.找出满足各位数字之和等于5的所有三位数可采用的算法思路是()A.分治法B.减治法C.蛮力法D.变治法8.在编写Java Application程序时,若需要使用到标准输入输出语句,必须在程序的开头写上( )语句。
A、import java.awt.* ;B、import java.applet.Applet ;C、import java.io.* ;D、import java.awt.Graphics ;9.计算某球队平均年龄的部分算法流程图如图所示,其中:c用来记录已输入球员的人数,sum用来计算有效数据之和,d用来存储从键盘输入的球员年龄值,输入0时表示输入结束。
图中空白处理框①和②处应填入的是()A.①sum ←sum + d B.①sum ←sum + c②c ←c + 1②c ←c + 1C.①sum ←sum + d D.①sum ←sum + c②d ←d + 1 ②d ←d + 110.报名参加冬季越野赛跑的某班5位学生的学号是:5,8,11,33,45。
《算法分析与设计》期末复习题一、选择题1。
应用Johnson 法则的流水作业调度采用的算法是(D )A. 贪心算法 B 。
分支限界法 C.分治法 D 。
动态规划算法2。
Hanoi 塔问题如下图所示。
现要求将塔座A 上的的所有圆盘移到塔座B 上,并仍按同样顺序叠置.移动圆盘时遵守Hanoi 塔问题的移动规则。
由此设计出解Hanoi 塔问题的递归算法正确的为:(B )Hanoi 塔A. void hanoi(int n, int A, int C, int B) { if (n > 0) {hanoi(n-1,A,C, B); move(n,a,b);hanoi(n-1, C, B, A); } B. void hanoi(int n, int A, int B, int C) {if (n > 0) {hanoi(n-1, A, C, B); move(n,a,b);hanoi(n-1, C, B, A); }C. void hanoi(int n, int C, int B, int A) {if (n > 0) {hanoi(n-1, A, C, B); move(n,a,b);hanoi(n-1, C, B, A); }3。
动态规划算法的基本要素为(C)A。
最优子结构性质与贪心选择性质B.重叠子问题性质与贪心选择性质C.最优子结构性质与重叠子问题性质D. 预排序与递归调用4。
算法分析中,记号O表示(B),记号Ω表示(A),记号Θ表示(D)。
A.渐进下界B。
渐进上界C.非紧上界D.紧渐进界E。
非紧下界5. 以下关于渐进记号的性质是正确的有:(A)A。
f(n)(g(n)),g(n)(h(n))f(n)(h(n))=Θ=Θ⇒=ΘB。
f(n)O(g(n)),g(n)O(h(n))h(n)O(f(n))==⇒=C. O(f(n))+O(g(n))= O(min{f(n),g(n)})D. f(n)O(g(n))g(n)O(f(n))=⇔=6。
三、算法设计题1.背包问题的贪心算法V oid Knapsack(int n,float M,float v[],float w[],float x[]) {Sort(n,v,w);int i;for (i=1;i<=n;i++) x[i]=0;float c=M;for (i=1;i<=n;i++){If (w[i]>c) break;x[i]=1;c-=w[i];}If(i<=n)x[i]=c/w[i];}2.循环赛日程表安排问题V oid Table(int k,int* *a){int n=1;for(int i=1;i<=k;i++)n*=2;for(int i=1;i<=n;i++)a[1][i]=i;for m=1;for(int s=1;i<=k;s++){n/=2;for(int t=1;t<=n;t++)for(int i=m+1;i<=2*m;i++)for(int j=m+1;j<=2*m;j++){a[i][j+(t-1)*m*2]=a[i-m][j+(t-1)*m*2-m];a[i][j+(t-1)*m*2-m]=a[i-m][j+(t-1)*m*2];m*=2;}}3.贪心算法求装载问题Template<class Type>void Loading(int x[],Type w[],Type c,int n){int *t=new int[n+1];Sort(w,t,n);for(int i=1;i<=n;i++)x[i]=0;for(int i=1;i<=n & & w[t[i]]<=c;i++){x[t[i]]=1;c-=w[t[i]];} }4.贪心算法求活动安排问题Template<class Type>void GreedySelector(int n,Type s[],Type f[],bool A[]){A[1]=true;int j=1;for(int i=2;i<=n;i++){If(s[i]>=f[j]){A[i]=true;j=1;}else A[i]=false;}}5.快速排序Template<class Type>V oid QuickSort(Type a[],int p,int r){if(p<r){int q=Partition(a,p,r);QuickSort(a,p,q-1);//对左半段排序QuickSort(a,q+1,r);//对右半段排序}}6.排列问题Template <class Type>void perm(Type list[], int k, int m ){ //产生[list[k:m]的所有排列if(k==m){ //只剩下一个元素for (int i=0;i<=m;i++) cout<<list[i];cout<<endl;}else //还有多个元素待排列,递归产生排列for (int i=k; i<=m; i++){swap(list[k],list[i]);perm(list,k+1;m);swap(list[k],list[i]);}}7.0-1背包问题8.旅行售货员问题template<class Type>class Traveling{friend void main(void);Public;Type BBTSP(int v[]);Private;int n;//图G的顶点数Type * *a,//图G的邻接矩阵NoEdge,//图G的无边标志cc,//当前费用bestc;//当前最小费用};四、算法分析题1.分治法的基本思想分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。
《算法分析与设计》期末复习题一、选择题1.应用Johnson 法则的流水作业调度采用的算法是(D )A. 贪心算法B. 分支限界法C.分治法D. 动态规划算法2.Hanoi 塔问题如下图所示。
现要求将塔座A 上的的所有圆盘移到塔座B 上,并仍按同样顺序叠置。
移动圆盘时遵守Hanoi 塔问题的移动规则。
由此设计出解Hanoi 塔问题的递归算法正确的为:(B )Hanoi 塔A. void hanoi(int n, int A, int C, int B) { if (n > 0) {hanoi(n-1,A,C, B); move(n,a,b);hanoi(n-1, C, B, A); } B. void hanoi(int n, int A, int B, int C) {if (n > 0) {hanoi(n-1, A, C, B); move(n,a,b);hanoi(n-1, C, B, A); }C. void hanoi(int n, int C, int B, int A) {if (n > 0) {hanoi(n-1, A, C, B); move(n,a,b);hanoi(n-1, C, B, A); }3. 动态规划算法的基本要素为(C)A. 最优子结构性质与贪心选择性质B.重叠子问题性质与贪心选择性质C.最优子结构性质与重叠子问题性质D. 预排序与递归调用4. 算法分析中,记号O表示(B),记号Ω表示(A),记号Θ表示(D)。
A.渐进下界B.渐进上界C.非紧上界D.紧渐进界E.非紧下界5. 以下关于渐进记号的性质是正确的有:(A)A.f(n)(g(n)),g(n)(h(n))f(n)(h(n))=Θ=Θ⇒=ΘB. f(n)O(g(n)),g(n)O(h(n))h(n)O(f(n))==⇒=C. O(f(n))+O(g(n)) = O(min{f(n),g(n)})D. f(n)O(g(n))g(n)O(f(n))=⇔=6.能采用贪心算法求最优解的问题,一般具有的重要性质为:(A)A. 最优子结构性质与贪心选择性质B.重叠子问题性质与贪心选择性质C.最优子结构性质与重叠子问题性质D. 预排序与递归调用7. 回溯法在问题的解空间树中,按(D)策略,从根结点出发搜索解空间树。
填空1.直接或间接地调用自身的算法称为 递归算法 。
2.算法的复杂性是 算法效率 的度量,是评价算法优劣的重要依据。
3.以广度优先或以最小耗费方式搜索问题解的算法称为 分支限界法 。
4.回溯法解题的显著特点是在搜索过程中动态产生问题的解空间。
在任何时刻,算法只保存从根结点到当前扩展结点的路径。
如果解空间树中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为 O (h(n)) 。
5.人们通常将问题的解决方案分为两大类:一类是可以通过执行若干个步骤就能得出问题结论的,叫做 算法 方案;另一类是不能通过若干个步骤直截了当地得出结论,而是需要反复验证才能解决的,叫做 启发式 方案。
6.算法就是一组有穷的 规则 ,它们规定了解决某一特定类型问题的 一系列运算 。
7.在进行问题的计算复杂性分析之前,首先必须建立求解问题所用的计算模型。
3个基本计算模型是 随机存取机RAM 、 随机存取存储程序机RASP 、 图灵机 。
8.快速排序算法的性能取决于 划分的对称性 。
9.计算机的资源最重要的是 时间资源 和 空间 资源。
因而, 算法的复杂性有 时间复杂度 和 空间复杂度 之分。
10.贪心算法总是做出在当前看来 最优 的选择。
也就是说贪心算法并不从整体最优考虑,它所做出的选择只是在某种意义上的 局部最优 。
11.许多可以用贪心算法求解的问题一般具有2个重要的性质: 贪心选择 性质和 最优子结构 性质。
12.常见的两种分支限界法为 队列式(FIFO )分支限界 和 优先队列式分支限界 。
13.解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中需要排序的是 回溯法、分支限界法 ,不需要排序的是 动态规划 。
14.f ( n ) = 6 × 2n + n 2,f(n)的渐进性态f ( n ) = O ( 2n )。
15.对于含有n 个元素的排列树问题,最好情况下计算时间复杂性为 ,最坏情况下计算时间复杂性为 n! 。
算法设计与分析期末复习
1、假设某算法在输入规模为n时的计算时间为T(n)=3*4n。
在某台计算机上实现并完成该算法的时间为t秒。
另一台机器运行速度是第一台的64倍,则在这台计算机上用同一算法在t秒内能解输入规模n2为多大的问题?
计算时间可表示为:T(n)=3*4n
设新机器上能解规模为n2的问题,则:T(n2)=3*4n2=64*3*4n
解可得n2=n+3
若算法的计算时间进一步改进为为T(n)=20,当m=4时,其余条件不变,则在新机器上用t秒时将能解输入规模n2为多大的问题(写出求解过程)
答案解析:
计算时间可表示为:T(n)=20,即和规模n无关的常量所以可解输入规模n2为任意值的问题。
2、写出以下代码所描述算法在最坏情况下所需的计算时间T(n)的递归方程,并对其进行求解写出其渐进形式。
public static void mergeSort(Comparable a[],int left, int right){
if (left<right) {
int i=(left+right)/2;
mergeSort(a, left, i);
mergeSort(a, i+1, right);
merge(a, b, left, i, right);
copy(a, b, left, right);
}
}
4、假设有4个物品的0-1背包问题,它们的重量和价值如下表所示。
背包容量M=12,使用回溯法求解此0-1背包问题。
请画出状态空间搜索树,要求在空间树中各个结点旁标记出剩余容量cr,当前价值v,上界up等各个值。
若某个结
点不符合剪枝函数,做出相应标记。
物品ABCD重量4352价值3345
答案解析:
该问题的最优解为(1,1,0,1,1,1,0,0),背包效益为165。
即在背包中装入物品F、B、D、E时达到最大效益,为165,重量为140。
1.有如下活动其开始时间和结束时间如下表所示,使用贪心算法进行求解。
要求写出算法思想,贪心选择策略,以及解题过程。
i1234567891011
S[i]3 5 0 5 1 2 3 6 2 8 8 1
f[i]5 7 6 9 14 8 10 13 12 11 4
正确答案:
我的答案:
1、0-1背包问题的回溯算法所需的计算时间为()
A、O(n2n)
B、O(nlogn)
C、O(2n)
D、O(n)
正确答案:A我的答案:A
答案解析:
2、采用贪心算法的最优装载问题的主要计算量在于将集装箱依其重量从小到大排序,故算法的时间复杂度为()。
A、O(n2n)
B、O(nlogn)
C、O(2n)
D、O(n)
正确答案:B我的答案:B
答案解析:
3、一个问题可用动态规划算法或贪心算法求解的关键特征是问题的()。
A、重叠子问题
B、最优子结构性质
C、贪心选择性质
D、定义最优解
正确答案:B我的答案:B
答案解析:
4、()是贪心算法与动态规划算法的共同点。
(3.0分)
A、重叠子问题
B、构造最优解
C、贪心选择性质
D、最优子结构性质
正确答案:D我的答案:D
答案解析:
5、实现循环赛日程表利用的算法是()。
A、分治策略
B、动态规划法
C、贪心法
D、回溯法
正确答案:A我的答案:A
答案解析:
6、下列是动态规划算法基本要素的是()。
A、定义最优解
B、构造最优解
C、算出最优解
D、子问题重叠性质
正确答案:D我的答案:D
答案解析:
7、下列不是动态规划算法基本步骤的是()
A、找出最优解的性质
B、构造最优解
C、算出最优解
D、定义最优解
正确答案:A我的答案:A
答案解析:
8、下面是贪心算法的基本要素的是()。
(3.0分)
A、重叠子问题
B、构造最优解
C、贪心选择性质
D、定义最优解
正确答案:C我的答案:C
答案解析:
9、下面哪种函数是回溯法中为避免无效搜索采取的策略()(3.0分)
A、递归函数
B、剪枝函数
C、随机数函数
D、搜索函数
正确答案:B我的答案:B
答案解析:
10、合并排序算法是利用()实现的算法。
(3.0分)
A、分治策略
B、动态规划法
C、贪心法
D、回溯法
正确答案:A我的答案:A
答案解析:
11、实现合并排序利用的算法是()。
A、分治策略
B、动态规划法
C、贪心法
D、回溯法
正确答案:A我的答案:A
答案解析:
12、回溯法解旅行售货员问题时的解空间树是()
A、子集树
B、排列树
C、深度优先生成树
D、广度优先生成树
正确答案:B我的答案:B
答案解析:
13、广度优先是()的一搜索方式。
(3.0分)
A、分支界限法
B、动态规划法
C、贪心法
D、回溯法
正确答案:A我的答案:A
答案解析:
14、采用最大效益优先搜索方式的算法是()。
A、分支界限法
B、动态规划法
C、贪心法
D、回溯法
正确答案:A我的答案:A
答案解析:
15、衡量一个算法好坏的标准是()
A、运行速度快
B、占用空间少
C、时间复杂度低
D、代码短
正确答案:C我的答案:C
答案解析:
16、分支限界法解最大团问题时,活结点表的组织形式是()。
A、最小堆
B、最大堆
C、栈
D、数组
正确答案:B我的答案:B
答案解析:
17、备忘录方法是那种算法的变形。
()
A、分治法
B、动态规划法
C、贪心法
D、回溯法
正确答案:B我的答案:B
答案解析:
18、哈弗曼编码的贪心算法所需的计算时间为()。
A、O(n2n)
B、O(nlogn)
C、O(2n)
D、O(n)
正确答案:B我的答案:B
答案解析:
19、最大效益优先是()的一搜索方式
A、分支界限法
B、动态规划法
C、贪心法
D、回溯法
正确答案:A我的答案:A
答案解析:
20、以深度优先方式系统搜索问题解的算法称为()。
(3.0分)
A、分支界限算法
B、概率算法
C、贪心算法
D、回溯算法
正确答案:D我的答案:D
答案解析:
二、填空题(题数:5,共20.0分)
1、函数5n2+3n的渐进表达式为(),函数7log(6n)的渐进表达式为()(4.0分)
正确答案
第一空:O(n2)
第二空:O(n)
我的答案:
第一空:O(n)
第二空:O(n)
2、正整数4的划分共有()种。
(2.0分)
正确答案
第一空:
5
我的答案:
第一空:
5
3、分支限界法主要有()分支限界法和()分支限界法。
(4.0分)
正确答案
第一空:
队列式;队列式(FIFO);优先队列式
第二空:
优先队列式;队列式;队列式(FIFO)
我的答案:
第一空:
队列式
第二空:
优先队列式
4、贪心算法的基本要素是()性质和()性质。
(4.0分)
正确答案
第一空:
贪心选择;最优子结构
第二空:
最优子结构;贪心选择
我的答案:
第一空:
贪心选择
第二空:
最优子结构
5、解决0/1背包问题可以使用动态规划、回溯法和分支限界法,其中不需要排序的是(),需要排序的是(),()
(6.0分)
正确答案
第一空:
动态规划
第二空:
回溯法;分支限界法
第三空:
分支限界法;回溯法
我的答案:
第一空:
动态规划
第二空:
回溯法
第三空:
分支限界法
三、资料题(题数:1,共20.0分)
1、排列问题(注意:所有涉及到的标点符号要切换到英文状态下)Template<class Type>
void perm(Type list[],int k,int m)
{//产生[list[k:m]的所有排列
if()
{//只剩下一个元素
for(int i=0;i<=m;i++)cout<<list[i];
cout<<endl;
}
else//还有多个元素待排列,递归产生排列for()
{
swap(list[k],list[i]);
();
();
}
}
(20.0分)
正确答案
第一空:
k==m
第二空:
int i=k;i<=m;i++
第三空:
perm(list,k+1;m)
第四空:
swap(list[k],list[i]);
我的答案:
第一空:
k==m
第二空:
int i=k;i<=m;i++
第三空:
perm(list,k+1;m);
第四空:
swap(list[k],list[i]);。