july算法8——贪心

1.简介、思路和特性

1.1 简介

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。

贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

1.2 基本要素(关于最优解)

  • 贪心选择
    指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终能得到问题的最优解。

  • 最优子结构
    当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。运用贪心策略在每一次转化时都取得了最优解。问题的最优子结构性质是该问题可用贪心算法或动态规划算法求解的关键特征。贪心算法的每一次操作都对结果产生直接影响,而动态规划则不是。贪心算法对每个子问题的解决方案都做出选择,不能回退;动态规划则会根据以前的选择结果对当前进行选择,有回退功能。

1.3 基本思路

贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行,根据某个优化测度,每一步都要确保能获得局部最优解。每一步只考虑一个数据,他的选取应该满足局部优化的条件。若下一个数据和部分最优解连在一起不再是可行解时,就不把该数据添加到部分解中,直到把所有数据枚举完,或者不能再添加算法停止。

1.4 实现过程

step1.建立数学模型来描述问题

step2.把求解的问题分成若干个子问题

step3.对每一子问题求解,得到子问题的局部最优解

step4.把子问题的解局部最优解合成原来解问题的一个解

2.实现要点

1.随着算法的进行,将积累起其它两个集合:一个包含已经被考虑过并被选出的候选对象,另一个包含已经被考虑过但被丢弃的候选对象。

2.有一个函数来检查一个候选对象的集合是否提供了问题的解答。该函数不考虑此时的解决方法是否最优。

3.还有一个函数检查是否一个候选对象的集合是可行的,也即是否可能往该集合上添加更多的候选对象以获得一个解。和上一个函数一样,此时不考虑解决方法的最优性。

4.选择函数可以指出哪一个剩余的候选对象最有希望构成问题的解。

5.最后,目标函数给出解的值。

6.为了解决问题,需要寻找一个构成解的候选对象集合,它可以优化目标函数,贪婪算法一步一步的进行。起初,算法选出的候选对象的集合为空。接下来的每一步中,根据选择函数,算法从剩余候选对象中选出最有希望构成解的对象。如果集合中加上该对象后不可行,那么该对象就被丢弃并不再考虑;否则就加到集合里。每一次都扩充集合,并检查该集合是否构成解。

3.经典问题分析

3.1 背包问题

  • 有一个背包,背包容量是M=80kg。有7个物品,物品不可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
  • 物品信息
    A(8KG/15$), B(35KG/40$), C(16KG/50$)
    D(50KG/40$), E(40KG/35$), F(12KG/40$)
    G(25KG/30$)
  • 根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?
  • 选择:C(16KG/50$) ,F(12KG/40$),B(35KG/40$)
  • 总计:63KG/130$
  • 反例:把B换成A(8KG/15$)和E(40KG/35$)能装76KG/140$。

思考:

  • 每次挑选所占重量最小的物品装入是否能得到最优解?
  • 选择:A(8KG/15$),F(12KG/40$),C(16KG/50$),G(25KG/30$)
  • 总计:61KG/138$
  • 反例:参考第一个方法

思考:

  • 每次选取单位重量价值最大的物品呢?
  • 选择:A(8KG/15$),F(12KG/40$),C(16KG/50$),G(25KG/30$)
  • 总计:66KG/135$
  • 反例:参考第一个方法

结论:贪心法解决不了,必须依靠动态规划。

3.2 最小生成树的Prim算法

输入:一个加权连通图,其中顶点集合为V,边集合为E。

初始化:Vnew= {x},其中x为集合V中的任一节点(起始点),Enew= {},为空。

重复以下操作(while循环)直到Vnew= V:
1)在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
2)将v加入集合Vnew中,将<u, v>边加入集合Enew中。

输出:使用集合Vnew和Enew来描述所得到的最小生成树。

3.3 跳跃游戏

  • 跳跃游戏:给出一个非负整数数组,你最初定位在数组的第一个位置。数组中的每个元素代表你在那个位置可以跳跃的最大长度。判断你是否能到达数组的最后一个位置。
    A = [3,2,1,0,4],返回false。
    思路:从终点前一点倒推,如果该点能到终点,剩下的问题就是从出发点能不能到该点

3.4 加油站

  • 加油站:在一条环路上有N 个加油站,其中第i个加油站有汽油gas[i],并且从第i个加油站前往第i+1个加油站需要消耗汽油cost[i]。你有一辆油箱容量无限大的汽车,现在要从某一个加油站出发绕环路一周,一开始油箱为空。求可环绕环路一周时出发的加油站的编号,若不存在环绕一周的方案,则返回-1。
  • 加油站:如何贪心
    其实题目里隐含了一个很重要的推论:如果在a[i]停车加满油仍然开不到a[j]的话,那么即使在a[i]不停,在a[i+ k]加满油也到不了a[j]。因为即使a[i]停了,a[i+k]还是可以停的。

3.5 合并数字

  • 给出n个数,现在要将这n个数合并成一个数,每次只能选择两个数a,b合并,每次合并需要消耗a+b的能量,输出将这n个数合并成一个数后消耗的最小能量。

  • 给出一个序列[a, b, c, d]假如我们随机合并,假设任意两数和都大于已有的[a, b, c, d]
    合并a, b,[c, d, a+ b],消耗能量a+b
    合并d, a+b, [c, a+b+d],消耗能量a+b+d
    合并剩余数字,消耗能量a+b+c+d
    总消耗能量:a3 + b3 + c + d*2

  • 按从小到大的顺序合并
    合并a, b,[c, d, a+ b],消耗能量a+b
    合并c, d,[a+b, c+d],消耗能量c+d
    合并剩余数字,消耗能量a+b+c+d
    总消耗能量:a2+b2+c2+d2,比上一种方式的消耗要小。

3.6 单调递增的数字

  • 给一非负整数N, 找到小于等于N 的最大的单调递增数. (回想一下, 当且仅当每对相邻的数字x 和y 满足x <= y 时, 这个整数才是单调递增数)

  • 输入17699 -> 16999
    输入12468 -> 12468
    输入1000 -> 999
    输入2571001 -> 2569999

3.7 硬币排成线

  • 有n 个硬币排成一条线。两个参赛者轮流从右边依次拿走1 或2 个硬币,直到没有硬币为止。拿到最后一枚硬币的人获胜。

  • 思路:
    1)如果A要拿走最后一个硬币,必须迫使B在前一步拿的时候只有3个硬币,无论拿1个还是2个都是输。
    2)为了迫使B面对3个币的局面,上一轮必须迫使B面对6个币。。。

4.作业

4.1 买卖股票的最佳时机II

http://lintcode.com/zh-cn/problem/best-time-to-buy-and-sell-stock-ii/

  • 假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格。设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。

4.2 删除数字

http://lintcode.com/zh-cn/problem/delete-digits/

  • 给出一个字符串A, 表示一个n 位正整数, 删除其中k 位数字, 使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数。

  • 找到删除k 个数字之后的最小正整数。

参考

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

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 8,981评论 0 13
  • 贪心算法 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上...
    fredal阅读 9,223评论 3 52
  • 金箭冲霄光普照 银发飘扬催人泪 技艺勤练苦自知 黄昏落幕笑颜开
    孓情阅读 196评论 2 1
  • 就算生命不宠你,当请你别伤害自己 生活中,难免会遇到来自外界一些伤害,经历多了,自然有了提防,可是,我们往往不...
    MrsTJL阅读 163评论 0 0
  • 秋前的风,秋后的雨,秋来八月秋水长。风吹桂花香两岸,雨里秋江水流长。微凉的雨沉沉的夜,久久的独酌微苦的咖啡。借着室...
    媚眼儿飞阅读 244评论 0 1