绪论
图的部分自最短路算法的三类算法介绍完毕之后就告一段落了,我们往回看Lecture 18。Lecture 18介绍的是算法思想中重要的一种思想——贪心思想,我当时认为先把图论部分的知识点介绍完全再介绍其他的知识点比较好,但是这个思想在Prim算法,Dijkstra算法(甚至于A*算法)等都有用到,不过课件上对贪心算法的概念介绍的不多,例子又比较抽象(没有直接体现出一个阶段到另一个阶段的扩展),再学习完上述的算法之后体会贪心思想我觉得也是很好的(个人觉得)。
Definition
关于贪心算法首先我们要理解贪心这个词的意义,比如“贪心”是什么?在什么地方“贪心”?为什么要“贪心”?
我们从字面意思上理解“贪心”认为是想要尽可能地获得最优的或者最多的东西,事实上我们现在学习的几乎所有算法都是为了求解某个角度上最优或最多的东西,这样解释“贪心”显然并不准确。
事实上贪心算法的“贪心”从算法表现出来的结果而言更倾向于“短视”:贪心算法适用的问题的任何一个解的求解过程可以分解成若干个阶段,将最后一个解看作一个集合,每个阶段求出这个集合的一个子集,每个阶段求解出来的子集之间可能是前后扩展的关系(Prim算法,Dijkstra算法),也可能是不存在关系的(子阶段对应的子集是最后解的划分而不是前一个阶段子集为后一个阶段子集的子集)。
贪心算法在每个阶段扩展到下一阶段的过程或者处理某个阶段时的问题总是专注于一个“特别的最优解”,并且只扩展该解到下一个阶段的可能,放弃其他所有可能的扩展。
因为不从整体考虑,只对于某个阶段(或者进行到当前的阶段)计算局部的最优解,会有一种不考虑后面影响的感觉,所以我称贪心算法的“贪心”为“短视”,从另一个角度考虑,贪心算法在一个阶段到下一个阶段扩展时放弃了其他所有的可能,只考虑一个“最优解”的情况和扩展,节省了对其他可能扩展花费的时间(这往往能节省很多的时间),又希望这个局部的最优解能够尽可能的接近实际的最优解,这种想法不能说不是“贪心”的(虽然我个人觉得这个greedy并不是我们一般认为的贪婪的意思)。
贪心算法一般按如下步骤进行(括号外是百度百科的内容,括号内是我个人的补充):
1.建立数学模型来描述问题。
2.把求解的问题分成若干个子问题(把求解的问题划分成若干个阶段)。
3.对每个子问题求解,得到子问题的局部最优解(对每个阶段局部最优的解扩展,扩展到下一个阶段,在下一个仅讨论最优解扩展出来的可能)。
4.把子问题的解局部最优解合成原来解问题的一个解(扩展到最后一个阶段得到最优解)。
例如我们的Prim算法,第k个阶段的问题就是求解包含初始点结点个数为k的最小生成树,然后扩展到结点个数为k+1的最小生成树(如果实际推理过Prim算法,会更倾向于从一个阶段下一个阶段扩展的说法,而不是简单的合并

本文介绍了贪心算法的概念,通过定义、Coin changing、Interval scheduling等问题阐述其思想。贪心算法在每个阶段追求局部最优解,以期望接近全局最优。文章通过一系列经典问题展示贪心算法的应用,如区间调度、区间划分等,并分析了如何确定贪心策略。
最低0.47元/天 解锁文章
8529

被折叠的 条评论
为什么被折叠?



