5《算法设计与分析》试题库Word格式.docx
《5《算法设计与分析》试题库Word格式.docx》由会员分享,可在线阅读,更多相关《5《算法设计与分析》试题库Word格式.docx(70页珍藏版)》请在冰豆网上搜索。
A.广度优先B.活结点优先C.扩展结点优先D.深度优先
8.分支限界法在问题的解空间树中,按(A)策略,从根结点出发搜索解空间树。
A.广度优先B.活结点优先C.扩展结点优先D.深度优先
9.程序块(A)是回溯法中遍历排列树的算法框架程序。
voidbacktrack(intt)
{
if(t>
n)output(x);
else
for(inti=t;
i<
=n;
i++){
swap(x[t],x[i]);
if(legal(t))backtrack(t+1);
}
A.
for(inti=0;
=1;
x[t]=i;
}
B.
if(legal(t))backtrack(t-1);
C.
D.
10.回溯法的效率不依赖于以下哪一个因素?
(C)
A.产生x[k]的时间;
B.满足显约束的x[k]值的个数;
C.问题的解空间的形式;
D.计算上界函数bound的时间;
11.常见的两种分支限界法为(D)
A.广度优先分支限界法与深度优先分支限界法;
B.队列式(FIFO)分支限界法与堆栈式分支限界法;
C.排列树法与子集树法;
D.队列式(FIFO)分支限界法与优先队列式分支限界法;
12.k带图灵机的空间复杂性S(n)是指(B)
A.k带图灵机处理所有长度为n的输入时,在某条带上所使用过的最大方格数。
B.k带图灵机处理所有长度为n的输入时,在k条带上所使用过的方格数的总和。
C.k带图灵机处理所有长度为n的输入时,在k条带上所使用过的平均方格数。
D.k带图灵机处理所有长度为n的输入时,在某条带上所使用过的最小方格数。
13.NP类语言在图灵机下的定义为(D)
A.NP={L|L是一个能在非多项式时间内被一台NDTM所接受的语言};
B.NP={L|L是一个能在多项式时间内被一台NDTM所接受的语言};
C.NP={L|L是一个能在多项式时间内被一台DTM所接受的语言};
D.NP={L|L是一个能在多项式时间内被一台NDTM所接受的语言};
14.记号O的定义正确的是(A)。
A.O(g(n))={f(n)|存在正常数c和n0使得对所有n
n0有:
f(n)
cg(n)};
B.O(g(n))={f(n)|存在正常数c和n0使得对所有n
cg(n)
f(n)};
C.O(g(n))={f(n)|对于任何正常数c>
0,存在正数和n0>
0使得对所有n
0
f(n)<
cg(n)};
D.O(g(n))={f(n)|对于任何正常数c>
cg(n)<
15.记号
的定义正确的是(B)。
C.(g(n))={f(n)|对于任何正常数c>
D.(g(n))={f(n)|对于任何正常数c>
二、填空题
1.下面程序段的所需要的计算时间为(
)。
intMaxSum(intn,int*a,int&
besti,int&
bestj)
intsum=0;
for(inti=1;
i++){
intthissum=0;
for(intj=i;
j<
j++){
thissum+=a[j];
if(thissum>
sum){
sum=thissum;
besti=i;
bestj=j;
}
}
returnsum;
2.有11个待安排的活动,它们具有下表所示的开始时间与结束时间,如果以贪心算法求解这些活动的最优安排(即为活动安排问题:
在所给的活动集合中选出最大的相容活动子集合),得到的最大相容活动子集合为活动({1,4,8,11})。
3.所谓贪心选择性质是指(所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到)。
4.所谓最优子结构性质是指(问题的最优解包含了其子问题的最优解)。
5.回溯法是回溯法是指(具有限界函数的深度优先生成法)。
6.用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。
在任何时刻,算法只保存从根结点到当前扩展结点的路径。
如果解空间树中从根结点到叶结点的最长路径的长度为h(n),则回溯法所需的计算空间通常为(O(h(n)))。
7.回溯法的算法框架按照问题的解空间一般分为(子集树)算法框架与(排列树)算法框架。
8.用回溯法解0/1背包问题时,该问题的解空间结构为(子集树)结构。
9.用回溯法解批处理作业调度问题时,该问题的解空间结构为(排列树)结构。
10.用回溯法解0/1背包问题时,计算结点的上界的函数如下所示,请在空格中填入合适的内容:
TypepKnap<
Typew,Typep>
:
Bound(inti)
{//计算上界
Typewcleft=c-cw;
//剩余容量
Typepb=cp;
//结点的上界
//以物品单位重量价值递减序装入物品
while(i<
=n&
&
w[i]<
=cleft){
cleft-=w[i];
b+=p[i];
i++;
//装满背包
if(i<
=n)(b+=p[i]/w[i]*cleft);
returnb;
11.用回溯法解布线问题时,求最优解的主要程序段如下。
如果布线区域划分为
的方格阵列,扩展每个结点需O
(1)的时间,L为最短布线路径的长度,则算法共耗时(O(mn)),构造相应的最短距离需要(O(L))时间。
for(inti=0;
i<
NumOfNbrs;
i++){
nbr.row=here.row+offset[i].row;
nbr.col=here.col+offset[i].col;
if(grid[nbr.row][nbr.col]==0){
//该方格未标记
grid[nbr.row][nbr.col]
=grid[here.row][here.col]+1;
if((nbr.row==finish.row)&
(nbr.col==finish.col))break;
//完成布线
Q.Add(nbr);
12.用回溯法解图的m着色问题时,使用下面的函数OK检查当前扩展结点的每一个儿子所相应的颜色的可用性,则需耗时(渐进时间上限)(O(mn))。
BoolColor:
OK(intk)
{//
for(intj=1;
j++)
if((a[k][j]==1)&
(x[j]==x[k]))returnfalse;
returntrue;
13.旅行售货员问题的解空间树是(排列树)。
三、解答题
1.机器调度问题。
问题描述:
现在有n件任务和无限多台的机器,任务可以在机器上得到处理。
每件任务的开始时间为si,完成时间为fi,si<
fi。
[si,fi]为处理任务i的时间范围。
两个任务i,j重叠指两个任务的时间范围区间有重叠,而并非指i,j的起点或终点重合。
例如:
区间[1,4]与区间[2,4]重叠,而与[4,7]不重叠。
一个可行的任务分配是指在分配中没有两件重叠的任务分配给同一台机器。
因此,在可行的分配中每台机器在任何时刻最多只处理一个任务。
最优分配是指使用的机器最少的可行分配方案。
问题实例:
若任务占用的时间范围是{[1,4],[2,5],[4,5],[2,6],[4,7]},则按时完成所有任务最少需要几台机器?
(提示:
使用贪心算法)
画出工作在对应的机器上的分配情况。
2.已知非齐次递归方程:
,其中,b、c是常数,g(n)是n的某一个函数。
则f(n)的非递归表达式为:
。
现有Hanoi塔问题的递归方程为:
,求h(n)的非递归表达式。
解:
利用给出的关系式,此时有:
b=2,c=1,g(n)=1,从n递推到1,有:
3.单源最短路径的求解。
问题的描述:
给定带权有向图(如下图所示)G=(V,E),其中每条边的权是非负实数。
另外,还给定V中的一个顶点,称为源。
现在要计算从源到所有其它各顶点的最短路长度。
这里路的长度是指路上各边权之和。
这个问题通常称为单源最短路径问题。
解法:
现采用Dijkstra算法计算从源顶点1到其它顶点间最短路径。
请将此过程填入下表中。
4.请写出用回溯法解装载问题的函数。
装载问题:
有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且
装载问题要求确定是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。
如果有,找出一种装载方案。
voidbacktrack(inti)
{//搜索第i层结点
if(i>
n)//到达叶结点
更新最优解bestx,bestw;
return;
r-=w[i];
if(cw+w[i]<
=c){//搜索左子树
x[i]=1;
cw+=w[i];
backtrack(i+1);
cw-=w[i];
if(cw+r>
bestw){
x[i]=0;
//搜索右子树
r+=w[i];
5.用分支限界法解装载问题时,对算法进行了一些改进,下面的程序段给出了改进部分;
试说明斜线部分完成什么功能,以及这样做的原因,即采用这样的方式,算法在执行上有什么不同。
//检查左儿子结点
Typewt=Ew+w[i];
//左儿子结点的重量
if(wt<
=c){//可行结点
if(wt>
bestw)bestw=wt;
//加入活结点队列
n)Q.Add(wt);
//检查右儿子结点
if(Ew+r>
bestw&
n)
Q.Add(Ew);
//可能含最优解
Q.Delete(Ew);
//取下一扩展结点
解答:
斜线标识的部分完成的功能为:
提前更新bestw值;
这样做可以尽早的进行对右子树的剪枝。
具体为:
算法Maxloading初始时将bestw设置为0,直到搜索到第一个叶结点时才更新bestw。
因此在算法搜索到第一个叶子结点之前,总有bestw=0,r>
0故Ew+r>
bestw总是成立。
也就是说,此时右子树测试不起作用。
为了使上述右子树测试尽早生效,应提早更新bestw。
又知算法最终找到的最优值是所求问题的子集树中所有可行结点相应重量的最大值。
而结点所相应得重量仅在搜索进入左子树是增加,因此,可以在算法每一次进入左子树时更新bestw的值。
7.最长公共子序列问题:
给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。
由最长公共子序列问题的最优子结构性质建立子问题最优值的递归关系。
用c[i][j]记录序列Xi和Yj的最长公共子序列的长度。
其中,Xi={x1,x2,…,xi};
Yj={y1,y2,…,yj}。
当i=0或j=0时,空序列是Xi和Yj的最长公共子序列。
故此时C[i][j]=0。
其它情况下,由最优子结构性质可建立递归关系如下:
在程序中,b[i][j]记录C[i][j]的值是由哪一个子问题的解得到的。
(1)请填写程序中的空格,以使函数LCSLength完成计算最优值的功能。
voidLCSLength(intm,intn,char*x,char*y,int**c,int**b)
{
inti,j;
for(i=1;
=m;
i++)c[i][0]=0;
=n;
i++)c[0][i]=0;
i++)
for(j=1;
j<
j++){
if(x[i]==y[j]){
c[i][j]=c[i-1][j-1]+1;
b[i][j]=1;
elseif(c[i-1][j]>
=c[i][j-1]){
c[i][j]=c[i-1][j];
b[i][j]=2;
else{c[i][j]=c[i][j-1];
b[i][j]=3;
(2)函数LCS实现根据b的内容打印出Xi和Yj的最长公共子序列。
请填写程序中的空格,以使函数LCS完成构造最长公共子序列的功能(请将b[i][j]的取值与
(1)中您填写的取值对应,否则视为错误)。
voidLCS(inti,intj,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];
elseif(b[i][j]==2)LCS(i-1,j,x,b);
elseLCS(i,j-1,x,b);
8.对下面的递归算法,写出调用f(4)的执行结果。
voidf(intk)
{if(k>
0)
{printf("
%d\n"
k);
f(k-1);
《算法分析与设计》试题库
(二)
一、简要回答下列问题:
1.算法重要特性是什么?
2.算法分析的目的是什么?
3.算法的时间复杂性与问题的什么因素相关?
4.算法的渐进时间复杂性的含义?
5.最坏情况下的时间复杂性和平均时间复杂性有什么不同?
6.简述二分检索(折半查找)算法的基本过程。
7.背包问题的目标函数和贪心算法最优化量度相同吗?
8.采用回溯法求解的问题,其解如何表示?
有什么规定?
9.回溯法的搜索特点是什么?
10.n皇后问题回溯算法的判别函数place的基本流程是什么?
11.为什么用分治法设计的算法一般有递归调用?
12.为什么要分析最坏情况下的算法时间复杂性?
13.简述渐进时间复杂性上界的定义。
14.二分检索算法最多的比较次数?
15.快速排序算法最坏情况下需要多少次比较运算?
16.贪心算法的基本思想?
17.回溯法的解(x1,x2,……xn)的隐约束一般指什么?
18.阐述归并排序的分治思路。
19.快速排序的基本思想是什么。
20.什么是直接递归和间接递归?
消除递归一般要用到什么数据结构?
21.什么是哈密顿环问题?
22.用回溯法求解哈密顿环,如何定义判定函数?
23.请写出prim算法的基本思想。
参考答案:
1.确定性、可实现性、输入、输出、有穷性
2.分析算法占用计算机资源的情况,对算法做出比较和评价,设计出额更好的算法。
3.算法的时间复杂性与问题的规模相关,是问题大小n的函数。
4.当问题的规模n趋向无穷大时,影响算法效率的重要因素是T(n)的数量级,而其他因素仅是使时间复杂度相差常数倍,因此可以用T(n)的数量级(阶)评价算法。
时间复杂度T(n)的数量级(阶)称为渐进时间复杂性。
5.最坏情况下的时间复杂性和平均时间复杂性考察的是n固定时,不同输入实例下的算法所耗时间。
最坏情况下的时间复杂性取的输入实例中最大的时间复杂度:
W(n)=max{T(n,I)},I∈Dn
平均时间复杂性是所有输入实例的处理时间与各自概率的乘积和:
A(n)=∑P(I)T(n,I)I∈Dn
6.设输入是一个按非降次序排列的元素表A[i:
j]和x,选取A[(i+j)/2]与x比较,如果A[(i+j)/2]=x,则返回(i+j)/2,如果A[(i+j)/2]<
x,则A[i:
(i+j)/2-1]找x,否则在A[(i+j)/2+1:
j]找x。
上述过程被反复递归调用。
回溯法的搜索特点是什么
7.不相同。
目标函数:
获得最大利润。
最优量度:
最大利润/重量比。
8.问题的解可以表示为n元组:
(x1,x2,……xn),xi∈Si,Si为有穷集合,xi∈Si,(x1,x2,……xn)具备完备性,即(x1,x2,……xn)是合理的,则(x1,x2,……xi)(i<
n)一定合理。
9.在解空间树上跳跃式地深度优先搜索,即用判定函数考察x[k]的取值,如果x[k]是合理的就搜索x[k]为根节点的子树,如果x[k]取完了所有的值,便回溯到x[k-1]。
10.将第K行的皇后分别与前k-1行的皇后比较,看是否与它们相容,如果不相容就返回false,测试完毕则返回true。
11.子问题的规模还很大时,必须继续使用分治法,反复分治,必然要用到递归。
12最坏情况下的时间复杂性决定算法的优劣,并且最坏情况下的时间复杂性较平均时间复杂性游可操作性。
13.T(n)是某算法的时间复杂性函数,f(n)是一简单函数,存在正整数No和C,n〉No,有T(n)<
f(n),这种关系记作T(n)=O(f(n))。
14.二分检索算法的最多的比较次数为logn。
15..最坏情况下快速排序退化成冒泡排序,需要比较n2次。
16.是一种依据最优化量度依次选择输入的分级处理方法。
基本思路是:
首先根据题意,选取一种量度标准;
然后按这种量度标准对这n个输入排序,依次选择输入量加入部分解中。
如果当前这个输入量的加入,不满足约束条件,则不把此输入加到这部分解中。
17.回溯法的解(x1,x2,……xn)的隐约束一般指个元素之间应满足的某种关系。
18.讲数组一分为二,分别对每个集合单独排序,然后将已排序的两个序列归并成一个含n个元素的分好类的序列。
如果分割后子问题还很大,则继续分治,直到一个元素。
19.快速排序的基本思想是在待排序的N个记录中任意取一个记录,把该记录放在最终位置后,数据序列被此记录分成两部分。
所有关键字比该记录关键字小的放在前一部分,所有比它大的放置在后一部分,并把该记录排在这两部分的中间,这个过程称作一次快速排序。
之后重复上述过程,直到每一部分内只有一个记录为止。
20.在定义一个过程或者函数的时候又出现了调用本过程或者函数的成分,既调用它自己本身,这称为直接递归。
如果过程或者函数P调用过程或者函数Q,Q又调用P,这个称为间接递归。
消除递归一般要用到栈这种数据结构。
21.哈密顿环是指一条沿着图G的N条边环行的路径,它的访问每个节点一次并且返回它的开始位置。
22.当前选择的节点X[k]是从未到过的节点,即X[k]≠X[i](i=1,2,…,k-1),且C(X[k-1],X[k])≠∞,如果k=-1,则C(X[k],X[1])≠∞。
23.思路是:
最初生成树T为空,依次向内加入与树有最小邻接边的n-1条边。
处理过程:
首先加入最小代价的一条边到T,根据各节点到T的邻接边排序,选择最小边加入,新边加入后,修改由于新边所改变的邻接边排序,再选择下一条边加入,直至加入n-1条边。
二、复杂性分析
1、MERGESORT(low,high)
iflow<
high;
thenmid←(low,high)/2;
MERGESORT(low,mid);
MERGESORT(mid+1,high);
MERGE(low,mid,high);
endif
endMERGESORT