算法导论第十六章——贪心算法

求解最优化问题要经过一系列步骤,每个步骤中有多种选择,有时使用动态规划来求解会十分复杂,此时可以使用更高效更简单的算法,如贪心算法
贪心算法总是在每一步做出局部最优的选择,寄希望与这样的选择能够达到全局最优解。
贪心算法并不能保证得到最优解,但部分问题使用贪心策略足以达到最优解。

1. 活动选择问题

我们的第一个例子是一个调度竞争共享资源的多个活动的问题,目标是选出一个最大的,互相兼容的活动集合。
假定有一个n个活动的集合S={\{a1,a2..an\}},这些活动使用同一个资源,而这些资源在某个时刻只能供一个活动使用。每个活动a_i都有开始时间s_i和结束时间f_i,如果被选中,任务占据该资源[s_i,fi)期间。如果两个活动的区间不重叠,则称他们是兼容的。在活动选择问题中,我们希望选择出一个最大兼容活动集。
我们可以通过动态规划算法将这个问题分解为两个子问题,然后将两个子问题的最优解合并为原问题的解。

活动选择问题的最优子结构

S_{ij}表示在a_i结束之后开始,且在a_j开始之前结束的那些活动集合。我们希望求S_{ij}的最大兼容子集。进一步,我们假定A_{ij}就是这样一个子集,且包含活动k。如此我们便得到两个子问题,寻找S_{ik}中的兼容活动以及寻找S_{kj}中的兼容活动。即我们可得到A_{ij}=A_{ik}∪{\{a_k\}}∪A_{k,j}
我们用c[i,j]表示集合S_{ij}的大小,则可得到
c[i,j]=c[i,k]+c[k,j]+1

贪心选择

事实上,对于活动选择问题,我们无需考虑所有子选择,只需要考虑一个选择:贪心选择
对于活动选择问题,如何贪心选择?直觉上,我们应该选择这样一个活动,选出它后剩下的资源应该被尽可能多的其他任务利用。现在考虑可选的活动,其中必然有一个最先结束,我们应该选择S中最早结束的活动,因为剩下的资源可供他之后尽可能多的活动使用。
现在的问题是,我们的策略是正确的吗?下面的定理证明了这一点。

考虑任意非空子问题S_k,令a_mS_k中最早结束的活动,则a_mS_k的最大兼容活动子集中。

证明
A_kS_k中的一个最大兼容活动子集,且a_jA_k中结束时间最早的活动。若a_j=a_m,则已证明a_mS_k的最大兼容活动子集中。否则,令集合A_{k}^{'} = A_{k}-\{a_j\}∪\{a_m\}
A_{k}^{'}中的活动都是不相交的,而a_m比a_j结束更早,因此得出A_{k}^{'}也是Sk的一个最大兼容活动子集,且包含a_m

由此得到代码如下


伪码描述

2.贪心算法原理

本节探究贪心算法的一般性质。
在上一节设计贪心算法的过程比通常繁琐一些,我们当时经过了如下步骤:

  1. 设计问题的最优子结构
  2. 设计一个递归算法
  3. 证明如果我们做出了贪心选择,则只剩下一个子问题。
  4. 证明贪心算法是有效的。
  5. 设计算法实现贪心策略。

一般的,我们可以根据如下步骤设计贪心算法:

  1. 将最优化问题转化为:对其做出一次选择后,只剩下一个子问题需要求解
  2. 证明做出贪心选择后,原问题总是存在最优解。
  3. 证明做出贪心选择后,剩余的子问题满足性质:即最优解与贪心选择组合即可得到原问题的最优解。

问题的关键在于贪心选择性质最优子结构

贪心选择性质
当进行选择时,我们直接做出在当前问题中看来最优的选择,而不必考虑子问题的解。
我们必须证明每个步骤做出贪心选择能生成全局最优解,这种证明通常首先考察某个子问题的最优解,然后用贪心选择替换某个其他选择来修改此解,从而得到一个相似但更小的子问题。

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

推荐阅读更多精彩内容

  • 贪心算法也是用来解决最优解问题 它在每一步都做出当时看起来最佳的选择,未必有动态规划严谨,但是在某些问题中,确实可...
    琦思妙想君阅读 966评论 0 0
  • 1、前言 求解最优化问题的算法通常会经历一系列步骤,在每个步骤都会面临多种选择,而许多最优化问题并不需要计算每个选...
    某昆阅读 1,606评论 1 5
  • 目录 1.贪心算法步骤 2.两个关键要素 3.两种背包问题3.1 0-1背包问题(适用于动态规划,不满足贪心选择性...
    王侦阅读 4,935评论 2 3
  • 基本认识 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加...
    _LanXiu阅读 1,417评论 0 24
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,521评论 16 22