《算法分析与设计》期末考试复习题纲完整.docx
《《算法分析与设计》期末考试复习题纲完整.docx》由会员分享,可在线阅读,更多相关《《算法分析与设计》期末考试复习题纲完整.docx(16页珍藏版)》请在冰豆网上搜索。
《算法分析与设计》期末考试复习题纲完整
《算法分析与设计》期末复习题
一、选择题
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^x
A.n+8B.n+6
C.n+7D.n+5
4.设问题规模为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(N2logN)
5.直接或间接调用自身的算法称为(B)。
A.贪心算法B.递归算法
C.迭代算法D.回溯法
6.Fibonacci数列中,第4个和第11个数分别是(D)。
A.5,89B.3,89
C.5,144D.3,144
7.在有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.备忘录法B.动态规划法
C.贪心法D.回溯法
11.下列算法中不能解决0/1背包问题的是(A)。
A.贪心法B.动态规划
C.回溯法D.分支限界法
12.下列哪个问题可以用贪心算法求解(D)。
A.LCS问题B.批处理作业问题
C.0-1背包问题D.哈夫曼编码问题
13.用回溯法求解最优装载问题时,若待选物品为m种,则该问题的解空间树的结点个数为()。
A.m!
B.2m+1
C.2m+1-1D.2m
14.二分搜索算法是利用(?
A?
?
)实现的算法。
A.分治策略?
?
B.动态规划法?
?
C.贪心法?
?
?
D.回溯法
15.下列不是动态规划算法基本步骤的是(?
B?
?
)。
P44
A.找出最优解的性质?
B.构造最优解?
C.算出最优解(应该是最优值)?
D.定义最优解
16.下面问题(B)不能使用贪心法解决。
A.单源最短路径问题B.N皇后问题
C.最小花费生成树问题D.背包问题
17.使用二分搜索算法在n个有序元素表中搜索一个特定元素,在最好情况和最坏情况下搜索的时间复杂性分别为(A)。
P17
A.O
(1),O(logn)B.O(n),O(logn)
C.O
(1),O(nlogn)D.O(n),O(nlogn)
18.优先队列式分支限界法选取扩展结点的原则是(?
C?
?
)。
P162
A.先进先出B.后进先出
C.结点的优先级D.随机
19.下面不是分支界限法搜索方式的是(D)。
P161
A.广度优先B.最小耗费优先
C.最大效益优先D.深度优先
20.分支限界法解最大团问题时,活结点表的组织形式是(B)。
A.最小堆B.最大堆
C.栈D.数组
21.下列关于计算机算法的描述不正确的是(C)。
P1
A.算法是指解决问题的一种方法或一个过程
B.算法是若干指令的有穷序列
C.算法必须要有输入和输出
D.算法是编程的思想
22.下列关于凸多边形最优三角剖分问题描述不正确的是(A)。
A.n+1个矩阵连乘的完全加括号和n个点的凸多边形的三角剖分对应
B.在有n个顶点的凸多边形的三角剖分中,恰有n-3条弦
C.该问题可以用动态规划法来求解
D.在有n个顶点的凸多边形的三角剖分中,恰有n-2个三角形
23.动态规划法求解问题的基本步骤不包括(C)。
P44
A.递归地定义最优值
B.分析最优解的性质,并刻画其结构特征
C.根据计算最优值时得到的信息,构造最优解(可以省去的)
D.以自底向上的方式计算出最优值
24.分治法所能解决的问题应具有的关键特征是(C)。
P16
A.该问题的规模缩小到一定的程度就可以容易地解决
B.该问题可以分解为若干个规模较小的相同问题
C.利用该问题分解出的子问题的解可以合并为该问题的解
D.该问题所分解出的各个子问题是相互独立的
25.下列关于回溯法的描述不正确的是(D)。
P114
A.回溯法也称为试探法
B.回溯法有“通用解题法”之称
C.回溯法是一种能避免不必要搜索的穷举式搜索法
D.用回溯法对解空间作深度优先搜索时只能用递归方法实现
26.常见的两种分支限界法为(D)。
P161
A.广度优先分支限界法与深度优先分支限界法;
B.队列式(FIFO)分支限界法与堆栈式分支限界法;
C.排列树法与子集树法;
D.队列式(FIFO)分支限界法与优先队列式分支限界法;
二、填空题
1.f(n)=3n2+10的渐近性态f(n)=O(?
n2),
g(n)=10log3n的渐近性态g(n)=O(?
n?
)。
2.一个“好”的算法应具有正确性、可读性、健壮性和高效率和低存储量需求等特性。
3.算法的时间复杂性函数表示为C=F(N,I,A),分析算法复杂性的目的在于比较求解同意问题的两个不同算法的效率的效率。
4.构成递归式的两个基本要素是递归的边界条件和递归的定义。
5.单源最短路径问题可用分支限界法和贪心算法求解。
6.用分治法实现快速排序算法时,最好情况下的时间复杂性为O(nlogn),最坏情况下的时间复杂性为O(n^2),该算法所需的时间与运行时间和划分两方面因素有关。
P26
7.0-1背包问题的解空间树为完全二叉树;n后问题的解空间树为排列树;
8.常见的分支限界法有队列式(FIFO)分支限界法和优先队列式分支限界法。
9.回溯法搜索解空间树时常用的两种剪枝函数为约束函数和剪枝函数。
10.分支限界法解最大团问题时,活结点表的组织形式是最大堆;分支限界法解单源最短路径问题时,活结点表的组织形式是最小堆。
三、算法填空题
1.递归求解Hanoi塔问题/阶乘问题。
例1:
阶乘函数n!
P12
阶乘的非递归方式定义:
试写出阶乖的递归式及算法。
递归式为:
边界条件
递归方程
递归算法:
intfactorial(intn)
{if(n==0)return1;递归出口
returnn*factorial(n-1);递归调用
}
例2:
用递归技术求解Hanoi塔问题,Hanoi塔的递归算法。
P15
其中Hanoi(intn,inta,intc,intb)表示将塔座A上的n个盘子移至塔座C,以塔座B为辅助。
Move(a,c)表示将塔座a上编号为n的圆盘移至塔座c上。
voidhanoi(intn,inta,intc,intb)
{
if(n>0)
{
hanoi(n-1,a,b,c);
move(a,c);
hanoi(n-1,b,c,a);
}
}
2.用分治法求解快速排序问题。
快速排序算法P25、作业、课件第2章
(2)42页-50页
template
voidQuickSort(Typea[],intp,intr)
{
if(pintq=Partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
Partition函数的具体实现
template
intPartition(Typea[],intp,intr)
{
inti=p,j=r+1;
Typex=a[p];
//将//将>x的元素交换到右边区域
while(true){
while(a[++i]while(a[--j]>x);
if(i>=j)break;
Swap(a[i],a[j]);
}
a[p]=a[j];
a[j]=x;
returnj;
}
3.用贪心算法求解最优装载问题。
最优装载问题P95课件第4章
(2)第3-8页
template
voidLoading(intx[],Typew[],Typec,intn)
{
int*t=newint[n+1];
Sort(w,t,n);
for(inti=1;i<=n;i++)x[i]=0;
for(intj=1;j<=n&&w[t[j]]<=c;j++)
{x[t[i]]=1;c-=w[t[j]];}
}
4.用回溯法求解0-1背包/批处理作业调度/最大团问题,要会画解空间树。
例1:
用回溯法求解0-1背包P133课件第5章
(2)第24-38页
template
classKnap
{
private:
TypepBound(inti);//计算上界
voidBacktrack(inti);
Typewc;//背包容量
intn;//物品数
Typew*w;//物品重量数组
Typep*p;//物品价值数组
Typewcw;//当前重量
Typepcp;//当前价值
Typepbestp;//当前最优价值
};
voidKnap:
:
Backtrack(inti)
{if(i>n){bestp=cp;return;}
if(cw+w[i]<=c)//进入左子树
{cw+=w[i];
cp+=p[i];
Backtrack(i+1);
cw-=w[i];
cp-=p[i];}
if(Bound(i+1)>bestp)//进入右子树
Backtrack(i+1);
}
TypepKnap:
:
Bound(inti)
{
Typewcleft=c-cw;//剩余的背包容量
Typepb=cp;//b为当前价值
//依次装入单位重量价值高的整个物品
while(i<=n&&w[i]<=cleft)
{cleft-=w[i];b+=p[i];i++;}
if(i<=n)//装入物品的一部分
b+=p[i]*cleft/w[i];
returnb;//返回上界
}
classObject//物品类
{
friendintKnapsack(int*,int*,int,int);
public:
intoperator<(Objecta)const
{
return(d>=a.d);
}
intID;//物品编号
floatd;//单位重量价值
};
TypepKnapsack(Typepp[],Typeww[],Typewc,intn)
{//为TypepKnapsack初始化
TypewW=0;//总重量
TypepP=0;//总价值
Object*Q=newObject[n];//创建物品数组,下标从0开始
for(inti=1;i<=n;i++)//初始物品数组数据
{Q[i-1].ID=i;
Q[i-1].d=1.0*p[i]/w[i];
P+=p[i];W+=w[i];
}
if(W<=c)//能装入所有物品
returnP;
if(W<=c)//能装入所有物品
returnP;
QuickSort(Q,0,n-1);//依物品单位重量价值非增排序
KnapK;
K.p=newTypep[n+1];
K.w=newTypew[n+1];
for(inti=1;i<=n;i++)
{K.p[i]=p[Q[i-1].ID];K.w[i]=w[Q[i-1].ID];}
K.cp=0;K.cw=0;K.c=c;
K.n=n;K.bestp=0;K.Backtrack
(1);
delete[]Q;delete[]K.w;
delete[]K.p;returnK.bestp;
}
例2:
批处理作业调度课件第5章
(2)P2-5问题描述,课本P125-127
解空间:
排列树
算法描述:
classFlowshop
{
staticint[][]m,//各作业所需的处理时间
[]x,//当前作业调度
[]bestx,//当前最优作业调度
[]f2,//机器2完成处理时间
f1,//机器1完成处理时间
f,//完成时间和
bestf,//当前最优的完成时间和
n;//作业数
staticvoidBacktrack(inti)
{
if(i>n)
{for(intj=1;j<=n;j++)bestx[j]=x[j];bestf=f;}
else
for(intj=i;j<=n;j++){
f1+=m[x[j]][1];//第j个作业在第一台机器上所需时间
f2[i]=((f2[i-1]>f1)?
f2[i-1]:
f1)+m[x[j]][2];
f+=f2[i];
if(f{Swap(x[i],x[j]);Backtrack(i+1);Swap(x[i],x[j]);}
f1-=m[x[j]][1];
f-=f2[i];
}
}
例3:
最大团问题,要会画解空间树。
classClique
{
friendintMaxClique(int**,int[],int);
public:
voidPrint();//输出最优解
private:
voidBacktrack(inti);
int**a;//图G的邻接矩阵,下标从1开始
intn;//图G的顶点数
int*x;//当前解
int*bestx;//当前最优解
intcn;//当前团的顶点数
intbestn;//当前最大团的顶点数
};
voidClique:
:
Backtrack(inti)
{if(i>n)
{for(intj=1;j<=n;j++)bestx[j]=x[j];bestn=cn;return;}
//判断第i个顶点是否与已选顶点都有边相连
intOK=1;
for(intj=1;j
i-1],已入选的顶点集
if(x[j]&&a[i][j]==0)//i与当前团中的顶点无边相连
{OK=0;break;}//只要与当前团中一个顶点无边相连,则中止
if(OK)//进入左子树
{x[i]=1;cn++;Backtrack(i+1);x[i]=0;cn--;}
if(cn+n-i>bestn)//如有可能在右子树中找到更大的团,则进入右子树
{x[i]=0;Backtrack(i+1);}
}
计算时间:
O(n2n)
四、简答题
1.请简述使用动态规划算法解题的基本步骤。
P44
动态规划的设计分为以下4个步骤:
(1)找出最优解的性质,并刻划其结构特征。
(2)递归地定义最优值。
(3)以自底向上的方式计算出最优值。
(4)根据计算最优值时得到的信息,构造最优解。
2.简述动态规划方法与分治法的异同。
P44
相同点:
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,然后从这些子问题的解得到原问题的解。
不同点:
分治法的子问题互相独立且与原问题相同。
与分治法不同的是,适合于动态规划求解的问题,经分解得到的子问题往往不是互相独立的。
也就是各个子问题包含公共的子子问题。
3.试比较Prim算法与Kruskal算法的异同。
105-P107
相同点:
Prim(普里姆)算法和Kruskal(克鲁斯卡尔)算法都可以看作是应用贪心算法构造最小生成树的例子。
利用了最小生成树性质。
不同点:
Prim(普里姆)算法:
在这个过程中选取到的所有边恰好构成G的一棵最小生成树T,T中包含G的n-1条边,且不形成回路。
Kruskal(克鲁斯卡尔)算法:
是构造最小生成树的另一个常用算法。
该算法不是通过扩充连通子集来进行贪心选择。
而是通过选择具有最小权的边的集合来进行贪心选择。
在选择的同时可以进行连通操作以便形成生成树。
4.请简述分支限界法的搜索策略。
P161课件第6章
(1)第6页
(1)分支限界法以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。
(2)每一个活结点只有一次机会成为扩展结点。
(3)活结点一旦成为扩展结点,就一次性产生其所有儿子结点。
(4)儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。
(5)从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。
这个过程一直持续到找到所需的解或活结点表为空时为止。
5.试比较分支限界法与回溯法的异同。
P161课件第6章
(1)第5页
不同点:
(1)求解目标:
回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
(2)搜索方式:
回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。
五、算法应用题
1.用动态规划求解凸多边形最优三角剖分问题。
三角剖分的结构及其相关问题P61
(1)语法树与完全加括号方式
一个表达式的完全加括号方式相应于一棵完全二叉树,称为表达式的语法树。
例如,完全加括号的矩阵连乘积((A1(A2A3))(A4(A5A6)))所相应的语法树如图(a)所示。
(2)语法树与凸多边形三角剖分
凸多边形P={v0,v1,…vn-1}的三角剖分也可以用语法树表示。
如图:
根结点是边v0v6(可以任选)。
其他边则是语法树的叶子节点。
v0v6是三角形v0v3v6的一条边。
2、三角剖分与矩阵连乘P61
(1)一般来说,凸多边形的三角剖分和有n-1个叶节点的语法树存在一一对应关系。
(2)N个矩阵连乘的完全加括号和有n个叶节点的语法树也存在一一对应关系。
(3)所以,n个矩阵连乘的完全加括号和有n+1个节点的凸多边形的三角剖分也存在一一对应关系。
(4)矩阵连乘积中A1A2…An中的每个矩阵Ai对应于凸(n+1)边形中的一条边vi-1vi。
三角剖分中的一条弦vivj,ij]。
(5)矩阵连乘积的最优计算次序问题是凸多边形最优三角剖分问题的特殊情况。
课后习题(第3章小结**)
对于如下矩阵链
P={10,100,5,50,30,20,60,45,50},请按照构造其最优完全加括号方式,并列出相应的语法树和最优三角剖分图。
2.用贪心算法求解活动安排问题/最小生成树问题/哈夫曼编码问题。
贪心算法求解活动安排问题
例:
设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下:
最小生成树问题P103-P105
哈夫曼编码问题,前缀码二叉树表示法
例子:
图a:
与固定长度编码对应的树(叶子高度一致)
图b:
与可变长度编码对应的树(叶子高度不一致)
3.用回溯法求解0-1背包问题/最优装载问题。
用回溯法求0-1背包问题。
P133,
实例:
n=5,M=50
N
1
2
3
4
5
W
15
5
25
27
30
P
30
12
44
46
50
P/W
2
2.4
1.76
1.70
1.67
(1).令bestp=0,将物体的序号按价值体积比排序结果是(2,1,3,4,5)
N
2
1
3
4
5
W
5
15
25
27
30
P
12
30
44
46
50
P/W
2.4
2
1.76
1.70
1.67
(2).根据排序得到部分解(1,1,1,0),估计当前部分解的价值b,86+(50-45)*1.67=94.3,b>bestp.
(3).继续向下搜索生成结点F,得到可行解(1,1,1,0,0),得到价值为86,更新bestp=86(如图第3步)
第3步第5步第8步
(4).回溯:
沿E回溯到左孩子D,生成相应右孩子G,得到部分解(1,1,0,1),此时b=93.1b>bestp,可以生成右子树(第4步在第5步的基础上没有H和I的图形)
(5).继续生成结点H,I,得到可行解(1,1,0,1,0),价值为88,更新bestp=88(如图第5步)
(6).回溯H生成J,得到部分解(1,1,0,0),估计部分解b=92>88(第6步在第8步的基础上没有K和L的图形)
(7).继续生成结点K,得到可行解(1,1,0,0,1),价值为92,更新bestp=92(第7步在第8步的基础上没有L的图形)
(8).K是左孩子,生成其对应的右孩子L,得到可行解(1,1,0,0,0)(如图第8步)
(9).回溯,沿结点L向上回溯到结点B,生成结点M,得到部分解(1,0),估计部分解b=90<92,回溯(第9步在第10步的基础上没有N的图形)
(10).向上继续回溯生成结点N,得到部分解(0),此时得到的b=74+10*(46/27)=91.03<92,回溯,此时已回到根结点,结束。
最优解(1,1,0,0,1),价值为92.(如图第10步)
练习
n=8,M=110,
W=(1,11,21,23,33,43,45,55)
P=(11,21,31,33,43,53,55,65)