贪心法:贪心法的应用例题

Posted I am a teacher!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心法:贪心法的应用例题相关的知识,希望对你有一定的参考价值。

还在浪费时间学贪心算法么?告诉你三个不需要学习贪心法的理由!


许多同学问我,

为什么课程中没有包含贪心算法,是否可以将贪心算法列入教学计划中? 

每一次我总是苦口婆心的规劝他们:


不要把时间浪费在贪心法上,学了根本没有用。 


为什么学习贪心法没有用?


这是一个值得讨论的问题。从我看来,有如下的三个方面的原因:


01

你想得到的贪心法,都是错的。 


首先我们需要知道,什么是贪心法。贪心法就好比挑老公时,只看他当前是不是腰缠万贯,不看他未来是否飞黄腾达。而其他的一些算法如动态规划,就好比你通过仔细的调查,发现虽然他现在是一个穷小子,但是是因为身为富二代的他不愿意接受父亲安排,自己出来独自闯荡,但是未来终究要继承千亿家业。


因此,贪心法可以说,是一种“目光短浅”的算法。一般在算法问题中,可以使用贪心算法的问题,其贪心策略往往都比较复杂,一般人是想不到的。而你容易想到的那些贪心策略,往往都是错的。


举一个实际的例子:求图中A点到B点的最短路径(点与点之间的距离是正整数)。


错误的贪心策略:从A出发,选择里A最近的点X,走到X,然后选择离X最近的点Y,走到Y...


正确的贪心策略:使用hashm ap distance = {}记录所有点到起点A的最短距离。一开始distance = ,代表目前只有A离起点的最短距离我们是确定知道的。然后在Distance中的点和非distance中的点中找到最小的一对X,Y,使得distance[X]+ (X到Y的直接连接距离)最小。其中X在distance里(已经被确认找到了最短距离),Y不在distance里(还没有被确认找到了最短距离)。然后将Y加入distance,并把距离设为distance[X]+ (X到Y的直接连接距离)。


怎么样,正确的贪心算法是不是非常复杂?


2

面试基本不会考 


贪心法的问题,面试基本不会考,因为等同于考智力题或者是背诵题。一个面试官想要自己凭空创造出一个面试题是使用贪心算法的,是非常困难的。(参见LintCode上的贪心算法的题目所占比例可知)。既然如此,如果面试中被问到了贪心算法,那么一定是一道经典的贪心问题,这类问题,我们可以称之为背诵题。因为大多数同学(除了智商很高,或者有算法竞赛经历的那一批),是不可能在面试的时候想得出解法的。


举几个例子:G as Station (http://www.lintcode.com /en/problem /gas-station/),这个题的做法是,从任意站点出发,走一圈,找到这一圈里剩余G as最少的那一站,然后从这一站出发走一圈,如果在这一站出发可以顺利走完全程,那么就可以行,否则就不可行。像这样的算法,是需要进行数学证明来证明其正确性的,面试官是没有能力出这样的面试题的。


从另外一个角度来说,贪心算法的题,对于程序的实现能力要求并不高,也违背了公司通过算法题面试主要是希望考察大家的程序实现能力这一点。所以面试官和公司也都不倾向于将贪心算法作为面试的算法问题。


3

没有通用性


二分法,动态规划算法,分治算法,搜索算法等等,很多的算法都是具有通用性的。也就是说,在题目A里,你用了 这个算法,在其他的题目B里,你可能完全可以用一样的算法和思路去解决。 


而贪心法,他不是“一个算法”,而是“一类算法”的统称。所以基本的情况就是,你在题目A里用了某个贪心算法解决了 这个问题,然后这个题中用到的贪心法,永远也找不到第二个题用类似的方法来解决。 每个题是完全独立的且没有任何联系,这对于学习者来说,无非是背诵越多知道的越多。无法触类旁通,无法举一反 三。因此将时间浪费在贪心法上的话,只能是吃力不讨好。


当然,面试中也不是说完全不可能碰到贪心算法,只是几率非常的小,你只需要“背诵”如下的一些几个题的贪心解法 就好了:


Tips


当然,面试中也不是说完全不可能碰到贪心算法,只是几率非常的小,你只需要“背诵”如下的一些几个题的贪心解法 就好了:  


(点击阅读原文)


相关精品文章阅读
  • 点击可阅读:

  • 《》

  • 《》


  • 《》


扫描二维码

获取秋季招聘第一手资料

本文仅代表个人观点

九章算法版权所有,未经准许,禁止转载,引用,改编,演绎。如需转载,请联系info@jiuzhang.com, 并保留九章算法相关版权信息。

以上是关于贪心法:贪心法的应用例题的主要内容,如果未能解决你的问题,请参考以下文章

贪心法(经典例题篇)

算法导论—分治法思想动态规划思想贪心思想

贪心思想

《挑战程序设计竞赛》学习笔记

贪心法讲解

# 国王游戏(贪心+大数乘除+微扰法证明)