算法基础第八期——贪心算法
Posted IEEEUESTC学生分会
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法基础第八期——贪心算法相关的知识,希望对你有一定的参考价值。
各位读者大家好,已经一周没有和大伙儿见面了。不知道你是否还记得上一期文章中那个悲催的小明。小明牺牲了无数脑细胞计算出了从自己家出发到“安吉拉贝比”家的最短路径,可是当他风急火燎地赶到时,却在门口迎头撞上了隔壁家老王,顿时狂风大作,电闪雷鸣,小明的悲桑化作瓢泼大雨倾盆而来。。。。。。为何小明这么悲剧呢,我总结为两点:(1)生不逢时,没有学到我们传授的单源最短路径求解大法;(2)小明太“贪心”,以至于他满脑子想的都是如何尽快赶到贝比的身旁,从而忽略了他思考这个问题本身所花去的时间。
小编小编,这是算法基础的文章吗?NO bb!往下看,哥哥不会豁你的。
本期介绍的主角其实跟我们的小明有太多相似之处。贪心算法和小明一样,最关心的是“局部”而往往忽略了“全局”。翻译成老师的话就是说:就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择,所以在许多问题中,贪心算法得出的最终结果往往不是全局最优解。
说了大半天传给我们的“贪心大法”解决不了问题呗!小编你逗我呢!做个题消消气,小编来问你。小明的悲剧是因为他不行么?显然不是的,作为电子科大的毕业生,小明是非常优秀的,他的失败只是他在某些问题上不行。说到底,只是一个适用不适用的问题。只要找到合适的,小明必然生龙活虎。我们的贪心大法亦是如此,在解决适用的问题(这类问题中,贪心算法的最终结果也是该问题的全局最优解),效率是非常高的。而贪心大法本身比较简单,所以学会在什么时候选择使用贪心大法甚至比学会贪心大法本身还要重要。既然这么重要,下面就一本正经地介绍一哈。
先说什么是贪心算法,贪心算法与许多其他算法不同,它本身没有固定的算法框架,其核心是贪心策略的选择和制定。不明白?例子1,上一期小博介绍的那个Dijkstra算法就是一个典型的算法,他只关心每一步选的点都使当前产生的总路径最短,而并不考虑最后的路径是否最短,只是这一问题的局部最优策略刚好能产生全局最优解,所以该算法能成功解决单源最短路径问题,在这个算法中,“使当前产生的路径最短”就是它的贪心策略。例子2,小孩拿到一包喜糖时,先吃最喜欢的,然后次喜欢的,在这个“吃糖算法”中,“每次吃剩下的糖果中自己最喜欢的糖”就是它的贪心策略。
好了,再来说说何时使用贪心算法。In fact,对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解呢?这个问题很难给予肯定的回答。记住一个贪心算法适用的大前提:局部最优策略能导致产生全局最优解。而且,从许多可以用贪心算法求解的问题中看到这类问题一般具有2个重要的性质:贪心选择性质和最优子结构性质:
1、贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。
对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。
2、最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。
举个例子,非常经典的背包问题:
给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?
上面说的是大前提,根据装物品的规则不同,分为了两类。(1)0-1背包问题:每种物品只能选择装入或不装入,而不能重复装入或装入部分物品(就是说物品不可分割),在这类问题中贪心算法是不适用的。(2)一般背包问题:物品可以部分装入(物品可分割),但不可重复装入,在这类问题中贪心算法是适用的。详情请垂询Internet。
小编,你的文章就这样写完了么?!我是看到封面才点进来的啊,你这和封面有半毛钱关系啊!欺骗!哼,赤裸裸的欺骗!放心,哥不是这样的人。下面给大家讲讲段子手小博的故事,让你们感受一下我大贪心大法的能量。
小博和小明一样优秀,而且都生活在美丽的电子科大。男多女少,是这一辈电子科大人的悲剧。所以小博决定到校外去寻找自己的另一半。通过调动自己广博的人脉,小博找到了11位候选人,朋友们把她们的照片传给了小博。在这个问题上,小博显然是机智的,他清楚的意识到,女人的照片是最会撒谎的,所以他决定,抛开长相。于是问题来了,小博长期活在清水寺,显然失去了同时hold住一排美女(至少小博的心目中希望她们是美女),所以不能像非诚的男嘉宾一样相亲。而他又是教研室的顶梁柱,不能花费太多的时间。所以他要在尽可能短的时间里和尽可能多的人约会。机智的小博是这样干的:(怪不得说是顶梁柱)
他将11个候选人编号,将她们提供的可约的时间记为Si(start 开始时间)和Fi(finish 结束时间),并记录在如下表格中:
然后他开始使用贪心大法,他的贪心策略是,每次选择结束时间最早的候选人。这样选择的意义是使剩下的时间能够尽可能多的安排候选人。然后他按照下面的过程开始选择:
图中每行相应于算法的一次迭代。阴影长条表示的是已准备约会的妹子,而空白长条表示的是当前正在检查时间是否和已选择对象冲突的候选人。就这样,最后他选择了1,4,8,11号妹子。虽然最后小博还是单身,但是从那之后他的室友告诉我他经常夜不归宿了。。。。。。
所以说,贪心大法好,约会不用恼;贪心大法秒,想要就能要……
最后有一点非常重要,要提醒大家:我们IEEE学生分会是一个正儿八经的学术组织!!!
By LJZhou
以上是关于算法基础第八期——贪心算法的主要内容,如果未能解决你的问题,请参考以下文章