五大常用算法之一:貪心算法

一、基本概念


所謂貪心算法是指弓柱,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說笙各,不從整體最優(yōu)上加以考慮唱蒸,它所做出的僅僅是在某種意義上的局部最優(yōu)解邦鲫。
貪心算法沒有固定的算法框架,算法設(shè)計的關(guān)鍵是貪心策略的選擇神汹。必須注意的是庆捺,貪心算法不是對所有問題都能得到整體最優(yōu)解,選擇的貪心策略必須具備無后效性(即某個狀態(tài)以后的過程不會影響以前的狀態(tài)屁魏,只與當前狀態(tài)有關(guān)滔以。)
所以,對所采用的貪心策略一定要仔細分析其是否滿足無后效性氓拼。

二你画、貪心算法的基本思路


  • 建立數(shù)學模型來描述問題
  • 把求解的問題分成若干個子問題
  • 對每個子問題求解,得到子問題的局部最優(yōu)解
  • 把子問題的解局部最優(yōu)解合成原來問題的一個解

三桃漾、該算法存在的問題

  • 不能保證求得的最后解是最佳的
  • 不能用來求最大值或最小值的問題
  • 只能求滿足某些約束條件的可行解的范圍

四坏匪、貪心算法適用的問題



貪心策略適用的前提是:局部最優(yōu)策略能導致產(chǎn)生全局最優(yōu)解。
實際上撬统,貪心算法適用的情況很少适滓。一般對一個問題分析是否適用于貪心算法,可以先選擇該問題下的幾個實際數(shù)據(jù)進行分析恋追,就可以做出判斷凭迹。

五罚屋、貪心選擇性質(zhì)

所謂貪心選擇性質(zhì)是指所求問題的整體最優(yōu)解可以通過一系列局部最優(yōu)的選擇,換句話說嗅绸,當考慮做何種選擇的時候脾猛,我們只考慮對當前問題最佳的選擇而不考慮子問題的結(jié)果。這是貪心算法可行的第一個基本要素鱼鸠。貪心算法以迭代的方式作出相繼的貪心選擇尖滚,每作一次貪心選擇就將所求問題簡化為規(guī)模更小的子問題。對于一個具體問題瞧柔,要確定它是否具有貪心選擇性質(zhì)漆弄,必須證明每一步所作的貪心選擇最終導致問題的整體最優(yōu)解。
當一個問題的最優(yōu)解包含其子問題的最優(yōu)解時造锅,稱此問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)撼唾。問題的最優(yōu)子結(jié)構(gòu)性質(zhì)是該問題可用貪心算法求解的關(guān)鍵特征。

六哥蔚、貪心算法的實現(xiàn)框架



從問題的某一初始解出發(fā):
while (朝給定總目標前進一步)
{
利用可行的決策倒谷,求出可行解的一個解元素。
}
由所有解元素組合成問題的一個可行解糙箍;

五渤愁、例題分析



【背包問題】有一個背包,容量是M=150深夯,有7個物品抖格,物品可以分割成任意大小。要求盡可能讓裝入背包中的物品總價值最大咕晋,但不能超過總?cè)萘俊?br> 物品:A B C D E F G
重量:35 30 60 50 40 10 25
價值:10 40 30 50 35 40 30
分析:
目標函數(shù): ∑pi最大
約束條件是裝入的物品總質(zhì)量不超過背包容量:∑wi<=M( M=150)
(1)根據(jù)貪心的策略雹拄,每次挑選價值最大的物品裝入背包,得到的結(jié)果是否最優(yōu)掌呜?
(2)每次挑選所占重量最小的物品裝入是否能得到最優(yōu)解滓玖?
(3)每次選取單位重量價值最大的物品,成為解本題的策略

值得注意的是质蕉,貪心算法并不是完全不可以使用势篡,貪心策略一旦經(jīng)過證明成立后,它就是一種高效的算法模暗。比如禁悠,求最小生成樹的Prim算法和Kruskal算法都是漂亮的貪心算法
貪心算法還是很常見的算法之一汰蓉,這是由于它簡單易行绷蹲,構(gòu)造貪心策略不是很困難棒卷。
可惜的是顾孽,它需要證明后才能真正運用到題目的算法中祝钢。
一般來說,貪心算法的證明圍繞著:整個問題的最優(yōu)解一定由在貪心策略中存在的子問題的最優(yōu)解得來的若厚。
對于例題中的3種貪心策略拦英,都是無法成立(無法被證明)的,解釋如下:
貪心策略:選取價值最大者测秸。反例:

W=30

物品:A B C

重量:28 12 12

價值:30 20 20

根據(jù)策略疤估,首先選取物品A,接下來就無法再選取了霎冯,可是铃拇,選取B、C則更好沈撞。

(2)貪心策略:選取重量最小慷荔。它的反例與第一種策略的反例差不多。

(3)貪心策略:選取單位重量價值最大的物品缠俺。反例:

W=30

物品:A B C

重量:28 20 10

價值:28 20 10

根據(jù)策略显晶,三種物品單位重量價值一樣,程序無法依據(jù)現(xiàn)有策略作出判斷壹士,如果選擇A磷雇,則答案錯誤。但是果在條件中加一句當遇見單位價值相同的時候,優(yōu)先裝重量小的,這樣的問題就可以解決.

所以需要說明的是躏救,貪心算法可以與隨機化算法一起使用唯笙,具體的例子就不再多舉了。(因為這一類算法普及性不高盒使,而且技術(shù)含量是非常高的睁本,需要通過一些反例確定隨機的對象是什么,隨機程度如何忠怖,但也是不能保證完全正確呢堰,只能是極大的幾率正確)。

六凡泣、其他例題及代碼實現(xiàn)(待補充)


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末枉疼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鞋拟,更是在濱河造成了極大的恐慌骂维,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贺纲,死亡現(xiàn)場離奇詭異航闺,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門潦刃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侮措,“玉大人,你說我怎么就攤上這事乖杠》衷” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵胧洒,是天一觀的道長畏吓。 經(jīng)常有香客問我,道長卫漫,這世上最難降的妖魔是什么菲饼? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮列赎,結(jié)果婚禮上巴粪,老公的妹妹穿的比我還像新娘。我一直安慰自己粥谬,他們只是感情好肛根,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著漏策,像睡著了一般派哲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掺喻,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天芭届,我揣著相機與錄音,去河邊找鬼感耙。 笑死褂乍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的即硼。 我是一名探鬼主播逃片,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼只酥!你這毒婦竟也來了褥实?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤裂允,失蹤者是張志新(化名)和其女友劉穎损离,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绝编,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡僻澎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年貌踏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窟勃。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡祖乳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拳恋,到底是詐尸還是另有隱情,我是刑警寧澤砸捏,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布谬运,位于F島的核電站,受9級特大地震影響垦藏,放射性物質(zhì)發(fā)生泄漏梆暖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一掂骏、第九天 我趴在偏房一處隱蔽的房頂上張望轰驳。 院中可真熱鬧,春花似錦弟灼、人聲如沸级解。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勤哗。三九已至,卻和暖如春掩驱,著一層夾襖步出監(jiān)牢的瞬間芒划,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工欧穴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留民逼,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓涮帘,卻偏偏與公主長得像拼苍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子调缨,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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

  • 分治算法 一映屋、基本概念 在計算機科學中,分治法是一種很重要的算法同蜻。字面上的解釋是“分而治之”棚点,就是把一個復雜的問題...
    木葉秋聲閱讀 5,285評論 0 3
  • 一、基本概念: 所謂貪心算法是指湾蔓,在對問題求解時瘫析,總是做出在當前看來是最好的選擇。也就是說,不從整體最優(yōu)上加以考慮...
    麒麟楚莊王閱讀 6,905評論 0 1
  • 分治算法 一贬循、基本概念 在計算機科學中咸包,分治法是一種很重要的算法。字面上的解釋是“分而治之”杖虾,就是把一個復雜的問題...
    Java資訊庫閱讀 9,760評論 0 14
  • 貪心算法的基本思想 貪心算法烂瘫,是尋找最優(yōu)解問題的常用方法,這種方法模式一般將求解過程分成若干個步驟奇适,但每個步驟都應...
    結(jié)構(gòu)學AI閱讀 7,688評論 0 0
  • 我擁有靜靜的歡樂 達武旦 我擁有靜靜的歡樂 像一朵云 披滿金色的霞光 ——幽靈般散去 在拂過萬物的晚風里 2018...
    達武旦閱讀 209評論 0 2