【數(shù)據(jù)結構】貪心算法和動態(tài)規(guī)劃

動態(tài)規(guī)劃和貪心算法都是用來求最優(yōu)化問題窘问,且二者都必須具有最有子結構。貪心算法可以解決的問題缸沃,動態(tài)規(guī)劃都能解決,可以說修械,貪心算法是動態(tài)規(guī)劃的一個特例趾牧。

貪心算法和動態(tài)規(guī)劃最大的不同在于,它并不是首先尋找子問題的最優(yōu)解肯污,然后在其中進行選擇翘单,而是首先做一次貪心選擇——在當時(局部)看來最有選擇——然后求解選出的子問題,從而不必費心求解所有可能相關的子問題仇箱。

動態(tài)規(guī)劃

動態(tài)規(guī)劃)與分治法相似县恕,都是通過組合子問題的解來求解原問題。分治法將問題劃分為互不相交的子問題剂桥,遞歸求解子問題忠烛,再將它們的解組合起來,求出原問題的解权逗。與之相反美尸,動態(tài)規(guī)劃應用于子問題重疊的情況,即不同的子問題具有公共的子子問題(子問題的求解釋遞歸進行的斟薇,將其劃分為更小的子子問題)师坎。這種情況下,動態(tài)規(guī)劃對公共子子問題只求一次解堪滨,而分治法會反復求解公共子子問題胯陋。

我們通常按如下四個步驟來設計一個動態(tài)規(guī)劃算法:

刻畫一個最優(yōu)解的結構特征(如果一個問題的最優(yōu)解包含其子問題的最優(yōu)解,就稱此問題具有最有子結構性質(zhì))袱箱。

遞歸的定義最優(yōu)解的值遏乔。

計算最優(yōu)解的值,通常采用自底向上的方法发笔。

利用計算出的信息構造一個最優(yōu)解盟萨。

eg:最長公共子序列(LCS)問題。

貪心算法

求解最優(yōu)化問題的算法通常需要經(jīng)過一系列的步驟了讨,在每個步驟都面臨多種選擇捻激。對于許多最優(yōu)化問題,使用動態(tài)規(guī)劃算法求最優(yōu)解有些殺雞用牛刀了前计,可以使用更簡單更優(yōu)化的算法胞谭,即貪心算法(greedy algorithm)。它在每一步都做出當時看起來最佳的選擇男杈。也就是說韭赘,它總是做出局部最優(yōu)的選擇,寄希望這樣的選擇能導致全局最優(yōu)解势就。貪心算法并不保證得到最優(yōu)解泉瞻,但對很多問題確實可以求得最優(yōu)解。

可以按如下步驟 設計貪心算法:

將最優(yōu)化問題轉(zhuǎn)化為這樣的形式:對其作出一次選擇后苞冯,只剩下一個子問題需要求解袖牙。

證明作出貪心選擇后,原問題總是存在最優(yōu)解舅锄,即貪心選擇總是安全的鞭达。

證明作出貪心選擇后,剩余的子問題滿足性質(zhì):其最優(yōu)解與貪心選擇組合即可得到原問題的最優(yōu)解皇忿,這樣就得到了最優(yōu)子結構畴蹭。

貪心選擇性質(zhì)(greedy-choice property):我們可以通過作出局部最優(yōu)(貪心)選擇來構造全局最優(yōu)解。換句話說鳍烁,當進行選擇時叨襟,我們直接作出在當前問題中看來最優(yōu)的選擇,而不必考慮子問題的解幔荒。

這也是貪心算法與動態(tài)規(guī)劃的不同之處糊闽。在動態(tài)規(guī)劃方法中,每個步驟都要進行一次選擇爹梁,但選擇通常依賴于子問題的解右犹。因此,我們通常以一種自底向上的方式求解動態(tài)規(guī)劃問題姚垃,先求解嬌小的子問題念链,然后是交大的子問題(我們也可以自頂向下求解,但需要備忘機制积糯。當然掂墓,即使算法是自頂向下進行計算,我們?nèi)匀恍枰惹蠼庾訂栴}再進行選擇)絮宁。在貪心算法中梆暮,我們總是做出當時看來最佳的選擇,然后求解剩下的唯一子問題绍昂。貪心算法進行選擇時可能依賴于之前做出的選擇啦粹,但不依賴于任何將來的選擇或是子問題的解。因此窘游,與動態(tài)規(guī)劃先求解子問題才能進行第一次選擇不用唠椭,貪心算法在進行第一次選擇之前不求解任何子問題。一個動態(tài)規(guī)劃算法是自底向上進行計算的忍饰,而一個貪心算法通常是自頂向下的贪嫂,進行一次又一次選擇,將給定問題實例變得更小艾蓝。

eg:赫夫曼編碼力崇、最小生成樹算法(Kruskal算法和Prim算法)

幾個經(jīng)典貪心問題

一斗塘、背包相關問題

1.最優(yōu)裝載問題:給出N個物體,有一定重量亮靴。請選擇盡量多的物體馍盟,使總重量不超過C。

解法:只關心數(shù)量多茧吊,便把重量從小到大排序贞岭,依次選,直到裝不下搓侄。

二瞄桨、區(qū)間相關問題

1.選擇不相交區(qū)間:數(shù)軸上有N個開區(qū)間(Li,Ri),請選擇盡量多個區(qū)間讶踪,并保證這些區(qū)間兩兩沒有公共點芯侥。

三、Huffman編碼

最優(yōu)編碼問題:給出N個字符的頻率 ci 俊柔,給每個字符賦予一個01編碼串筹麸,使得任意一個字符的編碼不是另一個字符編碼的前綴,而且編碼后總長度(每個字符的頻率與編碼長度乘積的總和)盡量小

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雏婶,一起剝皮案震驚了整個濱河市物赶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌留晚,老刑警劉巖酵紫,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異错维,居然都是意外死亡奖地,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門赋焕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來参歹,“玉大人,你說我怎么就攤上這事隆判∪樱” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵侨嘀,是天一觀的道長臭挽。 經(jīng)常有香客問我,道長咬腕,這世上最難降的妖魔是什么欢峰? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上纽帖,老公的妹妹穿的比我還像新娘宠漩。我一直安慰自己,他們只是感情好抛计,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布哄孤。 她就那樣靜靜地躺著,像睡著了一般吹截。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凝危,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天波俄,我揣著相機與錄音,去河邊找鬼蛾默。 笑死懦铺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的支鸡。 我是一名探鬼主播冬念,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牧挣!你這毒婦竟也來了急前?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤瀑构,失蹤者是張志新(化名)和其女友劉穎裆针,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寺晌,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡世吨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了呻征。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耘婚。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖陆赋,靈堂內(nèi)的尸體忽然破棺而出沐祷,到底是詐尸還是另有隱情,我是刑警寧澤奏甫,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布戈轿,位于F島的核電站,受9級特大地震影響阵子,放射性物質(zhì)發(fā)生泄漏思杯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望色乾。 院中可真熱鬧誊册,春花似錦、人聲如沸暖璧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澎办。三九已至嘲碱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間局蚀,已是汗流浹背麦锯。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留琅绅,地道東北人扶欣。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像千扶,于是被迫代替她去往敵國和親料祠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

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

  • 分治法梧宫,動態(tài)規(guī)劃法,貪心算法這三者之間有類似之處摆碉,比如都需要將問題劃分為一個個子問題塘匣,然后通過解決這些子問題來解決...
    魚游硅谷閱讀 2,115評論 0 10
  • 概述 在前文中解釋了動態(tài)規(guī)劃的基本思想,動態(tài)規(guī)劃通過將一個問題劃分為規(guī)模更小的有限個子問題進行求解巷帝,一般用于求解最...
    CodingTech閱讀 2,672評論 0 10
  • 目錄 1.貪心算法步驟 2.兩個關鍵要素 3.兩種背包問題3.1 0-1背包問題(適用于動態(tài)規(guī)劃忌卤,不滿足貪心選擇性...
    王偵閱讀 4,913評論 2 3
  • 貪心算法 貪心算法總是作出在當前看來最好的選擇。也就是說貪心算法并不從整體最優(yōu)考慮楞泼,它所作出的選擇只是在某種意義上...
    fredal閱讀 9,221評論 3 52
  • 現(xiàn)在抗拒看不過眼的很強烈堕阔,遇到看不過眼的事兒就說與我無關棍厂,與我無關,與我無關超陆,與我無關牺弹,與我無關,與我無關,與我無關
    可可可鑫閱讀 234評論 0 0