硷蚊溺搓休娃杀玩侯库绣录电
第一章 算法概论 第一章 单元测试
1、 下面列出了算法的四个性质,哪个性质是程序不一定具备的?
答案: 有穷性
2、 在算法设计与分析过程中,有算法设计,算法的正确性证明,算法的复杂性分析,程序设计等几个重要步骤,下面哪种顺序是正确的?
答案: 算法设计->算法的正确性证明->算法的复杂性分析->程序设计
3、 下面哪些内容不是算法设计之前要完成的内容?
答案: 使用何种计算机语言设计程序
4、 下面是快速幂算法求的代码,这里n≥0, a是实数。对该算法的时间复杂性描述不准确的是哪个?doule exp2(double a, int n){int i;double b, s=1.0;i=n;b=a;while(i>0){ if(i%2) s=b;i/=2; b=b;}return s;}
答案:
5、 下面那个算法在最坏情况下的时间复杂性最低
答案: 归并排序
6、 有时间复杂性,时间复杂性从低到高的顺序是?
答案:
7、 有一个算法, 它的时间复杂性T(n)的递归定义如下, 问T(n)是?
答案:
8、 有一个算法, 它的时间复杂性T(n)的递归定义如下, 问T(n)是?
答案:
9、 有一个算法, 它的时间复杂性T(n)的递归定义如下, 问T(n)是?
答案:
10、 有一个算法, 它的时间复杂性T(n)的递归定义如下, 问T(n)是?
答案:
11、 解决同一个问题的算法策略可能有多个,无论使用那种算法策略,算法时间复杂性是相同的。
答案: 错误
12、 描述算法只能使用二种方法:伪代码或自然语言
答案: 错误
13、 下面哪个算法在最坏情况下的时间复杂性最低
答案: 归并排序
14、 A公司处理器速度是B公司的100倍。对于复杂性为O()的算法,B公司的计算机可以在1小时内处理规模为n的问题,A公司的计算机在1小时内能处理的问题规模是多少?
答案: 10n
15、 关于算法的正确性,下面哪些说法是正确的?
答案: 若算法是正确的, 则算法一定能结束(运行时间是有限的);
若算法是正确的,则对于问题的任何实例,算法都能得到正确的结果。;
对于问题的一个实例, 如果算法不能获得正确的结果, 就证明算法是不正确的。
16、 解决同一个问题的算法策略可能有多个,使用不同算法策略设计的算法,其算法时间复杂性可能有显著差异。
答案: 正确
17、 学习主定理和递归树等求解递归方程方法,主要目的是解决求递归算法的时间复杂性问题
答案: 正确
18、 自然语言、伪代码都可以描述算法,而流程图不能描述算法
答案: 错误
第二章 分治法 第二章 单元测试
1、 分治法解决问题分为三步走,即分、治、合。下面列出了几种操作, 请按分、治、合顺序选择正确的表述。(1)将各个子问题的解合并为大问题的解,(2)将问题分解为子问题,(3)将各个子问题合并为大问题。(4)求各个子问题的解,(5)将问题分解为可重复的子问题。
答案: (2)(4)(1)
2、 分治法的时间复杂性分析,通常是通过分析得到一个关于时间复杂性T(n)的一个递归方程, 然后解此方程可得T(n)的结果。T(n)的递归定义如下:关于该定义中k,n/m, f(n)的解释准确的是
答案: k是子问题个数,n/m是子问题的规模,f(n)是分解为子问题的时间复杂性与合并子问题的解的时间复杂性之和
3、 已知斐波那契数列中第n个斐波那契数F(n)=F(n-1)+F(n-2),问能不能使用分治策略求第n个斐波那契数,从下面选项中选取答案。
答案: 不能,因为它不满足分治法的第四个适应条件(子问题是相互独立的,也就是没有重复子问题)
4、 快速幂算法求, 其时间复杂性为O(logn),a是实数,n为非负整数。下面是一同学用c语言编写的求的代码double exp2(double a,int n){ if(a==0) return 0; if (n==0) return 1; else { if(n%2) return a exp2(a,n/2) exp2(a,n/2); else return exp2(a,n/2)* exp2(a,n/2); } }对该同学的算法评价正确的是?
答案: 运行结果正确,时间复杂性为O(n)
5、 快速排序和归并排序是常用的排序算法,也都是采用分治法解决的问题。快速排序的时间复杂性为O(), 而归并排序的时间复杂性为O(nlogn), 究其原因,下面的解释你认为哪个正确?
答案: 因为归并排序把问题划分为两个子问题时其规模大致相等,是原来规模的n/2,而快速排序划分为子问题是使用partition()函数,划分为子问题时不能保证二个子问题的规模大致相同,在极端状况下,每次都只划分为1个子问题,其规模为原问题规模n-1,因此快速排序在极端状况下的时间复杂性的递归定义为T(n)=T(n-1)+O(n)
6、 猜数游戏:随机选择一个0~100内的整数,让你猜。 猜对了,你赢了,游戏结束。如果没有猜对,会告诉你猜大了,还是猜小了。当然,越早猜对越好。 问你最多猜多少次就能保证一定能猜对?
答案: 7
7、 对于一个采用字符数组存放的长度为n的字符串str,下面是用分治策略的递归算法去判断字符串str是否为回文。比如:“abcba”、“abba”是回文,“abc”则不是回文。bool isPal( char *str, int n){ if ( n == 0 || (1) ) return true; if ( str[0] != (2) ) return false; return isPal( (3) , (4) );}算法中处缺少语句,请分析算法,从如下选项中选择语句补齐算法。
答案: (1) n==1 (2) str[n-1] (3) str+1 (4) n-2
8、 对于一个采用字符数组存放的长度为n的字符串str,下面是判断是否回文的不完整算法。比如:“abcba”、“abba”是回文,“abc”则不是回文bool isPal( char *str, int n){ if ( n == 0 || (1) ) return true; if ( str[0] != (2) ) return false; return isPal( (3) , (4) );}请补齐代码后分析算法的时间复杂性,回答如下问题
答案: 该算法时间复杂性的递归定义为: T(n)=T(n-2)+1,if n>1;T(n)=O(1), if n≤1。T(n)=O(n), T(n)=Ω(1)
9、 棋盘nxn()的覆盖问题,其中一个点已经被覆盖,用L型模块将其余完全覆盖的分治算法。关于该算法时间复杂性描述不正确的是
答案: T(n)=O(n^4)
10、 棋盘8X8的覆盖问题,其中一个点已经被覆盖,用L型模块将其余完全覆盖的分治策略。约定解决四个子问题的顺序为右下,左下, 左上,右上。用数字标识法填写覆盖方案(如3个相连的整数值i构成的L块,代表是第i个被放入棋盘中的L型块)。 使用分治策略的算法有三种形式 :1使用递归算法实现, 2使用队列存取分解出的子棋盘的非递归算法 3.使用栈存取分解出的子棋盘的非递归算法。下图中有三个覆盖图案(只标出了前7块L型模块位置),问自左至右分别是哪种算法实现的覆盖方案?
答案: 递归算法,队列算法, 栈算法
11、 下面哪些不是递归算法的特点
答案: 递归算法耗费的时间和占用的内存空间要比解决同一问题的非递归算法要少
12、 分治法解决问题时,平衡子问题思想是指:划分出的子问题规模基本一致,算法效率高
答案: 正确
13、 快速排序和归并排序是常用的排序算法,也都是采用分治法解决的问题。快速排序的时间复杂性为O(), 而归并排序的时间复杂性为O(nlogn), 究其原因,下面的解释你认为哪个正确?
答案: 因为归并排序把问题划分为两个子问题时其规模大致相等,是原来规模的n/2,而快速排序划分为子问题是使用partition()函数,划分为子问题时不能保证二个子问题的规模大致相同,在极端状况下,每次都只划分为1个子问题,其规模为原问题规模n-1,因此快速排序在极端状况下的时间复杂性的递归定义为T(n)=T(n-1)+O(n)
14、 分治法解决问题分为三步走,即分、治、合。下面列出了几种操作, 请按分、治、合顺序选择正确的表述。(1)将各个子问题的解合并为原问题的解,(2)将问题分解为各自独立的多个子问题,(3)将多个子问题合并为原问题。(4)求各个子问题的解,(5)将问题分解为可重复的多个子问题。
答案: (2)(4)(1)
15、 分治法的时间复杂性分析,通常是通过分析得到一个关于时间复杂性T(n)的一个递归方程, 然后解此方程可得T(n)的结果。T(n)的递归定义如下:关于该定义中k,n/m, f(n)的解释准确的是
答案: k是子问题个数,n/m是子问题的规模,f(n)是分解为子问题的时间复杂性与合并子问题的解的时间复杂性之和
16、 快速排序和归并排序是常用的排序算法,也都是采用分治法解决的问题。快速排序的时间复杂性为O(), 而归并排序的时间复杂性为O(nlogn), 究其原因,下面的解释你认为哪个正确?
答案: 因为归并排序把问题划分为两个子问题时其规模大致相等,是原来规模的n/2,而快速排序划分为子问题是使用partition()函数,划分为子问题时不能保证二个子问题的规模大致相同,在极端状况下,每次都只划分为1个子问题,其规模为原问题规模n-1,因此快速排序在极端状况下的时间复杂性的递归定义为T(n)=T(n-1)+O(n)
17、 猜数游戏:随机选择一个0~100内的整数,让你猜。 猜对了,你赢了,游戏结束。如果没有猜对,会告诉你猜大了,还是猜小了。当然,越早猜对越好。 问最少需要猜多少次,就能保证一定能猜对?
答案: 7
18、 对于一个采用字符数组存放的长度为n的字符串str,下面是用分治策略的递归算法去判断字符串str是否为回文,如是回文,函数返回true,否则返回false。比如:“abcba”、“abba”是回文,“abc”则不是回文。bool isPal( char *str, int n){ if ( n == 0 || (1) ) return true; if ( str[0] != (2) ) return false; return isPal( (3) , (4) );}算法中处缺少语句,请分析算法,从如下选项中选择语句补齐算法。
答案: (1) n==1 (2) str[n-1] (3) str+1 (4) n-2
19、 给定n个正整数组成的无序序列, 要找到该序列的中位数,解决该问题的最优算法的时间复杂性是?
答案: O(n)
20、 将一个递归算法改造为非递归算法, 常用的数据结构是?
答案: 栈
21、 分治法解决问题时,平衡子问题思想是指:当问题划分出的子问题规模基本一致时,算法计算效率高
答案: 正确
22、 递归程序代码简短,结构清晰,易读性强,相比解决同一问题的非递归程序,递归程序运行时间短。
答案: 错误
第三章 动态规划 第三单元测试
1、 求第n个斐波那契数的问题,根据动态规划的二要素分析,是可以用动态规划算法去解决的,下面是用备忘录方法(递归)解决的求第n个斐波那契数f[n]的程序. int f[N]={0,1,1};int fib(int n){ if ( 1 ) return f[n]; else return 2 ; }代码中1 和2位置代码缺失, 请从下列选项中选出合适的语句补齐算法。
答案: 1f[n]>0 2 f[n]=fib(n-1)+fib(n-2)
2、 动态规划解题的步骤分为四步(1)分析最优解的结构 (2)建立递归关系(3)计算最优值(4)构造最优解。关于这四个步骤的内容描述不正确的是哪个?
答案: 计算最优值:以自顶往下的方法计算问题的最优值,也就是先求解规模较大的问题的最优值。
3、 矩阵连乘问题:下图是动态规划算法计算6个矩阵A1A2A3A4A5A6连乘所生成的信息表.(a)表描述了计算顺序, (b)表是m[i][j]的最优值表,(c)表是辅助信息表(断开位置)。 分析表格,给出A2A3A4A5A6 五个矩阵连乘所需要的最少数乘次数,并用加括号的方法表示出其乘法顺序。从如下选项中选择。
答案: 10500, (A2A3)((A4A5)A6)
4、 凸多边形的三角剖分问题。用动态规划算法求解最优三角剖分,首先要分析最优解的结构,也就是将问题分解为子问题,并具有最优子结构性质。下图是一凸6边形(ABCDEF)的二种不同划分为子问题的方法,哪种是正确的将问题划分为子问题的方案?正确的划分方案共有几种不同方式?
答案: 左图正确,4种
5、 游艇租赁问题:长江游艇俱乐部在长江上设置了n个游艇出租站1~n,游客可在这些游艇出租站租用游艇, 并在下游的任何出租站归还游艇,限制只能从上游往下游行进,游艇出租站i到出租站j直达的租金为r(i,j)(1<=i<j<=n),计算从游艇出租站1到出租站n的最小费用。该问题可有二种最优解的结构形式,如图所示:如下描述中错误的是哪个?
答案: 图2是将从1站到i站的最小费用问题划分为2个子问题即从第1站到第k站的最小费用问题和从k站到i站的最小费用问题。
6、 0-1背包问题:现有一背包容量c=5, n=4。 4个物品分别为:(Wi,Vi)| (1,3), (3,6), (4,9), (2,7)。如下m表中m[i][j]是前i个物品装背包容量为j时的最优值。其中第四行的数据没有填写,分析问题, 将第四行的数据从如下选项中找出。
答案: 0 3 7 10 10 13
7、 最长公共子序列问题:现有两个字符序列X和Y, 下面c矩阵和b矩阵是算法填写出的信息表。 c[i][j]是X序列的前i个字符和Y序列的前j个字符的最长公共子序列的长度,b[i][j]是辅助信息表。已知X=”ABC”根据表格内容,回答X和Y的最长公共子序列长度及最长公共子序列包含的符号
答案: 长度2 “AC”
8、 下面是求最长公共子序列长度和构造最优解的算法。中的语句缺失, 请从如下选项中找到正确的答案补齐算法。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] = 0; for (j = 1; j <= n; i++) c[0][j] = 0; 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]) { 1; b[i][j]=2; } else { 2; b[i][j]=3; } }} void LCS(int i, int j, char x, int *b){ if (i ==0 || j==0) return; if (b[i][j]== 1) { LCS(i-1,j-1,x,b); cout<<x[i]; } else if (b[i][j]== 2) 3; else 4;}
答案: (1)c[i][j]=c[i-1][j] (2)c[i][j]=c[i][j-1] (3)LCS(i-1,j,x,b) (4)LCS(i,j-1,x,b)
9、 可用动态规划算法解决的问题需要满足几个基本要素,从下面选项中找出这些基本要素
答案: 最优子结构性质;
重复子问题
10、 0-1背包问题:给定n种物品和一背包,物品i的重量wi,价值vi,背包容量为c,如何选择装入背包中的物品,使得装入背包中的物品总价值最大。设m[i][j]是前i个物品装入背包容量为j的背包所能获得的最大价值,下面是关于最优值的递归定义,从中选出正确的关于最优值m[i][j]的递归定义。
答案: ;
11、 求第n个斐波那契数的问题,根据动态规划的二要素分析,是可以用动态规划算法去解决的,下面是用备忘录方法(递归)解决的求第n个斐波那契数f[n]的程序.这里N是一个较大的正整数常量,注意备忘录方法的设计要点(也就是,对于一个问题, 首先判断是否该问题已被解决过,如果解决,不再重复。另外,解决过的问题,答案要记住) int f[N]={0,1,1};int fib(int n){ if ( 1 ) return f[n]; else return 2 ; }代码中1 和2位置代码缺失, 请从下列选项中选出合适的语句补齐算法。
答案: 1f[n]>0 2 f[n]=fib(n-1)+fib(n-2)
12、 操场上摆放一行共n堆石头,从左到右方向编号为1~n,石子的数目分别为p[1],……,p[n],现要将石子有次序的合并为一堆,规定每次只能选相邻的2堆合并为新的一堆,将新的一堆石子数记为该次合并的得分,经过n-1次合并,最终合并为一堆。计算这n堆石子合并为一堆的最小得分。分析该问题,从如下选项中找出用动态规划解决该问题的时间复杂性和空间复杂性
答案: T(n)=O() S(n)=O( )
13、 操场上摆放一行共n堆石头,从左到右方向编号为1~n,石子的数目分别为p[1],……,p[n],现要将石子有次序的合并为一堆,规定每次只能选相邻的2堆合并为新的一堆,将新的一堆石子数记为该次合并的得分,经过n-1次合并,最终合并为一堆。计算这n堆石子合并为一堆的最小得分。请根据题目要求,从如下选项中找出关于从第i堆到第j堆合并为一堆的最小得分m[i][j]的递归定义.
答案: m[i][j]=0, if (i==j);
if(i<j) m[i][j]=min(m[i][k]+m[k+1][j])+sum(i,j) 这里i<= k<j, sum(i,j)是i堆到j堆石子的累加和。
14、 操场上摆放一行共4堆石头,从左到右方向编号为1~4,各堆石子的数目分别为7,10,3,5,现要将石子有次序的合并为一堆,规定每次只能选相邻的2堆合并为新的一堆,将新的一堆石子数记为该次合并的得分,经过5次合并,最终合并为一堆。计算这6堆石子合并为一堆的最小得分
答案: 50
15、 现有一楼梯共8级台阶,有一小朋友一步可以迈出1、2或3级台阶, 问小朋友有多少种不同的爬楼梯的方法
答案: 81
16、 凸多边形的三角剖分问题。用动态规划算法求解最优三角剖分,首先要分析最优解的结构,也就是将问题分解为子问题,并具有最优子结构性质。下图是一凸6边形(ABCDEF)的二种不同划分为子问题的方法,哪种是正确的将问题划分为子问题的方案?正确的划分方案共有几种不同方式?
答案: 左图正确,14种
第四章 贪心算法 第四单元测试
1、 一个问题, 针对某个贪心策略,可通过找反例的方法快速判断出其使用贪心算法不能构造出最优解。下面是关于0-1背包问题,贪心策略是优先选择单位重量价值大的物品装入背包,有二个同学分别找到一个反例,证明贪心算法不能构造出0-1背包问题的最优解。(1) 背包容量4,三个物品的重量和价值(wi,vi):(2,4),(2,3),(2,2) (2) 背包容量5,三个物品的重量和价值(wi,vi):(1,2),(2,3),(4,4)分析判定哪个反例是对的, 哪个反例是错的,从如下选项中找到你的答案。
答案: (1) 错(2) 对
2、 一个n位的10进制正整数,使得删除k位(k<n)后剩余数字组成的正整数最小,用贪心算法实现该算法, 问该问题的贪心策略是什么?也就是每次要删除哪个数字?
答案: 每次从整数中找包含最高位的从左至右的一个最长的非递减序列,将该序列的最后一位删除
3、 某中学有一个开水房,只有一个供热水龙头, 课间时,会有很多同学去排队打开水,同学们的水瓶大小不一,每个同学打水时都会将自己的水瓶装满。管理开水房的师傅是个聪明人,他想到了一个排队方案, 也就是同学们按照他给出的排队方法, 可以使同学们的平均等待时间最短。你分析一下,给出这个排队的方法,假定有n个人,第i个同学打水所需要的时间为ti,并给出平均等待时间的计算公式。(注意:第i个同学的等待时间包含前i-1个的打水时间和+自己打水的时间ti)
答案: 按照打水时间从小到大排队,假定排队后第i个人的打水时间是ti, 平均等待时间 T=∑(n-i+1)ti/n 1<=i<=n
4、 哈夫曼编码树是用贪心算法解决的典型问题, 分析该算法,回答如下问题, 假定有n个字符生成的编码树, 问编码树中的结点总数是多少?可能的最长的字符编码是多少位?
答案: 2n-1 个结点 n-1位编码
5、 下图中A~F顶点分别代表6个村庄,图中的边代表村庄之间的距离, 为了满足这六个村庄相互通信的需要(任意两个村庄有线路可达),需要架设通信线路,这里要求代价最小化(即线路总长度最小),请你分析问题找到代价最小的方案, 并计算出线路总长度,从如下选项中找出答案。
答案: 线路总长度21
6、 一个问题,确定了某个贪心策略, 如果用贪心算法能够构造出问题的最优解, 需要该问题具备哪两个条件?
答案: 最优子结构性质;
贪心选择性质
7、 一个问题,可能有多个最优解, 但是使用贪心算法最多只能找到一个最优解。
答案: 正确
8、 教材例题:多机调度问题,是用贪心算法求最优解的一个例子,贪心策略是每次从剩余任务中选择一个花费时间最长的任务,安排在占用时间最少的机器上。
答案: 错误
上方为免费预览版答案,如需购买完整答案,请点击下方红字
点关注,不迷路,微信扫一扫下方二维码
关注我们的公众号:阿布查查 随时查看答案,网课轻松过
为了方便下次阅读,建议在浏览器添加书签收藏本网页
电脑浏览器添加/查看书签方法
1.按键盘的ctrl键+D键,收藏本页面
2.下次如何查看收藏的网页?
点击浏览器右上角-【工具】或者【收藏夹】查看收藏的网页
手机浏览器添加/查看书签方法
一、百度APP添加/查看书签方法
1.点击底部五角星收藏本网页
2.下次如何查看收藏的网页?
点击右上角【┇】-再点击【收藏中心】查看
二、其他手机浏览器添加/查看书签方法
1.点击【设置】-【添加书签】收藏本网页
2.下次如何查看收藏的网页?
点击【设置】-【书签/历史】查看收藏的网页
滴壬懒诞岭念氰惯蒂道记汉颈