遞推與遞迴,分治法 貪心 動態規劃的區別

2021-09-16 12:32:46 字數 852 閱讀 6399

動態規劃(dynamic programming, dp) :是一種用來解決一類 最優化問題 的演算法思想。簡單來說,動態規劃將乙個 複雜的問題分解成若干個子問題,通過綜合子問題的最優解來得到原問題的最優解。需要注意的是,動態規劃會將每個求解過的子問題的解記錄下來,這樣當下一次碰到同樣的子問題時,就可以直接使用之前記錄的結果,而不是重複計算。

使用動態規劃演算法的兩個基本要素:

(1)重疊子問題;

(2)最優子結構特性。

一般可以使用遞迴或者遞推的寫法來實現動態規劃,其中遞迴寫法在此處又稱作記憶化搜尋。

貪心法:是指所求問題的 整體最優解 可以通過一系列 區域性最優 得到,總是做出在當前看來是最好的選擇。不從整體最優上加以考慮,所做出的是在某種意義上的區域性最優解,不能保證對所有問題都能得到整體最優解。

共同點:都是將問題分解為子問題,然後合併子問題的解得到原問題的解。

區別:動態規劃解決的問題一定是最優化問題,並且擁有重疊子問題。

分治法解決的問題不一定是最優化問題,分解出的子問題是不重疊的(如歸併排序、快速排序)

共同點:都要求原問題必須有最優子結構(「最優子結構」 指的是:乙個問題的最優解可以由其子問題的最優解有效的構造出來)。

區別:貪心法:類似於「自頂向下」,但是並不等待子問題求解完畢後再選擇使用哪乙個, 而是通過某種策略直接選擇乙個子問題去求解,沒被選擇的子問題就不去求解了,直接拋棄,是一種單鏈的流水方式。最終不一定能得到最優解。

動態規劃:不論是自底向上還是自頂向下的計算方式,都是從邊界開始向上得到目標問題的解。即:他總會考慮所有子問題。

動態規劃 分治 貪心 遞迴

一言以蔽之 dp 和分治 之間的區別就在於是否有重疊子問題 如果有那就應該dp 否則就應該分治。當然如果可以每一步都產生最優解那麼就不必dp了,貪心演算法就可以了.而遞迴只是一種實現演算法的方法.例子 下面分別用 dp,dc 分治法 貪心來做 leetcode 514.自由之路 golang 如下 ...

遞迴 遞推 貪心 搜尋和動態規劃

遞迴 函式呼叫自身,直到達到基線條件之後,再一層層的回歸到最初的問題。這是一種自頂向下的方法。動態規劃通常是用遞推 自底向上 來實現的,但是使用備忘錄遞迴 自頂向下 也能夠實現動態規劃。例如,動態規劃 從入門到放棄 結合這篇部落格的例子來理解,詳解動態規劃 鄒博講動態規劃 已知問題規模為n的前提a,...

分治 遞迴 動態規劃 貪心演算法區別

三者之間沒有根本區別,關鍵看有無最優的子結構。共性 找到重複子問題 差異性 動態規劃尋找最優子結構,中間可以淘汰次優解 動態規劃是尋找區域性,全域性最優解 貪心演算法是找區域性最優解,不一定得到全域性最優解 回顧下遞迴四步驟 terminator process drill dowm restore...