動態規划:
動態規划應用於子問題重合的情況,不同的子問題具有相同的子子問題,
動態規划算法將每個子問題求解一次,將其解保存在一個表格中,需要時進行調用。
刻畫一個最優解的結構特征。
遞歸的定義最優解的值。
計算最優解的值,有自頂向下和自底向上的方法,通常采用自底向上的方法。
一、DP思想:
1、把一個大的問題分解成一個一個的子問題。
2、如果得到了這些子問題的解,然后經過一定的處理,就可以得到原問題的解。
3、如果這些子問題與原問題有着結構相同,即小問題還可以繼續的分解。
4、這樣一直把大的問題一直分下去,問題的規模不斷地減小,直到子問題小到不能再小,最終會得到最小子問題。
5、最小子問題的解顯而易見,這樣遞推回去,就可以得到原問題的解。
貪心算法:
每一步都做出當時看起來最佳的選擇,也就是說,它總是做出局部最優的選擇。
貪心算法的設計步驟:
對其作出一個選擇后,只剩下一個子問題需要求解。
證明做出貪心選擇后,原問題總是存在最優解,即貪心選擇總是安全的。
剩余子問題的最優解與貪心選擇組合即可得到原問題的最優解。
聯系:
都是分解成子問題來求解,都需要具有最優子結構
所有的貪心問題都可以用動態規划來求解,可以這么說,貪心算法是動態規划的特例。
區別:
1.貪心:每一步的最優解一定包含上一步的最優解,上一步之前的最優解則不作保留;
動態規划:全局最優解中一定包含某個局部最優解,但不一定包含前一個局部最優解,因此需要記錄之前的所有的局部最優解
也就是說,假如你要求第十步的最優解,那么第十步的最優解肯定與第九步的最優解有關,而第九步的最優解肯定與第八步的最優解有關。可以這么理解,貪心算法第十步的最優解得把前面九步的最優解都用上了,但是動態規划你需要求第十步的最優解,這個最優解可能只與第八步,第三步,第一步有關,與第九步沒有關系,我們為什么選擇第八步而不選擇第九步呢?是因為我們在計算第十步的最優解的時候其實把1-9步的組合的情況都計算了,選擇了其中最優的解,也就是第八步的解,其實第十步解的構成與第九步沒有關系,動態規划相當於窮舉了1-9步最優情況下的組合,選了其中最優的作為第十步的最優解,而貪心算法第十步的最優解肯定是由第九步構成的。
求一個問題的最優解相當於遍歷所有的子集來找最優解,但是這樣解隨着解空間的維度成指數增長,動態規划其實就是一種遍歷,但是他是帶備忘錄的遍歷,我前面算到的子問題,到這兒我不在計算,我直接調用之前保存的值,這樣就節省了大量的時間。
2.動態規划算法通常以自底向上的方式解各子問題,而貪心算法則通常自頂向下的方式進行。
3.根據以上兩條可以知道,貪心不能保證求得的最后解是最佳的,一般復雜度低;而動態規划本質是窮舉法,可以保證結果是最佳的,復雜度高。
貪心算法最經典的例子,給錢問題。
比如中國的貨幣,只看元,有1元2元5元10元20、50、100 如果我要16元,可以拿16個1元,8個2元,但是怎么最少呢?
如果用貪心算,就是我每一次拿那張可能拿的最大的。 比如16,我第一次拿20拿不起,拿10元,OK,剩下6元,再拿個5元,剩下1元也就是3張 10、5、1。
比如某國的錢幣分為 1元3元4元 ,如果要拿6元錢 怎么拿?貪心的話 先拿4 再拿兩個1 元,一共3張錢 。實際最優呢? 兩張3元就夠了
————————————————
版權聲明:本文為CSDN博主「沖鴨,屎殼郎」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/youhuakongzhi/article/details/100518166