《算法分析与设计》期末考试复习题纲完整版doc.docx
《《算法分析与设计》期末考试复习题纲完整版doc.docx》由会员分享,可在线阅读,更多相关《《算法分析与设计》期末考试复习题纲完整版doc.docx(85页珍藏版)》请在冰豆网上搜索。
《算法分析与设计》期末考试复习题纲完整版doc
WORD格式
《算法分析与设计》期末复习题
一、选择题
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
.
n+8
B
.
n+6
A
D
.
.
n+7
n+5
C
4.
设问题规模为
N时,某递归算法的时间复杂度记为
T(N),已知
T
(1)=1,
T(N)=2T(N/2)+N/2,用O表示的时间复杂度为(
C
)。
.
O(logN)
B
.
O(N)
A
C.O(NlogN)
D
.O(N2logN)
5.
直接或间接调用自身的算法称为
B
(
)。
A.贪心算法
B
.递归算法
.迭代算法
D
.回溯法
C
6.
Fibonacci数列中,第4个和第11个数分别是(
D
)。
A.5,89
B
.3,89
C.5,144
D
.3,144
7.
在有8个顶点的凸多边形的三角剖分中,恰有(
B
)。
.
条弦和
7
个三角形
B
.
5
条弦和
6
个三角形
A
6
C.6条弦和
6个三角形
D
.5条弦和
5个三角形
8.
一个问题可用动态规划算法或贪心算法求解的关键特征是问题
B)。
的(
A.重叠子问题
B
.最优子结构性质
.贪心选择性质
D
.定义最优解
C
9.
下列哪个问题不用贪心法求解
C
(
)。
.哈夫曼编码问题
B
.单源最短路径问
题
A
.最大团问题
D
.最小生成树问题
C
10.
下列算法中通常以自底向上的方式求解最优解的是(
B)。
A.备忘录法
B
.动态规划法
C.贪心法
D
.回溯法
11.下列算法中不能解决0/1背包问题的是(A)。
A.贪心法B.动态规划
C.回溯法D.分支限界法
专业资料整理
WORD格式
12.下列哪个问题可以用贪心算法求解(D)。
1
专业资料整理
WORD格式
A.LCS问题
B
.批处理作业问题
C.0-1背包问题
D
.哈夫曼编码问题
13.
用回溯法求解最优装载问题时,若待选物品
m种,则该问题的解空间树的结
为
点
个数为(
)。
A.m!
B.2m+1
C.2m+1-1
D.2m
14.
二分搜索算法是利用(
A)实现的算法。
.分治策略
B
.动态规划法
A
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
.广度优先
B
.最小耗费优先
A
.深度优
C.最大效益优先
D
先
20.
分支限界法解最大团问题时,活结点表的组织形式是(
B)。
.最小堆
B
.最大堆
A
C.栈
D
.数组
21.
下列关于计算机算法的描述不正确的是
)。
(
CP1
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.以自底向上的方式计算出最优值
专业资料整理
WORD格式
24.分治法所能解决的问题应具有的关键特征是(C)。
P16
2
专业资料整理
WORD格式
A.该问题的规模缩小到一定的程度就可以容易地解决
B.该问题可以分解为若干个规模较小的相同问题
C.利用该问题分解出的子问题的解可以合并为该问题的解
D.该问题所分解出的各个子问题是相互独立的
下列关于回溯法的描述不正确的是
25.(D)。
P114
A.回溯法也称为试探法
B.回溯法有“通用解题法”之称
C.回溯法是一种能避免不必要搜索的穷举式搜索法
D.用回溯法对解空间作深度优先搜索时只能用递归方法实现
26.常见的两种分支限界法为(D
)。
P161
A.广度优先分支限界法与深度优先分支限界法;
B.队列式(FIFO)分支限界法与堆栈式分支限界法;
C.排列树法与子集树法;
D.队列式(FIFO)分支限界法与优先队列式分支限界法;
二、填空题
f(n)=3
n2)
1.
n
2+10的渐近性态f(n)=O(
,
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
阶乘的非递归方式定义:
n!
n
(n
1)
(n2)
21
试写出阶乖的递归式及算法。
递归式为:
1
n0
边界条件
n!
n(n
1)!
n
0
专业资料整理
WORD格式
3
专业资料整理
WORD格式
递归方程
递归算法:
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(p
intq=Partition(a,p,r);
QuickSort(a,p,q-1);
QuickSort(a,q+1,r);
}
}
专业资料整理
WORD格式
4
专业资料整理
WORD格式
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]];}
专业资料整理
WORD格式
}
5
专业资料整理
WORD格式
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为当前价值
//依次装入单位重量价值高的整个物品
专业资料整理
WORD格式
6
专业资料整理
WORD格式
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);//依物品单位重量价值非增排序
专业资料整理
WORD格式
7
专业资料整理
WORD格式
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];
}
}
专业资料整理
WORD格式
8
专业资料整理
WORD格式
例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=c
n;return;}//判断第i个顶点是否与已选顶点都有
边相连
intOK=1;
for(intj=1;j
i-1],已入选的顶点集
if(x[j]&&a[i][j]==0)//i与当前团中的顶点无边相连
{OK=0;break;}//只要与当前团中一个顶点无边相连,则中止
if(OK)//进入左子树
专业资料整理
WORD格式
9
专业资料整理
WORD格式
{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(克鲁斯卡尔)算法都可以看作是应用贪心算法构造最小生成树的例子。
利用了最小生成树性质。
不同点:
10
专业资料整理
WORD格式
Prim(普里姆)算法:
在这个过程中选取到的所有边恰好构成G的一棵最小生成树T,T中包
含G的n-1条边,且不形成回路。
Kruskal(克鲁斯卡尔)算法:
是构造最小