浅谈贪心策略的特点与在信息学竞赛中的应用Word文档下载推荐.docx
《浅谈贪心策略的特点与在信息学竞赛中的应用Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《浅谈贪心策略的特点与在信息学竞赛中的应用Word文档下载推荐.docx(9页珍藏版)》请在冰豆网上搜索。
二、贪心算法的特点
通过上文的介绍,可能有人会问:
贪心算法有什么样的特点呢?
我认为,适用于贪心算法解决的问题应具有以下2个特点:
1、贪心选择性质:
所谓贪心选择性质是指应用同一规则f,将原问题变为一个相似的、但规模更小的子问题、而后的每一步都是当前看似最佳的选择。
这种选择依赖于已做出的选择,但不依赖于未做出的选择。
从全局来看,运用贪心策略解决的问题在程序的运行过程中无回溯过程。
关于贪心选择性质,读者可在后文给出的贪心策略状态空间图中得到深刻地体会。
2、局部最优解:
我们通过特点2向大家介绍了贪心策略的数学描述。
由于运用贪心策略解题在每一次都取得了最优解,但能够保证局部最优解得不一定是贪心算法。
如大家所熟悉得动态规划算法就可以满足局部最优解,在广度优先搜索(BFS)中的解题过程亦可以满足局部最优解。
在遇到具体问题时,许多选手往往分不清哪些题该用贪心策略求解,哪些题该用动态规划法求解。
在此,我们对两种解题策略进行比较。
图一
三、贪心策略的理论基础--矩阵胚
正如前文所说的那样,贪心策略是最接近人类认知思维的一种解题策略。
但是,越是显而易见的方法往往越难以证明。
下面我们就来介绍贪心策略的理论--矩阵胚。
"
矩阵胚"
理论是一种能够确定贪心策略何时能够产生最优解的理论,虽然这套理论还很不完善,但在求解最优化问题时发挥着越来越重要的作用。
【定义3】矩阵胚是一个序对M=[S,I],其中S是一个有序非空集合,I是S的一个非空子集,成为S的一个独立子集。
如果M是一个N×
M的矩阵的话,即
若M是无向图G的矩阵胚的话,则S为图的边集,I是所有构成森林的一组边的子集。
如果对S的每一个元素X(X∈S)赋予一个正的权值W(X),则称矩阵胚M=(S,I)为一个加权矩阵胚。
适宜于用贪心策略来求解的许多问题都可以归结为在加权矩阵胚中找一个具有最大权值的独立子集的问题,即给定一个加权矩阵胚,M=(S,I),若能找出一个独立且具有最大可能权值的子集A,且A不被M中比它更大的独立子集所包含,那么A为最优子集,也是一个最大的独立子集。
我们认为,针对绝大多数的信息学问题,只要它具备了"
的结构,便可用贪心策略求解。
矩阵胚理论对于我们判断贪心策略是否适用于某一复杂问题是十分有效的。
四、几种典型的贪心算法
贪心策略在图论中有着极其重要的应用。
诸如Kruskal、Prim、Dijkstra等体现"
思想的图形算法更是广泛地应用于树与图的处理。
下面就分别来介绍Kruskal算法、Prim算法和Dijkstra算法。
Ⅰ、库鲁斯卡尔(Kruskal)算法
五、贪心策略的应用
在现实世界中,我们可以将问题分为两大类。
其中一类被称为P类问题,它存在有效算法,可求得最优解;
另一类问题被称为NPC类问题,这类问题到目前为止人们尚未找到求得最优解的有效算法,这就需要每一位程序设计人员根据自己对题目的理解设计出求较优解的方法。
下面我们着重分析贪心策略在求解P类问题中的应用。
[例1]删数问题
试题描述键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按左右次序组成一个新的正整数。
对给定的N和S,寻找一种删数规则使得剩下得数字组成的新数最小。
试题背景此题出自NOI94
试题分析这是一道运用贪心策略求解的典型问题。
此题所需处理的数据从表面上看是一个整数。
其实,大家通过对此题得深入分析便知:
本题所给出的高精度正整数在具体做题时将它看作由若干个数字所组成的一串数,这是求解本题的一个重要突破。
这样便建立起了贪心策略的数学描述。
[例2]数列极差问题
试题描述在黑板上写了N个正整数作成的一个数列,进行如下操作:
每一次擦去其中的两个数a和b,然后在数列中加入一个数a×
b+1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的max,最小的为min,则该数列的极差定义为M=max-min。
编程任务:
对于给定的数列,编程计算出极差M。
试题背景这是1997年福建队选拔赛的一道题目。
试题分析当看到此题时,我们会发现求max与求min是两个相似的过程。
若我们把求解max与min的过程分开,着重探讨求max的问题。
下面我们以求max为例来讨论此题用贪心策略求解的合理性。
讨论:
假设经(N-3)次变换后得到3个数:
a,b,max'(max'≥a≥b),其中max'是(N-2)个数经(N-3)次f变换后所得的最大值,此时有两种求值方式,设其所求值分别为
,
,则有:
=(a×
b+1)×
max'+1,
max'+1)×
b+1 所以
-
=max'-b≥0若经(N-2)次变换后所得的3个数为:
m,a,b(m≥a≥b)且m不为(N-2)次变换后的最大值,即m<max'则此时所求得的最大值为:
b+1)×
m+1 此时
=(1+ab)(max'-m)>0 所以此时不为最优解。
所以若使第k(1≤k≤N-1)次变换后所得值最大,必使(k-1)次变换后所得值最大(符合贪心策略的特点2),在进行第k次变换时,只需取在进行(k-1)次变换后所得数列中的两最小数p,q施加f操作:
p←p×
q+1,q←∞即可(符合贪心策略特点1),因此此题可用贪心策略求解。
讨论完毕。
在求min时,我们只需在每次变换的数列中找到两个最大数p,q施加作用f:
q+1,q←-∞即可.原理同上。
这是一道两次运用贪心策略解决的一道问题,它要求选手有较高的数学推理能力。
[例3]最优乘车问题
试题描述 H城是一个旅游胜地,每年都有成千上万的人前来观光.为方便游客,巴士公司在各个旅游景点及宾馆、饭店等地都设置了巴士站,并开通了一些单向巴士线路。
每条单向巴士线路从某个巴士站出发,依次途径若干个巴士站,最终到达终点巴士站。
阿昌最近到H城旅游,住在CUP饭店。
他很想去S公园游玩。
听人说,从CUP饭店到S公园可能有也可能没有直通巴士。
如果没有,就要换乘不同线路的单向巴士,还有可能无法乘巴士到达。
现在用整数1,2,...,n给H城的所有巴士站编号,约定CUP饭店的巴士站编号为1,S公园巴士站的编号为N。
写一个程序,帮助阿昌寻找一个最优乘车方案,使他在从CUP饭店到S公园的过程中换车的次数最少。
试题背景出自NOI97
试题分析此题看上去很像一道搜索问题。
在搜索问题中,我们所求的使经过车站数最少的方案,而本题所求解的使换车次数最少的方案。
这两种情况的解是否完全相同呢?
我们来看一个实例:
图5
如图5所示:
共有5个车站(分别为a、b、c、d、e), 共有3条巴士线(线路A:
a→d;
线路B:
a→b→c→e;
线路C:
d→e)。
此时要使换车次数最少,应乘坐线路B的巴士,路线为:
a→b→c→e,换车次数为0;
要使途经车站数最少,乘坐线路应为a→d→e,换车次数为1。
所以说使换车次数最少的路线和使途经车站数最少的方案不一定相同。
这使不能用搜索发求解此问题的原因之一。
原因之二,来自对数学模型的分析。
我们根据题中所给数据来建立一个图后会发现该图中存在大量的环,因而不适合用搜索法求解。
题目分析到这里,我们可以发现此题与NOI93的求最长路径问题有相似之处。
其实,此题完全可以套用上文所提到的Dijkstra算法来求解。
以上三道题只是使用了单一的贪心策略来求解的。
而从近几年的信息学奥林匹克竞赛的命题方向上看,题目更加灵活,同时测试数据较大,规定的出解时间较短。
在一些问题中,我们采用贪心策略对问题化简,从而使程序具有更高的效率。
[例4]最佳浏览路线问题
试题描述 某旅游区的街道成网格状(见图),其中东西向的街道都是旅游街,南北向的街道都是林荫道。
由于游客众多,旅游街被规定为单行道。
游客在旅游街上只能从西向东走,在林荫道上既可以由南向北走,也可以从北向南走。
阿隆想到这个旅游区游玩。
他的好友阿福给了他一些建议,用分值表示所有旅游街相邻两个路口之间的道路值得浏览得程度,分值从-100到100的整数,所有林荫道不打分。
所有分值不可能全是负值。
例如下图是被打过分的某旅游区的街道图:
阿隆可以从任一路口开始浏览,在任一路口结束浏览。
请你写一个程序,帮助阿隆寻找一条最佳的浏览路线,使得这条路线的所有分值总和最大。
试题背景 这道题同样出自NOI97,'97国际大学生程序设计竞赛的第二题(吉尔的又一个骑车问题)与本题是属于本质相同的题目。
试题分析由于林荫道不打分,也就是说,无论游客在林荫道中怎么走,都不会影响得分。
因题可知,若游客需经过某一列的旅游街,则他一定要经过这一列的M条旅游街中分值最大的一条,才会使他所经路线的总分值最大。
这是一种贪心策略。
贪心策略的目的是降维,使题目所给出的一个矩阵便为一个数列。
下一步便是如何对这个数列进行处理。
在这一步,很多人用动态规划法求解,这种算法的时间复杂度为O(n2),当林荫道较多时,效率明显下降。
其实在这一步我们同样可以采用贪心法求解。
这时的时间复杂度为O(n)。
六、总结
通过对贪心策略的分析,大家可以看出:
贪心策略作为一种高效算法,广泛地应用与信息学奥林匹克竞赛中。
即使表面上看起来与贪心策略关系甚微的题目,运用贪心算法也可使程序的运行效率大大提高。
因此,深刻理解贪心策略的数学模型、特点、理论基础、尤其是运用其基本思想解决具体问题是十分重要的。
希望本文能给参赛选手以一定的启发。
【附录】
【参考书目】
1 《实用算法的分析与程序设计》
吴文虎,王健德编著,电子工业出版社,ISBN7-5053-4402-1
2 《计算机算法导引》
卢开澄编著,清华大学出版社,ISBN7-302-02277-1
3、《国际大学生程序设计竞赛试题解析》
王建德,柴晓路编著,复旦大学出饭社ISBN7-309-02141-X/T·
210