摘要:貪心算法與動(dòng)態(tài)規(guī)劃算法的差異貪心算法和動(dòng)態(tài)規(guī)劃算法都要求問(wèn)題具有最優(yōu)子結(jié)構(gòu)性質(zhì),這是類(lèi)算法的一個(gè)共同點(diǎn)。
貪心算法的基本要素
對(duì)于一個(gè)具體的問(wèn)題,怎么知道是否可用貪心算法解此問(wèn)題,以及能否得到問(wèn)題的最優(yōu)解呢?這個(gè)問(wèn)題很難給予肯定的回答。
但是,從許多可以用貪心算法求解的問(wèn)題中看到這類(lèi)問(wèn)題一般具有2個(gè)重要的性質(zhì):貪心選擇性質(zhì)和最優(yōu)子結(jié)構(gòu)性質(zhì)。
1、貪心選擇性質(zhì)
所謂貪心選擇性質(zhì)是指所求問(wèn)題的整體最優(yōu)解可以通過(guò)一系列局部最優(yōu)的選擇,即貪心選擇來(lái)達(dá)到。這是貪心算法可行的第一個(gè)基本要素,也是貪心算法與動(dòng)態(tài)規(guī)劃算法的主要區(qū)別。
動(dòng)態(tài)規(guī)劃算法通常以自底向上的方式解各子問(wèn)題,而貪心算法則通常以自頂向下的方式進(jìn)行,以迭代的方式作出相繼的貪心選擇,每作一次貪心選擇就將所求問(wèn)題簡(jiǎn)化為規(guī)模更小的子問(wèn)題。
對(duì)于一個(gè)具體問(wèn)題,要確定它是否具有貪心選擇性質(zhì),必須證明每一步所作的貪心選擇最終導(dǎo)致問(wèn)題的整體最優(yōu)解。
2、最優(yōu)子結(jié)構(gòu)性質(zhì)
貪心選擇是指所求問(wèn)題的整體最優(yōu)解可以通過(guò)一系列局部最優(yōu)的選擇,即貪心選擇來(lái)達(dá)到。這是貪心算法可行的第一個(gè)基本要素,也是貪心算法與動(dòng)態(tài)規(guī)劃算法的主要區(qū)別。貪心選擇是采用從頂向下、以迭代的方法做出相繼選擇,每做一次貪心選擇就將所求問(wèn)題簡(jiǎn)化為一個(gè)規(guī)模更小的子問(wèn)題。對(duì)于一個(gè)具體問(wèn)題,要確定它是否具有貪心選擇的性質(zhì),我們必須證明每一步所作的貪心選擇最終能得到問(wèn)題的最優(yōu)解。通常可以首先證明問(wèn)題的一個(gè)整體最優(yōu)解,是從貪心選擇開(kāi)始的,而且作了貪心選擇后,原問(wèn)題簡(jiǎn)化為一個(gè)規(guī)模更小的類(lèi)似子問(wèn)題。然后,用數(shù)學(xué)歸納法證明,通過(guò)每一步貪心選擇,最終可得到問(wèn)題的一個(gè)整體最優(yōu)解。
3、貪心算法與動(dòng)態(tài)規(guī)劃算法的差異
貪心算法和動(dòng)態(tài)規(guī)劃算法都要求問(wèn)題具有最優(yōu)子結(jié)構(gòu)性質(zhì),這是2類(lèi)算法的一個(gè)共同點(diǎn)。但是,對(duì)于具有最優(yōu)子結(jié)構(gòu)的問(wèn)題應(yīng)該選用貪心算法還是動(dòng)態(tài)規(guī)劃算法求解?是否能用動(dòng)態(tài)規(guī)劃算法求解的問(wèn)題也能用貪心算法求解?下面研究2個(gè)經(jīng)典的組合優(yōu)化問(wèn)題,并以此說(shuō)明貪心算法與動(dòng)態(tài)規(guī)劃算法的主要差別。
貪婪算法可解決的問(wèn)題通常大部分都有如下的特性:
隨著算法的進(jìn)行,將積累起其它兩個(gè)集合:一個(gè)包含已經(jīng)被考慮過(guò)并被選出的候選對(duì)象,另一個(gè)包含已經(jīng)被考慮過(guò)但被丟棄的候選對(duì)象。
有一個(gè)函數(shù)來(lái)檢查一個(gè)候選對(duì)象的集合是否提供了問(wèn)題的解答。該函數(shù)不考慮此時(shí)的解決方法是否最優(yōu)。
還有一個(gè)函數(shù)檢查是否一個(gè)候選對(duì)象的集合是可行的,也即是否可能往該集合上添加更多的候選對(duì)象以獲得一個(gè)解。和上一個(gè)函數(shù)一樣,此時(shí)不考慮解決方法的最優(yōu)性。
選擇函數(shù)可以指出哪一個(gè)剩余的候選對(duì)象最有希望構(gòu)成問(wèn)題的解。
最后,目標(biāo)函數(shù)給出解的值。
為了解決問(wèn)題,需要尋找一個(gè)構(gòu)成解的候選對(duì)象集合,它可以?xún)?yōu)化目標(biāo)函數(shù),貪婪算法一步一步的進(jìn)行。起初,算法選出的候選對(duì)象的集合為空。接下來(lái)的每一步中,根據(jù)選擇函數(shù),算法從剩余候選對(duì)象中選出最有希望構(gòu)成解的對(duì)象。如果集合中加上該對(duì)象后不可行,那么該對(duì)象就被丟棄并不再考慮;否則就加到集合里。每一次都擴(kuò)充集合,并檢查該集合是否構(gòu)成解。如果貪婪算法正確工作,那么找到的第一個(gè)解通常是最優(yōu)的。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/41779.html
摘要:貪心算法每一步必須滿(mǎn)足一下條件可行的即它必須滿(mǎn)足問(wèn)題的約束。四題目分析貪心算法,總是做出在當(dāng)前看來(lái)是最好的選擇,不從整體最優(yōu)上加以考慮,也就是說(shuō),只關(guān)心當(dāng)前最優(yōu)解,按照貪心策略,不關(guān)心以后,我們只關(guān)心當(dāng)前利益。 一、寫(xiě)在前面 為什么要在LeetCode刷題?大家都知道不管是校招還是社招算法題是必考題,而這一部分恰巧是大多數(shù)人的短板,所以刷題首先是為了提高自身的編程能力,能夠在算法面試中...
摘要:代碼實(shí)現(xiàn)見(jiàn)下面評(píng)論對(duì)應(yīng)代碼動(dòng)態(tài)規(guī)劃基本思想和分治法基本思想有共同的地方,不同的是子問(wèn)題往往不是獨(dú)立的,有事母問(wèn)題要借助子問(wèn)題的解來(lái)判斷,因此把已經(jīng)計(jì)算好的問(wèn)題記錄在表格中,后續(xù)如果需要查詢(xún)一下,可以避免重復(fù)計(jì)算,這是動(dòng)態(tài)規(guī)劃的基本思想。 作者:心葉時(shí)間:2018-05-01 19:28 本文對(duì)應(yīng)github地址:https://github.com/yelloxing/... 以上實(shí)現(xiàn)...
摘要:寫(xiě)在前面今天這篇文章是貪心算法系列的第三篇?jiǎng)澐肿帜竻^(qū)間。前文回顧貪心算法分發(fā)糖果刷題匯總匯總貼今日題目字符串由小寫(xiě)字母組成。返回一個(gè)表示每個(gè)字符串片段的長(zhǎng)度的列表。示例輸入輸出解釋劃分結(jié)果為。每個(gè)字母最多出現(xiàn)在一個(gè)片段中。 寫(xiě)在前面 今天這篇文章是貪心算法系列的第三篇--劃分字母區(qū)間。 前文回顧: 【LeetCode】貪心算法--分發(fā)糖果(135) 刷題匯總: 【LeetCode】匯總...
摘要:今日題目老師想給孩子們分發(fā)糖果,有個(gè)孩子站成了一條直線,老師會(huì)根據(jù)每個(gè)孩子的表現(xiàn),預(yù)先給他們?cè)u(píng)分。相鄰的孩子中,評(píng)分高的孩子必須獲得更多的糖果。示例輸入輸出解釋你可以分別給這三個(gè)孩子分發(fā)顆糖果。第三個(gè)孩子只得到顆糖果,這已滿(mǎn)足上述兩個(gè)條件。 今日題目 老師想給孩子們分發(fā)糖果,有N個(gè)孩子站成了一條直線,老師會(huì)根據(jù)每個(gè)孩子的表現(xiàn),預(yù)先給他們?cè)u(píng)分。你需要按照以下要求,幫助老師給這些孩子分發(fā)糖...
閱讀 3687·2021-09-22 15:28
閱讀 1303·2021-09-03 10:35
閱讀 885·2021-09-02 15:21
閱讀 3487·2019-08-30 15:53
閱讀 3501·2019-08-29 17:25
閱讀 577·2019-08-29 13:22
閱讀 1563·2019-08-28 18:15
閱讀 2294·2019-08-26 13:57