入門貪心算法

貪心算法必知的知識(shí)點(diǎn)

貪心算法(又稱貪婪算法)是指,在對(duì)問(wèn)題求解時(shí),總是做出在當(dāng)前看來(lái)是最好的選擇桑滩。也就是說(shuō),不從整體最優(yōu)上加以考慮允睹,他所做出的是在某種意義上的局部最優(yōu)解运准。

貪心算法不是對(duì)所有問(wèn)題都能得到整體最優(yōu)解,關(guān)鍵是貪心策略的選擇缭受,選擇的貪心策略必須具備無(wú)后效性胁澳,即某個(gè)狀態(tài)以前的過(guò)程不會(huì)影響以后的狀態(tài),只與當(dāng)前狀態(tài)有關(guān)米者。


基本思路

建立數(shù)學(xué)模型來(lái)描述問(wèn)題韭畸;

把求解的問(wèn)題分成若干個(gè)子問(wèn)題;

對(duì)每一子問(wèn)題求解塘雳,得到子問(wèn)題的局部最優(yōu)解陆盘;

把子問(wèn)題的解局部最優(yōu)解合成原來(lái)解問(wèn)題的一個(gè)解。


案例分析

區(qū)間調(diào)度問(wèn)題(interval shecduling)

問(wèn)題描述:

這是《算法導(dǎo)論》上的例子败明,也是一個(gè)非常經(jīng)典的問(wèn)題隘马。有n個(gè)需要在同一天使用同一個(gè)教室的活動(dòng)a1,a2,…,an,教室同一時(shí)刻只能由一個(gè)活動(dòng)使用妻顶。每個(gè)活動(dòng)ai都有一個(gè)開始時(shí)間si和結(jié)束時(shí)間fi 酸员。一旦被選擇后,活動(dòng)ai就占據(jù)半開時(shí)間區(qū)間[si,fi)讳嘱。如果[si,fi]和[sj,fj]互不重疊幔嗦,ai和aj兩個(gè)活動(dòng)就可以被安排在這一天。該問(wèn)題就是要安排這些活動(dòng)使得盡量多的活動(dòng)能不沖突的舉行沥潭。例如下圖所示的活動(dòng)集合S邀泉,其中各項(xiàng)活動(dòng)按照結(jié)束時(shí)間單調(diào)遞增排序。


幾種貪心策略:

1.最早開始時(shí)間??

即用每個(gè)工作的開始時(shí)間進(jìn)行升序排列,在保證不沖突的情況下汇恤,每次選擇開始時(shí)間最小的情況庞钢。

2.最早結(jié)束時(shí)間

即用每個(gè)工作的結(jié)束時(shí)間進(jìn)行升序排列,在保證不沖突的情況下(仍然考慮下一次的結(jié)束時(shí)間盡可能的小因谎,且下一次的開始時(shí)間需要大于上一次的結(jié)束時(shí)間)基括,每次選擇結(jié)束時(shí)間最小的情況。(上圖)

3.最少的運(yùn)行時(shí)間

即每一個(gè)工作的結(jié)束時(shí)間減去開始時(shí)間得到運(yùn)行時(shí)間财岔,并且在不沖突的情況下风皿,每次選擇運(yùn)行時(shí)間最短的工作。

4.最少?zèng)_突情況

即首先計(jì)算出當(dāng)前的工作i匠璧,它的沖突個(gè)數(shù)為k[i]桐款,用k[i]進(jìn)行上升排序。每次選擇沖突最小的情況患朱。

哪種策略下能得到最優(yōu)解鲁僚?答:最早結(jié)束時(shí)間

?證明方法:構(gòu)造法(深灰表選中的工作,淺灰表示反例)

最早開始時(shí)間:假設(shè)最早開始時(shí)間的工作的運(yùn)行時(shí)間很長(zhǎng)裁厅,就不是最優(yōu)。

最少運(yùn)行時(shí)間:假設(shè)最少運(yùn)行時(shí)間的的那個(gè)工作的結(jié)束時(shí)間很晚侨艾,就不是最優(yōu)执虹。

最少?zèng)_突:按上圖的情況,首先會(huì)選到深灰唠梨,然后再選擇旁邊的淺灰袋励,總共只有三個(gè)工作被選中,不是最優(yōu)当叭。

接著證明最早結(jié)束時(shí)間是最優(yōu)的(可以用歸納法)

算法思想:

????????????1.先按完成時(shí)間上升排序

? ? ? ? ? ? 2.選擇當(dāng)前的結(jié)束時(shí)間的最早的工作茬故,判斷該工作的開始時(shí)間是否滿足大于上一個(gè)工作的結(jié)束時(shí)間

? ? ? ? ? ? 3.如果不滿足,則尋找下一個(gè)蚁鳖,滿足的話重復(fù)2步磺芭,就選擇,直到遍歷完

總結(jié)而言就是:先排序醉箕,不沖突就選擇加入A(被選擇的job)钾腺,沖突就丟棄并遍歷下一個(gè),最后返回A

實(shí)現(xiàn):http://www.reibang.com/p/89f8c67b2a04

錢幣找零問(wèn)題

問(wèn)題描述:這個(gè)問(wèn)題在我們的日常生活中就更加普遍了讥裤。假設(shè)1元放棒、2元、5元己英、10元间螟、20元、50元、100元的紙幣分別有c0, c1, c2, c3, c4, c5, c6張∠崞疲現(xiàn)在要用這些錢來(lái)支付K元邮府,至少要用多少?gòu)埣垘牛坑秘澬乃惴ǖ乃枷敫绒龋茱@然褂傀,每一步盡可能用面值大的紙幣即可。在日常生活中我們自然而然也是這么做的加勤。

貪心策略:

最大面值:在程序中已經(jīng)事先將Value按照從大到小的順序排好仙辟。

算法思想:1.首先將面值從大到小排序 2.計(jì)算K/V的取低值為n,記錄n鳄梅,并求得剩余的K叠国,重復(fù)2過(guò)程,直到K的取值為零戴尸。

背包問(wèn)題

問(wèn)題描述:有一個(gè)背包粟焊,背包容量是M=150。有7個(gè)物品孙蒙,物品可以分割成任意大小项棠。要求盡可能讓裝入背包中的物品總價(jià)值V最大,但不能超過(guò)總?cè)萘縈挎峦。


貪心策略:

最大價(jià)值:在保證不超重的情況下香追,每次選擇價(jià)值最大的物品。

結(jié)果:DBFE  不是最優(yōu)

最小容量:在保證不超重的情況下坦胶,每次選擇重量最小的物品透典。

結(jié)果:FGBAE  不是最優(yōu)

最大單位容量的價(jià)值:選擇單位容量下,價(jià)值最大的那一個(gè)顿苇。

結(jié)果:FBGD   40+40+30+50

算法思想:

1.按單位容量的價(jià)值由大到小排序

2.如果不超重峭咒,就選擇,超重就舍棄纪岁。

實(shí)現(xiàn):http://www.reibang.com/p/50f1d4e0555c

最小生成樹問(wèn)題

問(wèn)題描述:

求一個(gè)連通無(wú)向圖的最小生成樹的代價(jià)(圖邊權(quán)值為正整數(shù))凑队。

Kruskal算法簡(jiǎn)述

假設(shè) WN=(V,{E}) 是一個(gè)含有 n 個(gè)頂點(diǎn)的連通網(wǎng),則按照克魯斯卡爾算法構(gòu)造最小生成樹的過(guò)程為:先構(gòu)造一個(gè)只含 n 個(gè)頂點(diǎn)蜂科,而邊集為空的子圖顽决,若將該子圖中各個(gè)頂點(diǎn)看成是各棵樹上的根結(jié)點(diǎn),則它是一個(gè)含有 n 棵樹的一個(gè)森林导匣。之后才菠,從網(wǎng)的邊集 E 中選取一條權(quán)值最小的邊,若該條邊的兩個(gè)頂點(diǎn)分屬不同的樹贡定,則將其加入子圖赋访,也就是說(shuō),將這兩個(gè)頂點(diǎn)分別所在的兩棵樹合成一棵樹;反之蚓耽,若該條邊的兩個(gè)頂點(diǎn)已落在同一棵樹上渠牲,則不可取,而應(yīng)該取下一條權(quán)值最小的邊再試之步悠。依次類推签杈,直至森林中只有一棵樹,也即子圖中含有 n-1條邊為止鼎兽。

模擬過(guò)程:http://www.reibang.com/p/50f1d4e0555c

算法難點(diǎn):

(1)邊的選擇要求從小到大選擇答姥,則開始顯然要對(duì)邊進(jìn)行升序排序。

(2)選擇的邊是否需要谚咬,則從判斷該邊加入后是否構(gòu)成環(huán)入手鹦付。

算法設(shè)計(jì):

(1)對(duì)邊升序排序

在此采用鏈?zhǔn)浇Y(jié)構(gòu),通過(guò)插入排序完成择卦。每一結(jié)點(diǎn)存放一條邊的左右端點(diǎn)序號(hào)敲长、權(quán)值及后繼結(jié)點(diǎn)指針

(2)邊的加入是否構(gòu)成環(huán)

一開始假定各頂點(diǎn)分別為一組,其組號(hào)為端點(diǎn)序號(hào)秉继。選擇某邊后祈噪,看其兩個(gè)端點(diǎn)是否在同一組中,即所在組號(hào)是否相同秕噪,如果是钳降,表示構(gòu)成了環(huán),則舍去腌巾。? 如果兩個(gè)端點(diǎn)所在的組不同,則表示可以加入铲觉,則將該邊兩端的組合并成同一組澈蝙。

參考:http://www.reibang.com/p/50f1d4e0555c

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市撵幽,隨后出現(xiàn)的幾起案子灯荧,更是在濱河造成了極大的恐慌,老刑警劉巖盐杂,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逗载,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡链烈,警方通過(guò)查閱死者的電腦和手機(jī)厉斟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)强衡,“玉大人擦秽,你說(shuō)我怎么就攤上這事。” “怎么了感挥?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵缩搅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我触幼,道長(zhǎng)硼瓣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任置谦,我火速辦了婚禮堂鲤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘霉祸。我一直安慰自己筑累,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布丝蹭。 她就那樣靜靜地躺著慢宗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奔穿。 梳的紋絲不亂的頭發(fā)上镜沽,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音贱田,去河邊找鬼缅茉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛男摧,可吹牛的內(nèi)容都是我干的蔬墩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼耗拓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拇颅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起乔询,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤樟插,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后竿刁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體黄锤,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年食拜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸵熟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡监婶,死狀恐怖旅赢,靈堂內(nèi)的尸體忽然破棺而出齿桃,到底是詐尸還是另有隱情,我是刑警寧澤煮盼,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布短纵,位于F島的核電站,受9級(jí)特大地震影響僵控,放射性物質(zhì)發(fā)生泄漏香到。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一报破、第九天 我趴在偏房一處隱蔽的房頂上張望悠就。 院中可真熱鬧,春花似錦充易、人聲如沸梗脾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)炸茧。三九已至,卻和暖如春稿静,著一層夾襖步出監(jiān)牢的瞬間梭冠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工改备, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留控漠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓悬钳,卻偏偏與公主長(zhǎng)得像盐捷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子默勾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系毙驯,并對(duì)這種結(jié)構(gòu)定義相應(yīng)的運(yùn)算,而且確保經(jīng)過(guò)這...
    Winterfell_Z閱讀 5,654評(píng)論 0 13
  • 1)這本書為什么值得看: Python語(yǔ)言描述灾测,如果學(xué)的Python用這本書學(xué)數(shù)據(jù)結(jié)構(gòu)更合適 2016年出版迅诬,內(nèi)容...
    孫懷闊閱讀 12,442評(píng)論 0 15
  • 貪心算法 當(dāng)具有最優(yōu)子結(jié)構(gòu)性質(zhì)的時(shí)候肄程,可以使用動(dòng)態(tài)規(guī)劃算法也可以使用貪心算法 最優(yōu)子結(jié)構(gòu)性質(zhì)、貪心選擇性質(zhì) 雖然貪...
    冰源閱讀 1,010評(píng)論 0 0
  • 我常有對(duì)中國(guó)山水畫情有獨(dú)鐘瞧毙,而對(duì)人物畫淡點(diǎn)的癖好骤宣,也或是對(duì)過(guò)往的人定勝天的勇氣產(chǎn)生了懺悔秦爆,現(xiàn)越發(fā)的覺(jué)得人在自...
    僚片子閱讀 316評(píng)論 0 0
  • 和孩子沒(méi)法好好說(shuō)話?跟孩子怎么說(shuō)他都不聽望门?來(lái)來(lái)來(lái)形娇,學(xué)學(xué)這16句“神回復(fù)”,讓親子溝通不再成為問(wèn)題筹误! 1.直接描述問(wèn)...
    江蘇家學(xué)寶閱讀 669評(píng)論 0 1