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