分治與動態規劃都用到了遞迴的思想,但是對他們之間的區別在概念上一直比較模糊,今天附帶貪婪選擇稍微整理一下他們。
演算法之道上說,標準分治、動態規劃、貪婪選擇稱得上是孫子兵法的下、中、上策。標準分治
雖然將大問題分解成小問題,但是每個小問題都需要解決,相當於逢城必攻實屬下策;動態規劃
則聰明地發現,很多子問題都相同,那麼重複的子問題可以不用重複計算,就是不對每個城市進行攻破,從而節省精力和兵力,但仍然需要攻克子問題中的相當部分,屬於中策;而貪婪選擇
則將子問題限於乙個,即將攻城數量減少到了最低,從而最大限度上減少了精力和兵力,屬於上策。不過就像兵法裡所云,上策運用地不好,就有失策的時候。貪婪思想運用地不當,或者在條件不充分或不明朗的條件下用,則會大敗而歸。
從另乙個方面看,三種策略都為了在求解問題的時候成本盡量低,因此,從這個方面看,三種策略的目標一致,但是標準分治
策略的目標只是獲得問題的解,動態規劃
和貪婪選擇
不僅是要獲得乙個解,而且應該是個最優解
,因此貪婪選擇和動態規劃之間的相似性最多。不過雖然動態規劃和貪婪選擇策略有許多相同的地方,但是有時候並不容易看出來。貪婪選擇屬性
指的是乙個全域性最優解決方案可以通過解決乙個區域性最優的選擇來獲得
。對於乙個貪婪演算法來說,其選擇具有貪婪的性質,那麼對於
動態規劃
來說呢,他每一步都需要作出乙個選擇,而是在已知子問題解的基礎上作出的當前最好的選擇,所以動態規劃每一步都需要運用貪心策略。也就是說,貪婪策略
是在解決子問題前作出選擇,希望作出的選擇是正確的,是
自頂向下
。動態規劃
則是在求解子問題後作出選擇,是
自底向上
。但不管是在之前還是之後做選擇,都是試圖作出最好的選擇。揹包問題可用貪心策略來解決。
分治法和遞迴是緊密聯絡的,分治
就是把大問題分解成規模較小的子問題,然後大問題的解可以通過小問題的解得出來,小問題是
相互獨立
的,可以通過遞迴來解決。
分治法所能解決的問題一般具有以下幾個特徵:
該問題的規模縮小到一定程度可以很容易地解決;
該問題可以分解成若干規模相同的子問題,即該問題具有最優子結構性質;
利用該問題分解出的子問題的解可以合併成該問題的解;
該問題所分解出的子問題是相互獨立的,即子問題不包含公共的子問題。
分治在每一層遞迴上都要完成分解、解決、合併三個操作。
歸併排序、堆排序、快速排序都有分治演算法的思想。
通常遇到的複雜問題不能簡單地分解成幾個子問題,而是會分解成一系列子問題並且
子問題並不是相互獨立
的,簡單地把大問題分解成子問題,並綜合子問題的解求出大問題的解的方法,問題求解時會按問題規模呈現
冪級數增加
。為了節約重複求相同子問題的時間,引入乙個陣列,不管他們是否對最終解有用,
把所有子問題的解存於該陣列中
,這就是
動態規劃法
所採用的基本方法。典型的fibonacci數列的求解就運用了動態規劃的思想。
貪婪演算法 動態規劃 分治法比較
1,貪婪演算法 一步步走,每走一步都是當前最優的。使用要求 無後向性,比如n個活動安排,只要安排了某個活動,那麼後面活動怎麼安排和前面的選擇無關。注 每一步都是選最棒的,那麼這個最棒是怎麼定義的?什麼標準 看下面這個例子 貪心法標準的選擇 設有n個正整數,將它們連線成一排,組成乙個最大的多位整數。例...
常見演算法思想之動態規劃 貪婪演算法
最近總是跟動態規劃打交道,索性就將其弄明白一點。所謂的動態規劃並不是一種具體的演算法,而是一種演算法的思想。思想總是抽象的,縹緲的。所以在學習動態規劃的時候會有一種很尷尬的情況,就是感覺這個東西很簡單,但是又不知道自己是不是真的學會了。簡單的來說,動態規劃就是將乙個大問題分解為子問題,然後根據子問題...
分治演算法和動態規劃
分治法與動態規劃主要共同點 二者都要求原問題具有最優子結構性質,都是將原問題分而治之,分解成若干個規模較小 小到很容易解決的程式 的子問題.然後將子問題的解合併,形成原問題的解.分治法與動態規劃實現方法 分治法通常利用遞迴求解.動態規劃通常利用迭代法自底向上求解,但也能用具有記憶功能的遞迴法自頂向下...