AI产品经理必修——揭开算法的面纱(贪心算法)

去年“新智元”有一篇报道《清华毕业计算机教授遭持枪劫车,靠“贪心算法”追回秒杀美国警察》,整个故事像看微小说一样,可对于核心问题“贪心算法”是什么并没有说清楚。于是就有了下面的内容。

什么是贪心算法

贪心的意思在于在作出选择时,每次都要选择对自身最为有利的结果,保证自身利益的最大化。贪心算法就是利用这种贪心思想而得出一种算法。

贪心算法可以简单描述为:大事化小,小事化了。对于一个较大的问题,通过找到与子问题的重叠,把复杂的问题划分为多个小问题。并且对于每个子问题的解进行选择,找出最优值,进行处理,再找出最优值,再处理。也就是说贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望得到结果是最好或最优的算法。

贪心算法在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。

贪心算法基本思路

步骤一:建立数学模型来描述问题

步骤二:把求解的问题分成若干个子问题

步骤三:对每个子问题求解,得到子问题的局部最优解

步骤四:把子问题的解局部最优解合成原来问题的一个解

贪心算法的选择

所谓贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,换句话说,当考虑做何种选择的时候,我们只考虑对当前问题最佳的选择而不考虑子问题的结果。

贪心算法以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。

我们下面通过示例来看一下贪心算法如何选择。

贪心算法示例

看一下《算法导论》中的经典例题:活动选择问题

有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举行。(标红的是我们利用贪心算法求出的结果1、4、8、11)

第一步:分析题目:

目标函数count(n)活动次数最多

约束条件是下一个活动开始时间大于或等于上一个活动开始时间s[i]>=f[j]

第二步:选择解题思路:

(1)每次选择开始时间最早的活动

(2)每次选择持续时间最短的活动

(3)每次选取结束时间最早的活动

第三步:证明上面哪种思路可以应用于本题:

为了方便,我们用不同颜色的线条代表每个活动,线条的长度就是活动所占据的时间段,蓝色的线条表示我们已经选择的活动;红色的线条表示我们没有选择的活动。

1)如果我们每次都选择开始时间最早的活动,不能得到最优解:

证明(反证法):

例如我们选择了10号活动(开始时间2点,结束时间13点)

2号活动待选择(开始时间3点,结束时间5点)

则会出现上图所示的情况,这显然违背了约束条件

2)如果我们每次都选择持续时间最短的活动,不能得到最优解:

证明(反证法):

例如我们选择了2号活动(开始时间3点,结束时间5点)

1号活动待选择(开始时间1点,结束时间4点)

则会出现上图所示的情况,这显然也违背了约束条件

3)如果我们每次都选取结束时间最早的活动,能够得到最优解(采用的贪心策略):

那么怎么证明贪心算法是对的呢?要证明一个算法是错的非常简单,要证明是对的却非常的难,对于贪心算法的证明,一是使用归纳法,二是采用反证法。像上面两种策略,我们实际上就用到了反证法。

回到策略本身,按这种方法选择相容活动,能够为未安排的活动留下尽可能多的时间。

第四步:选好策略,那我们就来按照贪心算法的基本思路总结一下:

步骤一:数学模型是目标函数count(n)最大,约束条件是s[i]>=f[j]

步骤二:求解哪个活动结束时间最早(本题目显然是活动1)

步骤三:求解哪个动开始时间s[i]大于上一个活动结束时间f[j]

步骤四:把步骤三求出的活动依次取出,作为我们选取的活动

上代码

这段代码的含义是:

定义活动号n,活动开始时间、结束时间Type s[],Type f[],布尔逻辑判断A[]

定义进入算法的活动序号,最终选取的活动序号i,j

初始活动i=1,由于1号活动结束时间,所以选取j=1

从2号活动开始进入运算,具体运算规则:

判断条件:活动开始时间(i)>上一个活动结束时间(j)

A[]为true,j选中

A[]为false,j不选择

i自增1位,继续判断,直至i=11

上图直观展示了算法的整个运行过程。

贪心算法应用

贪心算法应用非常广泛,特别电脑游戏AI或者一些推荐。

以经典的跳跃游戏为例:

1、题目描述

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断是否能够到达最后一个位置。

2、问题分析

先转化为数学模型:给定一个数组,数组中每个位置的数字代表当前位置i能够向前跳跃num[i]的距离,然后判断是否能够从第一个位置跳到最后一个位置。

这道题的难点就在于每次跳多远的距离算合适呢?如果从i的位置能跳num[i]距离最远能到达j的位置,那么这中间的任何一个位置我们都能跳到,但我们具体是跳到i--j之间的哪个位置才是真正合适的位置?

利用贪心的思想我们的目的是判断最后能否跳到最后一个位置,其实就是只要能保证在i--j之间跳到一个能够在下一次跳的更远的距离,那么这个位置就是最合适的位置。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342