算法设计和分析课程论文参考模板Word格式.docx
《算法设计和分析课程论文参考模板Word格式.docx》由会员分享,可在线阅读,更多相关《算法设计和分析课程论文参考模板Word格式.docx(8页珍藏版)》请在冰豆网上搜索。
15-11
10-6
5-0
论证
思路是否清晰;
逻辑是否严密;
结构是否严谨;
研究方法是否得当;
论证是否充分。
文献
文献资料是否翔实;
是否具有代表性。
规范
文字表达是否准确、流畅;
是否符合学术道德规范。
能力
是否运用了本门课程的有关理论知识;
是否体现了科学研究能力。
评阅教师签名:
年月日
总分:
贪心法的应用
摘要:
在解决问题的过程中,通过逐步获得最优解从而获得整体最优解的策略就是贪心策略,在已经学会在解的范围可以确定的情况下,可以采用枚举或递归策略,一一比较它们最后找到最优解;
但当解的范围非常大时,枚举和递归的效率会非常低。
这时就可以考虑用贪心策略。
贪心算法没有固定的框架,算法设计的关键是贪心策略的选择,贪心策略要具有无后向性,即某阶段状态一旦确定以后,不受这个状态以后的策略的影响。
当一个问题有好几种解决方法时,贪心法应该是最好的选择之一。
本文讲述了贪心算法的含义、基本思路以及贪心算法在实例中的应用。
关键词:
贪心算法;
删数问题;
最小生成树
一、引言
在平时解决问题的过程中,当一个问题就有无后向性和贪心选择性质时,贪心算法通常会给出一个简单、直观和高效的解法。
贪心算法通过一系列的选择来得到一个问题的解。
它所做的每一个选择都是当前状态下就有某种意义的最好选择,即贪心选择;
并且每次贪心选择都能将问题化解为一个更小的与原问题具有相同形式的子问题。
尽管贪心算法对于很多问题不能总是产生整体最优解,但对于最短路径、最小生成树问题,以及删数问题等却可以获得整体最优解,而且所给出的算法一般比动态规划算法更为简单、直观和高效。
二、贪心算法的含义和特点
(一)贪心算法的含义
贪心算法是通过一系列的选择来得到问题解的过程。
贪心算法是一种能够得到某种度量意义下的最优解的分级处理方法,它总是做出在当前看来是最有的选择,也就是说贪心策略并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解算法。
(二)贪心算法的特点
1、从全局来看,运用贪心策略解决的问题在程序运行过程中无回溯过程,后面的每一步都是当前看似最佳的选择,这种选择依赖已作出的选择,但并不依赖未作出的选择。
2、不能保证最后求出的解是最佳的。
由于贪心策略总是采用从局部看来是最优的选择,并不从整体上加以考虑。
另外贪心算法只能用来求某些最大或最小解的问题,因为当遇到求解权值最小路径等问题采用贪心算法得到的结果并不是最佳。
二、贪心算法在实例中的应用
(一)删数问题
给定n位正整数a,去掉其中任意k≤n个数字后,剩下的数字按原次序排列组成一个新的正整数。
对于给定的n位正整数a和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案。
1、算法原理
从最高位开始,依次向低位搜索,一旦遇到前一位(高数)的数大于当前位,则删去前一位,直到删除k个数,如果到达末尾还没有删除k个,则说明现在这个数已经是从小到大排列了,则从最低位开始删除要求的位数。
2、过程分析
n1="1 2 4 3 5 8 6 3"k=3
4比3大删除 "1 2 3 5 8 6 3"
8比6大删除 "1 2 4 3 5 6 3"
6比3大删除"1 2 4 3 5 8 3"
只看这个实例,有可能归纳不出正确的算法,看下一个实例,再进一步解释。
n2="2 3 1 1 8 3"k=3
3比1大删除"2 1 1 8 3"
2比1大删除" 1 1 8 3"
8比3大删除" 1 1 3"
由实例n1,相邻数字只需从前向后比较;
而从实例n2中可以看出当第i位与第i+1位比较,若删除第i位后,必须向前考虑第i-1位与第i+1位进行比较,才能保真结果的真确性。
(二)最小生成树
设G=(V,E)是一个无向连通带权图,即一个网络。
E的每条边(v,w)的权为c[v][w]。
如果G的一个子图G’是一棵包含G的所有顶点的树,则称G’为G的生成树。
生成树的各边的权的总和称为该生成树的耗费。
在G的所有生成树中,耗费最小的生成树称为G的最小(优)生成树。
(1)Prim算法
基本思想:
在保证连通的前提下依次选出权重较小的n–1条边。
G=(V,E)为无向连通带权图,令V={1,2,…,n}。
设置一个集合S,初始化S={1},T=Φ。
贪心策略:
如果V–S中的顶点j与S中的某个点i连接且(i,j)是E中的权重最小的边,于是就选择j(将j加入S),并将(i,j)加入T中。
重复执行贪心策略,直至V–S为空。
(2)Kruskal算法
在保证无回路的前提下依次选出权重较小的n–1条边。
贪心策略:
如果(i,j)是E中尚未被选中的边中权重最小的,并且(i,j)不会与已经选择的边构成回路,于是就选择(i,j)。
若边(i,j)的两个端点i和j属于同一个连通分支,则选择(i,j)会造成回路,反之则不会造成回路。
因此初始时将图的n个顶点看成n个孤立分支。
(3)两种算法的异同
两种算法不同之处在于,Prim算法是在在保证连通的前提下依次选出权重较小的n–1条边。
而Kruskal算法在保证无回路的前提下依次选出权重较小的n–1条边。
两种算法的相同之处在于都是在各自的前提条件下采取依次取出权值最小n-1条边的贪心策略。
2、分析过程
给定一个联通带权图如下:
初始时S={1},T=Φ;
第一次选择:
(1,3)权最小,S={1,3},T={(1,3)};
第二次选择:
(3,6)权最小,S={1,3,6},T={(1,3)(3,6)};
第三次选择:
(4,6)权最小,S={1,3,6,4},T={(1,3)(3,6)(6,4)};
第四次选择:
(2,3)权最小,S={1,3,6,4,2},T={(1,3)(3,6)(6,4)(2,3)};
第五次选择:
(2,5)权最小,S={1,3,6,4,2,5},T={(1,3)(3,6)(6,4)(2,3)(2,5)};
(2)Kruskal算法
给定一个联通带权图如下:
初始时为六个孤立的点,选择了1,于是1、3点合并为同一个集合;
选择了2,于是4、6点合并为同一个集合;
选择了3,于是2、5点合并为同一个集合;
选择了4,于是1、3、4、6点合并为同一个集合;
考察边5,因为1、4为同一集合,故被放弃;
选择了6,于是1、3、4、6、2、5点合并为同一个集合;
选择了1,于是1、3点合并为同一个集合;
已经选择边了n–1条边,算法结束。
结果如图所示:
3、算法设计
Prim(intn,Type**c){
intj=1;
s[j]=true;
//初始化将节点1放入s并初始化closest[]和lowcost[]
for(inti=2;
i<
=n;
i++)
{
closest[i]=1;
lowcost[i]=c[1][i];
s[i]=false;
}
for(inti=1;
n;
i++){//执行以下操作n-1次
min=inf;
for(intk=2;
k<
k++){
//依据lowcost[]找出与s最近的点j并放入S
if(lowcost[k]<
min&
&
!
s[k])
{min=lowcost[k];
j=k}
}
for(intk=2;
k++){//调整closest[]和lowcost[]
if(c[j][k]<
lowcost[k]&
{lowcost[k]=c[j][k];
closest[k]=j}
}
Kruskal(intn,**e){
Sort(e,w);
//将边按权重从小到大排序
initialize(n);
//初始时每个顶点为一个集合
k=1;
//k累计已选边的数目,
j=1;
//j为所选的边在e中的序号
while(k<
n)//选择n–1条边
{a=Find(e[j][u]);
b=Find(e[j][v]);
//找出第j条边两个端点所在的集合
if(a!
=b){t[k++]=j;
Union(a,b)}
//若不同,第j条边放入树中并合并这两个集合
j++}}//继续考察下一条边
4、Prim和kruskal算法两者的复杂性
Prim算法为两重循环,外层循环为n次,内层循环为O(n),因此其复杂性为O(n2)。
Kruskal算法中,设边数为e,则边排序的时间为O(e),确定边的时间为O(loge),所以整个时间复杂性为O(eloge)。
当e=Ω(n2)时,Kruskal算法要比Prim算法差;
当e=ο(n2)时,Kruskal算法比Prim算法好得多。
三、总结与展望
(一)总结
贪心算法是很常见的算法,贪心策略是最接近人的日常思维的一种解题策略,虽然它不能保证求得的最后解一定是最佳的,但是它可以为某些问题确定一个可行性范围。
贪心算法所作的选择依赖于以往所作过的选择,但决不依赖于将来的选择,这使得算法在编码和执行过程中都有一定的速度优势。
对于一个问题的最优解只能用穷举法得到时,用贪心算法是寻找问题最优解的较好算法。
对一个问题可以同时用几种方法解决,贪心算法并不是对所有的问题都能得到整体最优解或是最理想的近似解时,就需判断贪心性质的正确性了。
与回溯法、动态规划法等比较,它的适用区域相对狭窄许多。
总之,如果一个贪心解决方案存在,就可以使用它。
(二)展望
对于贪心算法的应用,如果某个问题具有贪心算法的贪心选择性质和最优子结构性质,那么,它就可以采用贪心策略进行分析,进而求解,贪心算法的应用举例不仅只有本论文中的那几个,他对于背包问题、最优装载问题、硬币找钱问题等都是十分方便有效的算法,贪心算法在科学计算和工程中的应用也越来越广泛,例如用贪心算法进行三角剖分的指纹匹配方法、贪心算法在竞赛中的应用、贪心算法在排课系统中的应用、贪心聚类算法及其在遥感图像分类和压缩中的应用等等,在未来出现的一些问题中,只要符合贪心算法的贪心策略性质,就可以用贪心算法求解,让贪心算法能够应用到更广更多的问题中去吧!
【参考文献】
[1]吕英国.任瑞征.钱宇华.算法设计与分析[M].北京:
清华大学出版社.
[2]URL
(注:
文档可能无法思考全面,请浏览后下载,供参考。
可复制、编制,期待你的好评与关注)