《算法分析与设计》期末考试复习题纲完整文档格式.docx
- 文档编号:16925318
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:16
- 大小:29.32KB
《算法分析与设计》期末考试复习题纲完整文档格式.docx
《《算法分析与设计》期末考试复习题纲完整文档格式.docx》由会员分享,可在线阅读,更多相关《《算法分析与设计》期末考试复习题纲完整文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
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)。
A.递归地定义最优值
B.分析最优解的性质,并刻画其结构特征
C.根据计算最优值时得到的信息,构造最优解(可以省去的)
D.以自底向上的方式计算出最优值
24.分治法所能解决的问题应具有的关键特征是(C)。
P16
A.该问题的规模缩小到一定的程度就可以容易地解决
B.该问题可以分解为若干个规模较小的相同问题
C.利用该问题分解出的子问题的解可以合并为该问题的解
D.该问题所分解出的各个子问题是相互独立的
25.下列关于回溯法的描述不正确的是(D)。
P114
A.回溯法也称为试探法
B.回溯法有“通用解题法”之称
C.回溯法是一种能避免不必要搜索的穷举式搜索法
D.用回溯法对解空间作深度优先搜索时只能用递归方法实现
26.常见的两种分支限界法为(D)。
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<
classType>
voidQuickSort(Typea[],intp,intr)
{
if(p<
r){
intq=Partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
Partition函数的具体实现
intPartition(Typea[],intp,intr)
inti=p,j=r+1;
Typex=a[p];
//将<
x的元素交换到左边区域
//将>
x的元素交换到右边区域
while(true){
while(a[++i]<
x&
&
i<
r);
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页
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页
typenameTypew,typenameTypep>
classKnap
{
private:
TypepBound(inti);
//计算上界
voidBacktrack(inti);
Typewc;
//背包容量
intn;
//物品数
Typew*w;
//物品重量数组
Typep*p;
//物品价值数组
Typewcw;
//当前重量
Typepcp;
//当前价值
Typepbestp;
//当前最优价值
};
voidKnap<
Typew,Typep>
:
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)//进入右子树
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;
QuickSort(Q,0,n-1);
//依物品单位重量价值非增排序
Knap<
K;
K.p=newTypep[n+1];
K.w=newTypew[n+1];
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)
n)
{for(intj=1;
j++)bestx[j]=x[j];
bestf=f;
}
else
for(intj=i;
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<
bestf)//约束函数
{Swap(x[i],x[j]);
Swap(x[i],x[j]);
f1-=m[x[j]][1];
f-=f2[i];
例3:
最大团问题,要会画解空间树。
classClique
friendintMaxClique(int**,int[],int);
voidPrint();
//输出最优解
int**a;
//图G的邻接矩阵,下标从1开始
//图G的顶点数
int*x;
//当前解
int*bestx;
//当前最优解
intcn;
//当前团的顶点数
intbestn;
//当前最大团的顶点数
voidClique:
{if(i>
n)
{for(intj=1;
j<
j++)bestx[j]=x[j];
bestn=cn;
//判断第i个顶点是否与已选顶点都有边相连
intOK=1;
for(intj=1;
i;
j++)//x[1:
i-1],已入选的顶点集
if(x[j]&
a[i][j]==0)//i与当前团中的顶点无边相连
{OK=0;
break;
}//只要与当前团中一个顶点无边相连,则中止
if(OK)//进入左子树
{x[i]=1;
cn++;
x[i]=0;
cn--;
if(cn+n-i>
bestn)//如有可能在右子树中找到更大的团,则进入右子树
{x[i]=0;
计算时间:
O(n2n)
四、简答题
1.请简述使用动态规划算法解题的基本步骤。
动态规划的设计分为以下4个步骤:
(1)找出最优解的性质,并刻划其结构特征。
(2)递归地定义最优值。
(3)以自底向上的方式计算出最优值。
(4)根据计算最优值时得到的信息,构造最优解。
2.简述动态规划方法与分治法的异同。
相同点:
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,然后从这些子问题的解得到原问题的解。
不同点:
分治法的子问题互相独立且与原问题相同。
与分治法不同的是,适合于动态规划求解的问题,经分解得到的子问题往往不是互相独立的。
也就是各个子问题包含公共的子子问题。
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,i<
j,对应于矩阵连乘积A[i+1:
j]。
(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
25
27
30
P
12
44
46
50
P/W
2.4
1.76
1.70
1.67
(1).令bestp=0,将物体的序号按价值体积比排序结果是(2,1,3,4,5)
(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)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法分析与设计 算法 分析 设计 期末考试 复习题 完整