算法期末复习.docx
- 文档编号:23509711
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:14
- 大小:157.38KB
算法期末复习.docx
《算法期末复习.docx》由会员分享,可在线阅读,更多相关《算法期末复习.docx(14页珍藏版)》请在冰豆网上搜索。
算法期末复习
算法设计与分析
◎基本概念
算法是解题方案的准确而完整的描述,它是一些步骤组成的一个过程。
算法不等于程序,它不需要考虑具体的机器和语言。
数据结构程序加工处理的数据在计算机中的存放方式。
算法是对数据加工的步骤。
程序就是在数据的某种特定的表示方法和结构的基础上对抽象算法的具体描述。
3算法的特征
有穷性(finiteness):
一个算法必须在有限步骤之内完成。
2)确定性(definiteness):
算法中的每一步必须明确,不能模棱两可。
3)能行性(effectiveness):
算法中的每一步都是可以实现的,或者可以分解为可执行的的基本操作。
4)输入(input):
有零个或多个输入。
5)输出(output):
有一个或多个输出。
7算法的正确性
评价一个算法,正确性是一个永恒的标准。
算法的正确依赖于所用理论的正确.但是,理论正确的算法未必能得到正确结果,逻辑正确未必能得到正确结果。
计算工具的精度对结果会有较大影响。
2算法的设计步骤
1)问题的描述
2)模型的建立
3)算法设计
4)算法分析
5)算法的实现
6)验证算法正确性
6)验证算法正确性
目前是通过验证表达该算法的程序的正确性来实现。
虽然这两者不完全一致,但因目前要证明算法的正确性仍然有困难,所以上述方法仍然是主要方法。
验证程序的正确性采用程序测试的方法。
经测试验证是正确的程序,在很大程度上可以相信该程序及其算法的正确性。
1算法的复杂度
算法复杂度主要指时间复杂度和空间复杂度。
算法的时间复杂度(Timecomplexity):
指执行算法的计算工作量,即算法的时间代价。
算法的空间复杂度(Spacecomplexity):
指算法执行过程中需要存储空间的大小,即算法的空间代价.
算法的时间复杂度的度量
基本运算:
基本运算应与使用的计算机及语言无关。
基本运算次数应与算法运算总次数大体上成比例。
问题规模:
算法所执行的基本运算的次数不仅与算法本身有关,还与问题的规模有关。
为了比较算法的优劣,要对同等规模的问题进行分析。
◎证明:
反证法
1.动态规划法
◎动态规划用于多阶段的决策过程,每个阶段都有可供选择的多种决策,各个阶段的决策构成一个决策序列.动态规划的目标是选取一个最优的决策序列
◎最优性原理(principleofoptimality)
“一个过程的最优决策具有这样的性质,即无论其初始状态和初始决策如何,从这一决策所导致的新状态开始,以后的一系列决策必须是最优的”这就是最优性原理
◎动态规划法设计步骤
①找出最优解的性质,并刻画其结构(最优子结构)特征.
②递归地定义最优值,导出递推公式.
③以自底向上的方式计算最优值.
④根据计算最优值时得到的信息,构造最优解.
投资问题:
设总资源数为a,工程个数为n。
给每个工程投资不同,所获得的利润也不同。
现给定各个工程的资源利润表和资源总数,问:
如何分配资源,才能获得最大利润。
表3项工程的资源利润表
X
0
1
2
3
4
5
6
7
8
g1(x)
0
5
15
40
80
90
95
98
100
g2(x)
0
5
15
40
60
70
73
74
75
g3(x)
0
4
26
40
50
51
52
53
54
表中给出了第i项工程分配资源数为x时所能获得的利润gi(x)
记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<=m;j=j+1){f[1][j]=g[1][j];d[1][j]=j}
for(i=2;i<=n;i=i+1)
for(j=0;j<=m;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<=n;k=k+1)outputx[k]
outputf[n][m]
}
d[I][J]给前I项工程投资额为J,获最大利润时第I项的投资额
2.分治法
如果求解的问题比较复杂,可以将它们分割为若干较小的问题各个击破,以降低问题的复杂性。
这就是分治法的思想。
3.贪心法
和动态规划类似,贪心法用于多阶段的决策过程,每个阶段都有可供选择的多种决策,各个阶段的决策构成一个决策序列.贪心法的目标是选取一个最优的决策序列.
贪心法选择决策的原则是局部最优,而不是全局最优,因此贪心法比动态规划决策容易.
例1假设有四种硬币:
25分,10分,5分,1分.要凑够63分,问应该怎样取硬币(各取几枚),使得所取硬币总个数最少?
解的形式:
X=(x1,x2,x3,x4)
约束条件:
xi>=0∑wixi=m
目标函数:
∑xi最小达到
解题思路:
尽可能多选择面值大的硬币.
该问题的解(2,1,0,3)
例2背包问题
给定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)继续做下一步选择.
贪心选择性质
如果一个问题的整体最优解可以通过一系列局部最优选择来实现,称该问题具有贪心选择性质.
贪心选择性质是贪心法可行的一个基本要素.它是保证贪心法的求解结果为最优解的条件.
例3活动安排问题
有n项活动的集合E={1,2,…,n},各项活动使用同一资源,在同一时间只能有一项活动进行.每项活动都有起始时间si和结束时间fi,即活动i占用资源时间为[sifi),如果[sifi)与[sjfj)没有重叠,称活动i与活动j相容.
问题:
在给定的活动集合中选出数量最多的相容活动子集合.
贪心策略:
最早开始时间
最早结束时间
Greedy-ActiveManage()
{将活动按fi从小到大排序
x[1]=1;k=1;c=1;
for(i=2;i<=n;i++)
if(s[i]>=f[k]){x[i]=1;k=i;c++;}
elsex[i]=0
outputx[1]…x[n],c;
}时间最长
思考:
选出占资源时间最长的相容活动子集合.
例4最小生成树问题
设G=(V,E)是一无向连通图,生成树上各边的权值之和称为该生成树的代价,代价最小的生成树称为最小生成树.(minimalspanningtrees)
设G=(V,E)有n个结点,m条边
V=(v1,v2,…vn)E=(e1,e2,…em)
度量标准:
边的权值
Kruskal算法
1初始化:
U=VTE={}T=(U,TE)
2循环直到TE中有n-1条边
2.1在E选择最短边e=(uv)
2.2如果T中u,v不连通,将e并入TE
2.3E=E-{e}
3输出T=(U,TE)
Prim算法
1初始化U={},U1=V,TE={}
2选择一个顶点vi∈U1;
3U=U∪{vi}U1=U1-{vi}
4循环直到U1为空在
4.1在边集{(uv)︱u∈U,v∈U1}中选择最短边ek=(ukvk)
4.2U=U∪{vk}U1=U1-{vk}TE=TE∪{ek}
5输出T=(U,TE)
4.回溯法
回溯法过程
◎回溯法按照深度优先搜索解空间树,过程如下:
1根结点成为一个活结点,并成为当前扩展结点,
2循环直至当前扩展结点为叶子且不会成为死结点
2.1如果当前扩展结点不可能产生可行解否则
2.2.1当前扩展结点成为死结点.
2.2.2回溯到一个活结点,该点成为当前扩展结点
2.2否则,按深度优先,移到当前扩展结点的子结点,该子结点成为一个活结点,并成为当前扩展结点.
3由根到叶子路径上各边组成的向量,是一个可行解.
Q
Q
Q
Q
Q
Q
Q
Q
例18皇后问题1850年,数学家高斯提出了一个有趣的问题:
怎样将8个皇后放在国际象棋的棋盘上,使她们互相不能攻击.
基本概念
解的形式和解空间:
X=(x1,x2,…,xn)
可行解:
解空间中满足约束条件的解
算法如下:
Eightqueen()
{x[1]=1;k=1;
do{if(x[k]<=8)
{die=0
for(i=1;i else{if(x[i]=x[k]){die=1;break} if(x[k]-x[i])=abs(k-i)){die=1;break} } if(die=1)x[k]=x[k]+1else{k=k+1;x[k]=1} } {x[k]=1;k=k-1;x[k]=x[k]+1;} }while(k<=8andk>0) if(k>8)outputx[i]..x[8]elseoutputnosolve } 例20/1背包问题 解空间树 例3图的着色问题 已知一个图G=(V,E)和m种颜色,使用这m种颜色对图G的结点着色,使得图中任何相邻的两个结点具有不同的颜色.该问题称为m着色问题. 解的形式X=(x1,x2,…xn)xi=1,2,..,m 约束条件cij=1时xi≠xj 图的着色问题回溯法算法 mcoloring() {x[1]=1;k=1; do{if(x[k]<=m) {die=0 for(i=1;i if(x[i]=x[k]andc[i][k]=1){die=1;break} if(die=1)x[k]=x[k]+1else{k=k+1;x[k]=1} } else{x[k]=1;k=k-1;x[k]=x[k]+1;} }while(k<=nandk>0) if(k>n)outputx[i]..x[n]elseoutputnosolve } 5.分支限界问题 回溯法从根结点出发,按深度优先遍历解空间树,在遍历过程中,利用约束条件,目标函数等剪枝函数进行剪枝. 分支限界法适合用于解决最优化问题,它按广度优先遍历解空间树,在遍历过程中,利用约束条件,目标函数等剪枝函数进行剪枝.此外,分支限界法还根据目标函数,动态的确定已处理的每个结点可能的极值范围(上界,下界),选择最优方向优先搜索,加快找到问题的解. 例题10/1背包问题 给定n个重量为(w1,w2,…,wn),价值为(v1,v2,…vn)的物品和一个容量为C的背包,要求选择部分物品装进背包,使得背包内物品价值总和最大. 1)问题的解(x1,x2,…xn)xi=0,1 2)约束条件∑xiwi<=C 3)目标函数∑xivi达到最大 算法: 根据限界函数计算上界ub,估计下界down 将w=0,v=0,k=0,ub,x[1: n]=0存入PT while(PT不为空) {从PT中取出ub值最大元素 k=k+1;x[k]=0;ub=v+(C-w)*v[k+1]/w[k+1]; if(ub>=down)将w,v,k,ub,x[1: n]存入PT x[k]=1;w=w+wk;v=v+vk; ub=v+(C-w)*v[k+1]/w[k+1]; if(w<=Candub>=down) 将w,v,k,ub,x[1: n]存入PT if(k=n) if(ub是PT中最大值)输出解,结束 else{down=ub;删除PT中ub<=down元素} } ⏹分支限界法的一般过程(极大值问题) 1根据限界函数确定目标函数的界[down,up] 2待处理结点表PT初始化;PT={根结点} 3循环直到某个叶子结点的目标函数值在PT中最大 3.1取PT中目标函数值最大的结点y 3.2对y结点的每个子结点x 3.2.1估计x的目标函数值value 3.2.2如果value>down,将x加入PT中. 3.2.3如果x是叶子且x的value在PT中最大,则输出x对应的解,算法结束 3.2.4如果x是叶子且x的value在PT中不是最大,修改下界down=value,删除PT所有小于value值的结点 ⏹几个关键问题 1确定合适的限界函数 估算每个结点的目标函数值 2组织待处理结点PT表 方便选取PT表中极值结点.堆方式;优先队列 3确定最优解中各个分量 保留PT表中每个结点的路径 算法: 根据限界函数计算下界lb,估计上界up 将k=0,v=0,lb,x[1: n]=0存入PT while(PT不为空) {从PT中取出lb值最小元素 k=k+1; for(i=1;i<=n;i++) {x[k]=i;die=0;计算lb for(j=1;j if(x[j]=x[k]){die=1;break;} if(die=0andlb {v=v+c[k][x[k]];将k,v,lb,x[1: n]存入PT} } if(k=n) if(lb是PT中最小值)输出解,结束 else{up=lb;删除PT中lb>=up元素} }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 期末 复习