算法分析与设计复习题Word文档下载推荐.docx
- 文档编号:5845198
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:17
- 大小:96.50KB
算法分析与设计复习题Word文档下载推荐.docx
《算法分析与设计复习题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《算法分析与设计复习题Word文档下载推荐.docx(17页珍藏版)》请在冰点文库上搜索。
k<
n,不论前面k个决策是怎样的,以后的最优决策只取决于由前面决策所确定的当前状态,即以后的决策Dk+1,Dk+2,…,Dn也是最优的。
5.算法的时间复杂性指算法中元运算的执行次数。
6.其中,g(n)表示将规模为n的问题分解为子问题以及组合相应的子问题的解所需的时间。
7.分治算法的基本步骤包括分解,递归,组合。
8.回溯算法的基本思想是在问题的状态空间树上作带剪枝的DFS搜索(或:
DFS+剪枝。
9.动态规划和分治法在分解子问题方面的不同点是前者分解出的子问题有重叠的,而后者分解出的子问题是相互独立(不重叠)的。
10.随机算法的一个基本特征是对于同一组输入,不同的运行可能得到不同的结果。
11.对于下面的确定性快速排序算法,只要在步骤3前加入随机化步骤v=random(low,high);
交换A[low]和A[v]的值,就可得到一个随机化快速排序算法,该随机化步骤的功能是随机选主元。
1.用O、
、
表示函数f与g之间阶的关系,指出下列函数中阶最低和最高的函数:
(1) f(n)=100g(n)=
(2)f(n)=6n+n
g(n)=3n
(3)f(n)=n/logn-1g(n)=
(4)f(n)=
g(n)=
(5)f(n)=
g(n)=
(1)f(n)=O(g(n))
(2)f(n)=
(g(n))
(3)f(n)=
(4)f(n)=O(g(n))
(5)f(n)=
阶最低的函数是:
100
阶最高的函数是:
下面是一个递归算法,其中,过程pro1和pro2的运算时间分别是1和。
给出该算法的时间复杂性T(n)满足的递归方程,并求解该递归方程,估计T(n)的阶(用表示)。
算法EX1
输入:
正整数n,n=2k。
输出:
…
ex1(n)
endEX1
过程ex1(n)
ifn=1then
pro1(n)
else
pro2(n)
ex1(n/2)
endif
return
endex1
2.该递归算法的时间复杂性T(n)满足下列递归方程:
将n=
a=1,c=2,g(n)=
d=1代入该类递归方程解的一般形式得:
T(n)=1+
=1+k
-
=1+k
=
+
+1
所以,T(n)=
+1=
。
一个旅行者要驾车从A地到B地,A、B两地间距离为s。
A、B两地之间有n个加油站,已知第i个加油站离起点A的距离为公里,0=,车加满油后可行驶m公里,出发之前汽车油箱为空。
应如何加油使得从A地到B地沿途加油次数最少?
给出用贪心法求解该最优化问题的贪心选择策略,写出求该最优化问题的最优值和最优解的贪心算法,并分析算法的时间复杂性。
三、算法填空
6.排列问题
Template<
classType>
voidperm(Typelist[],intk,intm)
{//产生[list[k:
m]的所有排列
if(k==m)
{//只剩下一个元素
for(inti=0;
i<
=m;
i++)cout<
<
list[i];
cout<
endl;
}
else//还有多个元素待排列,递归产生排列
for(inti=k;
i<
i++)
{
swap(list[k],list[i]);
perm(list,k+1;
m);
swap(list[k],list[i]);
}
四、问答题
1.分治法的基本思想时将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。
递归地解这些子问题,然后将各个子问题的解合并得到原问题的解。
3.分治法与动态规划法的相同点是:
将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
两者的不同点是:
适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。
而用分治法求解的问题,经分解得到的子问题往往是互相独立的。
4.分支限界法与回溯法的相同点是:
都是一种在问题的解空间树T中搜索问题解的算法。
不同点:
(1)求解目标不同;
(2)搜索方式不同;
(3)对扩展结点的扩展方式不同;
(4)存储空间的要求不同。
6.分治法所能解决的问题一般具有的几个特征是:
(1)该问题的规模缩小到一定的程度就可以容易地解决;
(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质;
(3)利用该问题分解出的子问题的解可以合并为该问题的解;
(4)原问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
7.用分支限界法设计算法的步骤是:
(1)针对所给问题,定义问题的解空间(对解进行编码);
分
(2)确定易于搜索的解空间结构(按树或图组织解);
(3)以广度优先或以最小耗费(最大收益)优先的方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
8.常见的两种分支限界法的算法框架
(1)队列式(FIFO)分支限界法:
按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。
(2)优先队列式分支限界法:
按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。
9.回溯法中常见的两类典型的解空间树是子集树和排列树。
当所给的问题是从n个元素的集合S中找出满足某种性质的子集时,相应的解空间树称为子集树。
这类子集树通常有2n个叶结点,遍历子集树需O(2n)计算时间。
当所给的问题是确定n个元素满足某种性质的排列时,相应的解空间树称为排列树。
这类排列树通常有n!
个叶结点。
遍历排列树需要O(n!
)计算时间。
10.分支限界法的搜索策略是:
在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展结点。
为了有效地选择下一扩展结点,加速搜索的进程,在每一个活结点处,计算一个函数值(限界),并根据函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。
(1)用计算机求解问题的步骤:
1、问题分析2、数学模型建立3、算法设计与选择4、算法指标5、算法分析6、算法实现7、程序调试8、结果整理文档编制
(2)算法定义:
算法是指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程
(3)算法的三要素
1、操作2、控制结构3、数据结构
算法具有以下5个属性:
有穷性:
一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
确定性:
算法中每一条指令必须有确切的含义。
不存在二义性。
只有一个入口和一个出口
可行性:
一个算法是可行的就是算法描述的操作是可以通过已经实现的基本运算执行有限次来实现的。
输入:
一个算法有零个或多个输入,这些输入取自于某个特定对象的集合。
输出:
一个算法有一个或多个输出,这些输出同输入有着某些特定关系的量。
算法设计的质量指标:
正确性:
算法应满足具体问题的需求;
可读性:
算法应该好读,以有利于读者对程序的理解;
健壮性:
算法应具有容错处理,当输入为非法数据时,算法应对其作出反应,而不是产生莫名其妙的输出结果。
效率与存储量需求:
效率指的是算法执行的时间;
存储量需求指算法执行过程中所需要的最大存储空间。
一般这两者与问题的规模有关。
经常采用的算法主要有迭代法、分而治之法、贪婪法、动态规划法、回溯法、分支限界法
五、算法题
3、矩阵乘法:
C11=A11B11+A12B21C12=A11B12+A12B22
C21=A21B11+A22B21C22=A21B12+A22B22
成为8个n/2阶矩阵乘积,4个n/2阶矩阵加法。
如果以数的乘法作为基本运算,则可得到分块矩阵乘法的递归方程
8(O
(1))n=2
T(n)=
8T(n/2)n>
2
代入递归方程得T(n)=n3
使用了7个n/2阶矩阵乘积,18个n/2阶矩阵加法,其算法复杂度为O(n2.81)
2.81=log27
算法
procedureSTRASSEN(n,A,B,C);
begin
ifn=2thenMATRIX-MULTIPLY(A,B,C)
elsebegin
将矩阵A和B依
(1)式分块;
STRASSEN(n/2,A11,B12-B22,M1);
STRASSEN(n/2,A11+A12,B22,M2);
STRASSEN(n/2,A21+A22,B11,M3);
STRASSEN(n/2,A22,B21-B11,M4);
STRASSEN(n/2,A11+A22,B11+B22,M5);
STRASSEN(n/2,A12-A22,B21+B22,M6);
STRASSEN(n/2,A11-A21,B11+B12,M7);
;
end;
3、快速排序:
例7快速排序
对输入的数组a[p:
r]按以下三个步骤进行:
分解(Divide),以a[p]为基准元素将a[p:
r]划分为三部分:
a[p:
q-1],a[q],a[q+1:
r],使得a[p:
q-1]中的元素小于a[q],a[q+1:
r]中的元素大于a[q].
递归求解(Conquer),通过递归调用快速排序算法分别对a[p:
q-1],a[q+1:
r]排序。
合并(merge),由于已排好序,合并不需作什么.
快速排序递归算法:
Quicksort(a,p,r)
{if(p<
r)
{q=partition(a,p,r);
Quicksort(a,p,q-1);
快速排序算法分析
Partition(a,p,r)计算时间为O(r-p+1),即f(n)=n
最好情况,每次q=(p+r)/2
O
(1)n=1
T(n)=2T(n/2)+nn>
1
解方程得:
T(n)=n+nlog2n=O(nlog2n)
最坏情况,每次q=p或q=r
T(n)=T(n-1)+nn>
T(n)=O(n2)
第三章
(六)、掌握贪心策略基本思想及基本性质,并能证明贪心选择性质
1、贪心策略基本思想:
和动态规划类似,贪心法用于多阶段的决策过程,每个阶段都有可供选择的多种决策,各个阶段的决策构成一个决策序列.贪心法的目标是选取一个最优的决策序列.
2、基本性质:
贪心法选择决策的原则是局部最优,而不是全局最优。
如果一个问题的整体最优解可以通过一系列局部最优选择来实现,称该问题具有贪心选择性质.贪心选择性质是贪心法可行的一个基本要素.它是保证贪心法的求解结果为最优解的条件.
最优子结构性质
3、证明:
(七)、掌握贪心策略实例:
最小生成树、背包问题、作业调度问题
1、背包问题:
给定n个重量为(w1,w2,…,wn),价值为(v1,v2,…vn)的物品和一个容量为C的背包,要求选择部分物品装进背包,使得背包内物品价值总和最大.
1)问题的解(x1,x2,…xn)0≤xi≤1
2)约束条件∑xiwi≤C
3)目标函数∑xivi达到最大
解题思路:
1)尽可能多选择价值大的物品.
2)尽可能多选择重量轻的物品.
3)尽可能多选择价值/重量比大的物品.
贪心法的一般过程
1)根据题意选取一种度量标准或贪心策略.
2)按度量标准对n个输入排序.
3)按序做出贪心选择.
4)检查该选择是否与前面的选择构成可行解.
5)如果可行,则将该选择加入解中,否则不加入.
6)继续做下一步选择.
Greedy-knapsack()
{将物品按v/w从大到小排序
for(i=1;
=n;
i++)x[i]=0;
if(w[i]<
c)
{x[i]=1;
c=c-w[i]}
else{x[i]=cu/w[i];
break;
outputx[1]…x[n]
第四章
(八)掌握动态规划的基本思想及解题步骤
1、动态规划的基本思想:
动态规划是和过程最优化概念紧密联系的.在过程进行中,在客观条件允许范围内选择最好的措施控制过程的发展,以期最好的完成任务.动态规划用于多阶段的决策过程,每个阶段都有可供选择的多种决策,各个阶段的决策构成一个决策序列.动态规划的目标是选取一个最优的决策序列
形式:
如:
1)问题的解:
边的序列,每一步决策选择一条边
{<
AC>
<
CF>
FI>
IJ>
<
JL>
2)约束条件:
两个顶点之间有边存在
3)可行解:
满足约束条件的解
4)目标函数:
解中边的权值和达到最小
5)最优解:
使目标函数取极值的可行解
(九)、掌握动态规划实例:
投资分配问题、货币分配问题、0-1背包问题
1、投资分配问题:
总资源数为a,工程个数为n。
给每个工程投资不同,所获得的利润也不同。
现给定各个工程的资源利润表和资源总数,问:
如何分配资源,才能获得最大利润。
记Fn(a)为给n个工程投资资源数为a时可获得的最大利润,则有:
Fn(a)=max{G1(x1)+G2(x2)+…Gn(xn)}
x1+x2+…xn=a
如果给第n项工程投资x,给前n-1项工程投资a-x,则Fn(a)=max{Fn-1(a-x)+Gn(x)}
X∈(0,1,…,a)
记Fk(z)为给k个工程投资总资源数为z时可以获得的最大利润,则有递推公式:
Fk(z)=max{Fk-1(z-x)+Gk(x)}Z∈(0,1,…,a)
X∈(0,1,…,z)
F1(z)=G1(z)
利用这一递推公式,我们可以得出该问题的算法。
投资问题算法
Investing(m,n,g[i][j])
{for(j=0;
j<
j=j+1){f[1][j]=g[1][j];
d[1][j]=j}
for(i=2;
i=i+1)
for(j=0;
j=j+1)
{f[i][j]=0;
for(k=0;
k<
=j;
k=k+1)
{s=f[i-1][j-k]+g[i][k]
if(s>
f[i][j]){f[i][j]=s;
d[i][j]=k}
构造最优解
}
m总投资数额。
n工程总项数。
g[I][J]存放资源利润表,I为工程号,J为投资数额
构造最优解
{s=m
x[n]=d[n][m]
for(k=n-1;
k>
0;
k=k-1)
{s=s-x[k+1];
x[k]=d[k][s];
for(k=1;
k=k+1)outputx[k]
outputf[n][m]
}
d[I][J]给前I项工程投资额为J,获最大利润时第I项的投资额
20/1背包问题:
1)问题的解(x1,x2,…xn)xi=0,1
2)约束条件∑xiwi<
=C
0/1背包问题的特征
第一步决策第n种物品是否装入背包.剩余问题是给定n-1个重量为(w1,w2,…,wn-1),价值为(v1,v2,…vn-1)的物品和一个容量为C-wn*xn的背包的0/1背包问题.
递归地定义最优值,导出递推公式.
V(n,c)=max{V(n-1,C),V(n-1,C-wn)+vn}
0i=0
V(i,j)=V(i-1,j)j<
wi
max{V(i-1,j),V(i-1,j-wi)+vi}j>
=wi
0/1背包问题的算法
Knapsack()
{for(i=1;
i++)v[i][0]=0
for(j=1;
=C;
j++)v[0][j]=0
for(i=1;
i++)
j++)
if(j<
w[i])v[i][j]=v[i-1][j];
elsev[i][j]=max{v[i-1][j],v[i-1][j-w[i]]+v[i]}
outputv[n][c]
{j=C;
for(i=n;
i>
=1;
i--)
{if(v[i][j]>
v[i-1][j]){x[i]=1;
j=j-w[i]}
elsex[i]=0;
outputx[i];
第五、六章
(十)、掌握回溯法和分支限界法的基本思想和搜索策略
1、回溯法:
从开始结点(根结点)出发,以深度优先方式搜索整个解空间。
这个开始结点成为活结点,如果当前扩展节点处不能纵深方向移动,则当前扩展结点成为死结点。
此时往回移动至最近的一个活结点处,并使这个活结点成为当前扩展结点,否则向纵深方向移至一个新结点,并成为新的活结点。
直到找到所要求的解或空间中已无活结点时为止。
(回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。
但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,)
2、回溯法搜索策略:
以深度优先方式
3、分支限界法:
分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。
4、分置限界法搜索策略:
以广度优先或以最小耗费(最大效益)优先的方式
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分析 设计 复习题
![提示](https://static.bingdoc.com/images/bang_tan.gif)