算法复习试题

更新时间:2024-03-25 08:48:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

算法复习试题(仅供参考)2009

一、填空题(每空1分,共15分)

1、一个正确的算法应当具有五个特性:(有穷性)、(确定性)、( 能行性 )、 输入和输出。 2、算法的时间复杂性是算法运行所需要的( 计算机资源 )的量,这个量只依赖于 (求解问题的规模 )、(具体的输入数据)和( 算法本身的设计 )。

3、函数的渐进表达式为( T(N) ),函数错误!未找到引用源。的渐进表达式为( 3n 错误!未找到引用源。)。

4、快速排序和归并排序策略上是相同的,都是用的( 递归与分治 ) 算法。 5、对于问题Q,若满足( Q是NP困难的 )、( Q∈NP)则称Q为NP完全的。 6、要求出一个问题所有的可行解,一般要用( 回溯 )算法。

7、通常能用动态规划法求解的问题应具备(最优子结构)和(或者是重叠字问题)相似 )的性质。

二、选择题(每小题2分,共10分)

(D ) 1、 概率算法是一种非确定性地选择下一计算步骤的方法,( )算法主要目的

是消除算法所需计算时间对输入实例的依赖。 A.数值概率算法 B.蒙特卡罗算法 C.拉斯维加斯算法 D.舍伍得算法 ( B) 2、 ASCII码压缩方法经过两级压缩之后可以减少( )的存储空间。 A.62.5% B.56.25% C.50% D.65% ( A) 3、 P类问题与NP类问题的关系是( ) A.包含于 B.包含 C.属于 ( C ) 4、

D.等于

以下关于判定问题难易处理的叙述中正确的是( )。 A.可以由多项式时间算法求解的问题是难处理的 B.需要超过多项式时间算法求解的问题是易处理的 C.可以由多项式时间算法求解的问题是易处理的

D.需要超过多项式时间算法求解的问题是不能处理的

对于含有n个元素的排列树问题,最坏情况下计算时间复杂性为( )。 A.2

n+1

(C ) 5、

-1 B.

?n!/i! C.n!

i?1n

D.2n

(第 1 页 共 8 页)

三、计算题(每小题5分,共20分)

(注意:要求写出计算过程)

1、设某算法的时间复杂度为O(n3)。在某台计算机上实现并完成该算法的时间为t秒。现有另外一台计算机,其运行速度为第一台的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模多大的问题?

解:设在本台计算机上的速度为V,设在另一台计算机上的输入规模为X 由 计算时间都为t秒有 n3/.V=X3/64V 可以求得X=4n

2、按照渐近阶从低到高的顺序排列下列表达式:4n2,logn,3n,n!,n2/3 解:由低到高为: n2/3 log n 4n2 3n n! 3、求解递归方程?T(1)?1? 2?T(n)?2T(n/3)?n解:D(n)=n2 且a=2 D(3)=32=9 a

bool MC2(x){

if(MC(x)) return true; else return MC(x); }

解:蒙特卡罗算法的特点是只要有一次调用为真,结果就为真,所以该算法的正确率为:1-(1-p)N N为调用的次数

四、问答及求解题(每小题10分,共40分)

1、 什么是贪心选择性质?(2分)贪心算法与动态规划算法有什么共同点?(4分)又有什么区别?

(4分)

答:所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优解的选择,即贪心选择来达到。

共同点:都需要将问题划分为一个个子问题,然后通过解决这些子问题来解决最终问题。

区别:① 动态规划每步所作出的选择依赖于相关子问题的解,因而只有在解出相关子问题之后才能做出选择,而在贪心算法中,仅在当前状态下做出最好选择,所做的贪心选择可以依赖于以往所做过的选择,但决不依赖于将来所做的选择,也不依懒于子问题的解。②动态规划以自底向上的方式解各子问题,而贪心算法则以自顶向下的方式进行,以迭代的方式做出相继的选择,而且每一步之后将所求问题简化为规模更小的子问题。

(第 2 页 共 8 页)

2、设有n=2k个运动员要进行循环赛,现设计一个满足以下要求的比赛日程表:

①每个选手必须与其他n-1名选手比赛各一次;②每个选手一天至多只能赛一次; ③循环赛要在最短时间内完成。

(1)如果n=2k,循环赛最少需要进行( n-1 )天;(2分) 如果n≠2k,循环赛最少需要进行( n )天。(2分) (2)当n=23=8时,请画出循环赛日程表:(6分) 选手 第1天 1 2 3 4 5 6 7 8 2 1 4 3 6 5 8 7 第2天 第3天 第4天 第5天 第6天 第7天 3 4 1 2 7 8 5 6 4 3 2 1 8 7 6 5 5 6 7 8 1 2 3 4 6 5 8 7 2 1 4 3 7 8 5 6 3 4 1 2 8 7 6 5 4 3 2 1 3、在字符串匹配中,模式串为“acacdacb”,若采用KMP算法,①求NEXT值;(8分)②若某趟不匹配的情形如下所示,则指针i,j如何移动?(2分)

i

正文:…b c a c a c b a b a a b a a … 模式: a c a c d a c b j 解:① j 模式串 NEXT[j] 1 a 0 2 c 1 3 a 1 4 c 2 5 d 3 6 a 1 7 c 2 8 b 3 ②指针i不动,指针j退回到NEXT[ j]的位置,这里退回到3的位置,即模式向右移动3个位置 4、有字符串acbcbacbcacbc,若采用LZW算法压缩,得到的压缩码是什么?(2分)要求写出字典。(8分)

解:压缩码为:{1,3,2,5,4,6,8}字典如下:: 原字符串 压缩码 序号 a b c ac cb bc cba acb

(第 3 页 共 8 页)

a b c 1c 3b 2c 5a 4b 1 2 3 4 5 6 7 8 bca acbc 6a 8c 9 10

五、算法设计题(15分)

在8×8的国际象棋棋盘上,只摆5个皇后,每个皇后能控制它所在的行、列和通过它所在的正方形的两条对角线,要使这5个皇后能够控制棋盘上的每一个格子(控制的格子可以重复),但皇后之间不能互相攻击。下面是一种可能的摆法。请设计一个算法,求出所有可能的摆放。请用自然语言描述你的思路,再写伪代码。 O O O O O

解法一:满足题目要求的八皇后问题算法如下:(用的是书上的Las Vegas算法)

自然与描述如下:

对n后问题,Las Vegas算法是随机地产生一组王后放置的位置。若成功了,便找到了一个解;若失败了,就整个重来,再随机产生另外一组王后的位置。这样作,直至找到解

伪代码如下:

int queensLV(int rec[]){

int k,i=1,found=1; //第i个皇后放在第k列 while(i<=N && found){ found=0;

for(k=1;k<=N && !found; k++)

{ //准备在当前这一行放置皇后 rec[i]=k;

if(place(rec,i)) //判断该位置能否放置皇后 if(rand()%2==0) found=1;

//即便能放,也还要进行随机处理,只有50%的机会 }

if (found) i++; //放下一行 }

return found; //如果found==1,表示找到一种方案 }

(第 4 页 共 8 页)

解法二:回溯法(最好用这种方法) 自然语言描述:

? 在棋盘的第一行的任意位置安放第一只皇后。

? 紧接着,我们就来放第二行,第二行的安放就要受一些限制了,因为与第一行的

皇后在同一列或同一对角线的位置上是不能安放皇后的,接下来是第三行,……, ? 或许我们会遇到这种情况:在摆到某一行的时候,无论皇后摆放在什么位置,她

都会被其它行的皇后吃掉,这时就必须要回溯,将前面的皇后重新摆放,

伪代码如下:

用递归回溯法求N后问题??????????Try(s){s令列标记为准备放置后的行数列数不到nq就还有候选者候选者为j = 0;表示未成功1到n列。做挑选候选者的准备;j = 0; q = 0; 列数加1while (未成功且还有候选者) {(!q && j < n ) { 各后都安全,便可接受挑选下一个候选者j++;next;记下该行后的位置(列数)if (next(Safe(s, j)) {可接受) {n行后都放完就成功了不成功,删Record(s, j);记录next;去后在该行(s == n) {q = 1; output( );} if (满足成功条件) {成功并输出结果}的位置。else Try(s+1);if ((!q) Move-Off(s, j); }}}不成功) 删去next的记录; }}return 成功与否}q }计算机算法设计与分析292011-6-21 (注释可以不写)

数据结构说明:

? 数组rec[n]表示棋盘。若rec[i] = j,1≤i, j≤n,表示棋盘的第i行第j列上有皇后。

? 数组C[j] = 1表示第j列上无皇后,1≤j≤n。

? 数组D[k] = 1表示第k条下行(↘)对角线上无皇后。

数组U[k] = 1表示第k条上行(↗)对角线上无皇后。 ? Record(s, j) { k = s – j + n;

rec[s] = j; C[j] = 0; D[s + j – 1] = 0; U[k] = 0; }

? Move-Off(s, j) {k = s – j + n;

rec[s] = 0; C[j] = 1; D[s + j – 1] = 1; U[k] = 1; }

? Safe(s, j) {k = s – j + n;

if (C[j] && U[k] && D[s + j – 1]) return true else return false; }

(第 5 页 共 8 页)

一、填空题(每空1分,共15分)

1、算法是由若干条指令组成的( )序列,且满足( )、( )、输入和输出这四条性质。 2、一个算法的时空性能是指该算法的( )复杂性和( )复杂性,前者是算法包含的计算量,后者是算法需要的存储量。 3、函数3n3+10n的渐进表达式为(

),函数logn3的渐进表达式为(

)。

4、贪心法得到的解()(一定/不一定)是最优解,用回溯法得到的解( )(一定/不一定)是最优解。 5、通常能用动态规划法求解的问题应具备( )和( )的性质。 6、快速排序和归并排序策略上是相同的,都是用的( ) 算法。 7、计算机产生的随机数都是有周期的,所以被称为( )随机数。

8、计算模型RAM、RASP以及TM在计算能力上是( )的,在计算速度上是( )的。

二、判断题(每小题2分,共10分)

( ) ( ) ( ) ( ) ( )

1、 用贪心法求0-1背包可以获得最优解。

2、 n个矩阵连乘积的计算顺序问题同构于凸(n+1)边形的三角剖分问题。 3、 分支限界法一般是以深度优先的方式搜索解空间树。 4、 回溯法是最常用的解题方法,有“通用的解题法”之称。 5、 可以由多项式时间算法求解的问题是难处理的。

三、计算题(共20分)

(注意:要求写出计算过程)

1、 对于下面的各组函数

f(n)和g(n) ,确定

f(n)?O(g(n))或f(n)=?(g(n)),

或f(n)=?(g(n))并简述理由。 (每小题5分,共10分)

(1)

2、假设某算法在输入规模为n时的计算时间为T(n)?3?2。在某台计算机上实现并完成该算法的时间为t秒。现有另一台计算机,其运行速度为第一台的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题?(5分)

(第 6 页 共 8 页)

nf(n)?logn3,g(n)?4logn?10 (2)f(n)?3n,g(n)?5n

3、分析下列程序段所代表的算法的时间复杂性:(5分)

int f(int m, int n) {

if (m>=n) return 1;

else return f(m,n-1)+f(m+1,n);}

四、问答题(每题5分,共10分)

1、什么是概率算法?试说说舍伍德、拉斯维加斯、蒙特卡罗算法各自的特点。

2、什么是NP问题?什么是NP完全问题?二者有何关系?

五、求解题(每题10分,共30分)

(注意:要求给出求解过程) 边 耗费 边 耗费 1、设多级图G=(V,E),V={V1,V2,V3,V4,V5}, 4 (1,2) 4 (5,8) V1={1},V2={2,3,4},V3={5,6},V4={7,8,9}, 6 (1,3) 5 (5,9) V5={10}。其耗费如右表所示。请用动态规划法 2 (1,4) 3 (6,7) 求从顶点1到顶点10的最小耗费路径。 7 (2,5) 6 (6,8) 3 (2,6) 7 (6,9)

5 (3,5) 2 (7,10)

7 (3,6) 5 (8,10)

9 (4,5) 9 (9,10)

(5,7) 8

2、采用快速排序对序列E,X,A,M,P,L,F按照字母顺序排序,请写出每趟排序后的结果(10分)

(第 7 页 共 8 页)

3、有无向图如下所示,请用Prim算法求出它的最小生成树,要求写出求解过程。

b 4 5 2 10 e 5 6 7 10 3 d 3 8 g 9 f 4 7 9 h a c

六、算法设计题(15分)

(注意:请用自然语言描述你的思路,再写伪代码。)

1、 子集和问题:子集和问题的一个实例为。其中,S?{x1,x2,,xn} 是一个正整数的集

x?S1合,C是一个正整数。子集和问题判定是否存在S的一个子集S1,使得

?x?C 。

试设计一个解子集和问题的回溯法,要求说明所采用的算法思想(4分),并给出伪代码(8分),分析所给出的算法的时间复杂度(3分)。

(第 8 页 共 8 页)

本文来源:https://www.bwwdw.com/article/wt38.html

Top