入门贪心算法

贪心算法必知的知识点

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

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


基本思路

建立数学模型来描述问题;

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

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

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


案例分析

区间调度问题(interval shecduling)

问题描述:

这是《算法导论》上的例子,也是一个非常经典的问题。有n个需要在同一天使用同一个教室的活动a1,a2,…,an,教室同一时刻只能由一个活动使用。每个活动ai都有一个开始时间si和结束时间fi 。一旦被选择后,活动ai就占据半开时间区间[si,fi)。如果[si,fi]和[sj,fj]互不重叠,ai和aj两个活动就可以被安排在这一天。该问题就是要安排这些活动使得尽量多的活动能不冲突的举行。例如下图所示的活动集合S,其中各项活动按照结束时间单调递增排序。


几种贪心策略:

1.最早开始时间  

即用每个工作的开始时间进行升序排列,在保证不冲突的情况下,每次选择开始时间最小的情况。

2.最早结束时间

即用每个工作的结束时间进行升序排列,在保证不冲突的情况下(仍然考虑下一次的结束时间尽可能的小,且下一次的开始时间需要大于上一次的结束时间),每次选择结束时间最小的情况。(上图)

3.最少的运行时间

即每一个工作的结束时间减去开始时间得到运行时间,并且在不冲突的情况下,每次选择运行时间最短的工作。

4.最少冲突情况

即首先计算出当前的工作i,它的冲突个数为k[i],用k[i]进行上升排序。每次选择冲突最小的情况。

哪种策略下能得到最优解?答:最早结束时间

 证明方法:构造法(深灰表选中的工作,浅灰表示反例)

最早开始时间:假设最早开始时间的工作的运行时间很长,就不是最优。

最少运行时间:假设最少运行时间的的那个工作的结束时间很晚,就不是最优。

最少冲突:按上图的情况,首先会选到深灰,然后再选择旁边的浅灰,总共只有三个工作被选中,不是最优。

接着证明最早结束时间是最优的(可以用归纳法)

算法思想:

            1.先按完成时间上升排序

            2.选择当前的结束时间的最早的工作,判断该工作的开始时间是否满足大于上一个工作的结束时间

            3.如果不满足,则寻找下一个,满足的话重复2步,就选择,直到遍历完

总结而言就是:先排序,不冲突就选择加入A(被选择的job),冲突就丢弃并遍历下一个,最后返回A

实现:https://www.jianshu.com/p/89f8c67b2a04

钱币找零问题

问题描述:这个问题在我们的日常生活中就更加普遍了。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元,至少要用多少张纸币?用贪心算法的思想,很显然,每一步尽可能用面值大的纸币即可。在日常生活中我们自然而然也是这么做的。

贪心策略:

最大面值:在程序中已经事先将Value按照从大到小的顺序排好。

算法思想:1.首先将面值从大到小排序 2.计算K/V的取低值为n,记录n,并求得剩余的K,重复2过程,直到K的取值为零。

背包问题

问题描述:有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值V最大,但不能超过总容量M。


贪心策略:

最大价值:在保证不超重的情况下,每次选择价值最大的物品。

结果:DBFE  不是最优

最小容量:在保证不超重的情况下,每次选择重量最小的物品。

结果:FGBAE  不是最优

最大单位容量的价值:选择单位容量下,价值最大的那一个。

结果:FBGD   40+40+30+50

算法思想:

1.按单位容量的价值由大到小排序

2.如果不超重,就选择,超重就舍弃。

实现:https://www.jianshu.com/p/50f1d4e0555c

最小生成树问题

问题描述:

求一个连通无向图的最小生成树的代价(图边权值为正整数)。

Kruskal算法简述

假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至森林中只有一棵树,也即子图中含有 n-1条边为止。

模拟过程:https://www.jianshu.com/p/50f1d4e0555c

算法难点:

(1)边的选择要求从小到大选择,则开始显然要对边进行升序排序。

(2)选择的边是否需要,则从判断该边加入后是否构成环入手。

算法设计:

(1)对边升序排序

在此采用链式结构,通过插入排序完成。每一结点存放一条边的左右端点序号、权值及后继结点指针

(2)边的加入是否构成环

一开始假定各顶点分别为一组,其组号为端点序号。选择某边后,看其两个端点是否在同一组中,即所在组号是否相同,如果是,表示构成了环,则舍去。  如果两个端点所在的组不同,则表示可以加入,则将该边两端的组合并成同一组。

参考:https://www.jianshu.com/p/50f1d4e0555c

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

推荐阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,646评论 0 13
  • 1)这本书为什么值得看: Python语言描述,如果学的Python用这本书学数据结构更合适 2016年出版,内容...
    孙怀阔阅读 12,434评论 0 15
  • 贪心算法 当具有最优子结构性质的时候,可以使用动态规划算法也可以使用贪心算法 最优子结构性质、贪心选择性质 虽然贪...
    冰源阅读 1,010评论 0 0
  • 我常有对中国山水画情有独钟,而对人物画淡点的癖好,也或是对过往的人定胜天的勇气产生了忏悔,现越发的觉得人在自...
    僚片子阅读 316评论 0 0
  • 和孩子没法好好说话?跟孩子怎么说他都不听?来来来,学学这16句“神回复”,让亲子沟通不再成为问题! 1.直接描述问...
    江苏家学宝阅读 667评论 0 1