复习题
一、选择题
1、衡量一个算法好坏的标准是( )。
(A)运行速度快 (B)占用空间少 (C)时间复杂度低 (D)代码短
23n?10n的渐进表达式是( )2、函数。
(A)O(3n) (B)O(3) (C)O(10n) (D)O(n) 3、以下不可以使用分治法求解的是( )。
(A)棋盘覆盖问题 (B)选择问题 (C)归并排序 (D) 0/1背包问题 4、二分搜索算法是利用( )实现的算法。
(A)分治策略 (B)动态规划法 (C)贪心法 (D)回溯法 5、二分搜索算法的时间复杂性为( )。
(A)O(n) (B)O(n) (C)O(logn) (D)O(nlogn) 6、快速排序算法的时间复杂性为( )。
(A)O(n) (B)O(n) (C)O(logn) (D)O(nlogn) 7、实现大整数的乘法是利用( )的算法。 (A)分治策略
(B)动态规划法
(C)贪心法 (D)回溯法
8、矩阵连乘问题的算法可由( )设计实现。
(A)分支界限算法 (B)动态规划算法 (C)贪心算法 (D)回溯算法 9、实现循环赛日程表利用的算法是( )。 (A)分治策略 (B)动态规划法 (C)贪心法 10、下列是动态规划算法基本要素的是( )。
(A)定义最优解 (B)构造最优解 (C)算出最优解 (D)子问题重叠性质 11、最长公共子序列算法利用的算法是( )。
(A)分治法 (B)动态规划法 (C)贪心法 (D)回溯法 12、下列算法中通常以自底向上的方式求解最优解的是( )。 (A)备忘录法 (B)动态规划法
(C)贪心法
(D)回溯法
13、以下不可以使用分治法求解的是( )。
(A)棋盘覆盖问题 (B)选择问题 (C)归并排序 (D)0/1背包问题 14、下列算法中不能解决0/1背包问题的是( )
(A)贪心法 (B)动态规划 (C)回溯法 (D)分支限界法 15、算法是由若干条指令组成的有穷序列,而且满足以下性质( ) (A)输入:有0个或多个输入 (B)输出:至少有一个输出
(C)确定性:指令清晰,无歧义 (D)有限性:指令执行次数有限,而且执行时间有限 A (1)(2)(3) B(1)(2)(4) C(1)(3)(4) D (1) (2)(3)(4) 16、函数32n+10nlogn的渐进表达式是( ). A. 2n B. 32n C. nlogn D. 10nlogn
17、能采用贪心算法求最优解的问题,一般具有的重要性质为:( )
(A)最优子结构性质与贪心选择性质 (B)重叠子问题性质与贪心选择性质 (C)最优子结构性质与重叠子问题性质 (D)预排序与递归调用
第 1 页 共 6 页
2222 (D)回溯法
复习题
18、回溯法在问题的解空间树中,按( )策略,从根结点出发搜索解空间树。 (A)广度优先 (B)活结点优先 (C)扩展结点优先 (D)深度优先 19、下面哪种函数是回溯法中为避免无效搜索采取的策略( ) (A)递归函数
(B)剪枝函数 (C)随机数函数 (D)搜索函数
(A)运行速度快 (B)占用空间少 (C)时间复杂度低 (D)代码短 20、备忘录方法是那种算法的变形( )。
21、下列算法中通常以深度优先方式系统搜索问题解的是( )。 (A)备忘录法
(B)动态规划法
(C)贪心法
(D)回溯法
22、回溯法解旅行售货员问题时的解空间树是( )。
(A)子集树 (B)排列树 (C)深度优先生成树 (D)广度优先生成树
23、Strassen矩阵乘法是利用( )实现的算法。
(A)分治策略 (B)动态规划法 (C)贪心法 (D)回溯法 24.采用广度优先策略搜索的算法是( )。
(A)分支界限法 (B)动态规划法 (C)贪心法 (D)回溯法 25、背包问题的贪心算法所需的计算时间为( )
(A) O(n2) (B)O(nlogn) (C)O(2) (D)O(n)
二、 填空题
1、程序是 算法 用某种程序设计语言的具体实现。
2、算法的“确定性”指的是组成算法的每条 指令 是清晰的,无歧义的。
3.算法是由若干条指令组成的有穷序列,且要满足输入、 输出、确定性和 有限性四条性质。 4、计算一个算法时间复杂度通常可以计算 循环次数 、基本操作的频率或计算步。 5.算法的复杂性有 时间 复杂性和 空间 复杂性之分。
6、从分治法的一般设计模式可以看出,用它设计出的程序一般是 递归算法 。 7.动态规划算法的两个基本要素是 最优子结构 和 重叠子问题 。
8、问题的 最优子结构性质 是该问题可用动态规划算法或贪心算法求解的关键特征。 9、 贪心选择性质 是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
10. 动态规划算法的基本思想是将待求解问题分解成若干 子问题 ,先求解 子问题 ,然后从这些 问题 得到原问题的解。
11.快速排序算法是基于 分治策略 的一种排序算法。 12.任何可用计算机求解的问题所需的时间都与其 规模 有关。 13.快速排序算法的性能取决于 划分的对称性 。
14.回溯法搜索解空间树时,常用的两种剪枝函数为 约束函数 和 限界函数 。 15、以深度优先方式系统搜索问题解的算法称为 回溯法 。
16、使用回溯法进行状态空间树裁剪分支时一般有两个标准:约束条件和目标函数的界,N皇后问题和0/1背包问题正好是两种不同的类型,其中同时使用约束条件和目标函数的界进
第 2 页 共 6 页
n
n
复习题
行裁剪的是 0/1背包问题 ,只使用约束条件进行裁剪的是 N皇后问题 。 三、算法填空
1、以下是计算xm的值的过程 int power ( x, m ) {//计算xm的值并返回。
y=( 1 );i=m; while(i- - >0) y=y*x; return y; }
2、给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x的二分搜索算法
template
int BinarySearch(Type a[], const Type& x, int l, int r) { while (l<=r ){ int m = ((l+r)/2); if (x == a[m]) return m;
if (x < a[m]) r = m-1; else l = m+1; }
return -1; } 3、速排序
template
void QuickSort (Type a[], int p, int r) { if (p int q=Partition(a,p,r); QuickSort (a,p,q-1); //对左半段排序 QuickSort (a,q+1,r); //对右半段排序 } } 4、快速排序中的划分函数Partition确定以基准元素a[p]对子数组a[p:r]进行划分 template void Partition(Type a[],int p, int r) { int i = p, j = r + 1; Type x=a[p]; while (true) { } a[ p ] = a[ j ] ; a[ j ] = x; return j; 第 3 页 共 6 页 while (a[++i] 复习题 } 5、合并排序描述如下: template void Mergesort(Type a[ ], int left, int right) { if (left int i=( left+right)/2; Mergesort(a, left, i ); //对左半段排序 Mergesort(a, i+1, right); //对右半段排序 Merge(a,b, left,i,right);//合并到数组b Copy(a,b, left,right ); //复制到数组a } } 6、函数Merge合并两个排好序的数组段到一个新的数组b中。 void Merge(Type c[],Type d[], int l, int m, int r) { int i=l, j=m+1, k=l; } 7、计算最长公共子序列的算法如下: void LCSLength (int m, int n, char *x,char *y,int c,int **b) { int i,j; for (i = 1; i <= m; i++) c[i][0]; for (i = 1; i <= n; i++) c[0][i]; for (i = 1; i <= m; i++) for (j = 1; j <= n; j++);{ if (x[i]==y[j]) { c[i][j]=c[i-1][j-1]+1; b[i][j]=1; } else if (c[i-1][j]>=c[i][j-1] ) { c[i][j]=c[i-1][j]; b[i][j]=2; } } } 8、列问题 Template void perm(Type list[], int k, int m ) { //产生[list[k:m]的所有排列 if(k==m) { //只剩下一个元素 for (int i=0;i<=m;i++) cout< 第 4 页 共 6 页 while (( i<=m )&& (j<=r)) if (c[i]<=c[j]) d[k++]=c[i++]; else d[k++]=c[j++]; if (i>m) for(int q=j; q<=r; q++) d[k++]=c[q]; else for(int q=i; q<=m; q++) d[k++]=c[q]; else { c[i][j]=c[i][j-1]; b[i][j]=3; } 复习题 else //还有多个元素待排列,递归产生排列 for (int i=k; i<=m; i++) { swap(list[k],list[i]); perm(list,k+1;m); swap(list[k],list[i]); } } 9、0-1背包问题 template void knapsack(Type v,int w,int c, int n,Type **m) { int jMax=min(w[n]-1,c); for( int j=0; j<=jMax; j++) m[n][j]=0; for( int j=w[n]; j<=c; j++) m[n][j]=v[n]; for( int i=n-1; i>1; i--) { jMax=min(w[i]-1,c); for( int j=0; j<=jMax; j++) m[i][j]=m[i+1][j]; for(int j=w[i]; j<=c; j++) m[i][j]=max(m[i+1][j], m[i+1][j-w[i]]+v[i]); } m[1][c]=m[2][c]; if (c>=w[1]) m[1][c]=max(m[2][c], m[2][c-w[1]]+v[1]); } 10、按上述算法knapsack计算后,m[1][c]给出所求的0-1背包问题的最优值。相应的最优解可由算法traceback计算 void traceback( int c, int n, int x[ ]) { for(int i=1; i { if (m[i][c]==m[i+1][c]) x[i]=0; } x[n]=(m[n][c])? 1:0; } 四、简答题 1、算法的渐进时间复杂性的含义? 答:当问题的规模n趋向无穷大时,影响算法效率的重要因素是T(n)的数量级,而其他因素仅是使时间复杂度相差常数倍,因此可以用T(n)的数量级(阶)评价算法。时间复杂度T(n)的数量级(阶)称为渐进时间复杂性。 2、为什么用分治法设计的算法一般有递归调用? 答:当子问题的规模还很大时,必须继续使用分治法,反复分治,必然要用到递归。 else { x[i]=1; c-=w[i]; } 第 5 页 共 6 页 复习题 3、 为什么要分析最坏情况下的算法时间复杂性? 答:最坏情况下的时间复杂性决定算法的优劣,并且最坏情况下的时间复杂性较平均时间复杂性更具有可操作性。 4、简述分治法的基本思想。 答:分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同;对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止;将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。 5、分治法所能解决的问题一般应具有哪些特征? 答:(1)该问题的规模缩小到一定的程度就可以容易地解决; (2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; (3)利用该问题分解出的子问题的解可以合并为该问题的解; (4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。 6、简述分治法的基本步骤。 答:分治法在每一层递归上都有三个步骤: (1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题; (2)解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题; (3)合并:将各个子问题的解合并为原问题的解。 7、快速排序的基本思想是什么? 答:快速排序的基本思想是在待排序的N个记录中任意取一个记录,把该记录放在最终位置后,数据序列被此记录分成两部分。所有关键字比该记录关键字小的放在前一部分,所有比它大的放置在后一部分,并把该记录排在这两部分的中间,这个过程称作一次快速排序。之后重复上述过程,直到每一部分内只有一个记录为止。 8、什么情况下考虑用动态规划法,动态规划的实质是什么? 答:在实际应用中,许多问题的阶段划分并不明显,这时如果刻意地划分阶段法反而麻烦。一般来说,只要该问题可以划分成规模更小的子问题,并且原问题的最优解中包含了子问题的最优解(即满足最优子化原理),则可以考虑用动态规划解决。 动态规划的实质是分治思想和解决冗余,因此,动态规划是一种将问题实例分解为更小的、相似的子问题,并存储子问题的解而避免计算重复的子问题,以解决最优化问题的算法策略。 9、请简述动态规划算法与分治法的异同。 答:相同的是:他们都是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 两者的不同点是:适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。而用分治法求解的问题,经分解得到的子问题往往是互相独立的。 10、回溯法的搜索特点是什么? 答:在解空间树上跳跃式地深度优先搜索,即用判定函数考察x[k]的取值,如果x[k]是合理的就搜索x[k]为根节点的子树,如果x[k]取完了所有的值,便回溯到x[k-1]。 第 6 页 共 6 页