一般實際生活中我們遇到的演算法分為四類:
一》判定性問題
二》最優化問題
三》構造性問題
四》計算性問題
而今天所要總結的演算法就是著重解決 最優化問題
《演算法之道》對三種演算法進行了歸納總結,如下表所示:
標準分治
動態規劃
貪心演算法
適用型別
通用問題
優化問題
優化問題
子問題結構
每個子問題不同
很多子問題重複(不獨立)
只有乙個子問題
最優子結構
不需要必須滿足
必須滿足
子問題數
全部子問題都要解決
全部子問題都要解決
只要解決乙個子問題
子問題在最優解裡
全部部分
部分選擇與求解次序
先選擇後解決子問題
先解決子問題後選擇
先選擇後解決子問題
分治演算法特徵:
1)規模如果很小,則很容易解決。//一般問題都能滿足
2)大問題可以分為若干規模小的相同問題。//前提
3)利用子問題的解,可以合併成該問題的解。//關鍵
4)分解出的各個子問題相互獨立,子問題不再包含公共子問題。 //效率高低
【一】動態規劃:
依賴:依賴於有待做出的最優選擇
實質:就是分治思想和解決冗餘。
自底向上(每一步,根據策略得到乙個更小規模的問題。最後解決最小規模的問題。得到整個問題最優解)
特徵:動態規劃任何乙個i+1階段都僅僅依賴 i 階段做出的選擇。而與i之前的選擇無關。但是動態規劃不僅求出了當前狀態最優值,而且同時求出了到中間狀態的最優值。
缺點:空間需求大。
【二】貪心演算法:
依賴:依賴於當前已經做出的所有選擇。
自頂向下(就是每一步,根據策略得到乙個當前最優解。傳遞到下一步,從而保證每一步都是選擇當前最優的。最後得到結果)
【三】分治演算法:
實質:遞迴求解
缺點:如果子問題不獨立,需要重複求公共子問題
貪心演算法:貪心演算法採用的是逐步構造最優解的方法。在每個階段,都在一定的標準下做出乙個看上去最優的決策。決策一旦做出,就不可能再更改。做出這個區域性最優決策所依照的標準稱為貪心準則。
分治演算法:分治法的思想是將乙個難以直接解決大的問題分解成容易求解的子問題,以便各個擊破、分而治之。
動態規劃:將待求解的問題分解為若干個子問題,按順序求解子階段,前一子問題的解,為後一子問題的求解提供了有用的資訊。在求解任一子問題時,列出各種可能的區域性解,通過決策保留那些有可能達到最優的區域性解,丟棄其他區域性解。依次解決各子問題,最後乙個子問題就是初始問題的解。
二、演算法間的關聯與不同
1、分治演算法與動態規劃
分治法所能解決的問題一般具有以下幾個特徵:
① 該問題的規模縮小到一定程度就可以容易地解決。
② 該問題可以分為若干個較小規模的相似的問題,即該問題具有最優子結構性質。
③ 利用該問題分解出的子問題的解可以合併為該問題的解。
④ 該問題所分解出的各個子問題是相互獨立的且子問題即之間不包含公共的子問題。
上述的第一條特徵是絕大多數問題都可以滿足的,因為問題的計算複雜性一般是隨著問題規模的增加而增加;
第二條特徵是分治法應用的前提,它也是大多數問題可以滿足的,此特徵反映了遞迴思想的應用;
第三條特徵是關鍵,能否利用分治法完全取決於問題是否具有第三條特徵,如果具備了第一條和第二條特徵,而不具備第三條特徵,則可以考慮貪心演算法或動態規劃演算法;
第四條特徵涉及到分治法的效率,如果各個子問題不是獨立的,則分治法要做許多不必要的工作,重複地解公共的子問題。這類問題雖然可以用分治法解決,但用動態規劃演算法解決效率更高。
當問題滿足第
一、二、三條,而不滿足第四條時,一般可以用動態規劃法解決,可以說,動態規劃法的實質是: 分治演算法思想+解決子問題冗餘情況
2、貪心演算法與動態規劃演算法
多階段逐步解決問題的策略就是按一定順序或一定的策略逐步解決問題的方法。分解的演算法策略也是多階段逐步解決問題策略的一種表現形式,主要是通過對問題逐步分解,然後又逐步合併解決問題的。
貪心演算法每一步都根據策略得到乙個結果,並傳遞到下一步,自頂向下,一步一步地做出貪心決策。
動態規劃演算法的每一步決策給出的不是唯一結果,而是一組中間結果,而且這些結果在以後各步可能得到多次引用,只是每走一步使問題的規模逐步縮小,最終得到問題的乙個結果。
舉例:如圖1有一三角形數塔,求一自塔頂到塔底的路徑,要求該路徑上結點的值的和最大。
貪心演算法解題過程:自頂向下從第一層9開始,到第二層,選數值較大的15,第三層,在可選路徑中選數值較大的8,同理,第四層選9,第五層選10,這樣就確定了一條路徑:9→15→8→9→10。
動態規劃演算法接題過程:如圖2,階段1:自第五層開始,對經過第四層的2的路徑,在第五層的19、7中選擇數值較大的19,同理,對經過第四層18的路徑,選10,對經過第四層9的路徑,選10,對經過5的路徑選16。
以上是一次決策過程,也是一次遞推過程和降階過程。因為以上的決策結果將5階數塔問題變為4階子問題,遞推出第四層與第五層和為:
21(2+19),28(18+10),19(9+10),21(5+16)
用同樣的方法還可以將4階數塔問題變為3階數塔問題,……,最後得到1階數塔問題,這樣也確定了一條路徑:9→12→10→18→10,就是真個問題的最優解。
顯然,以上數塔問題用貪心演算法得不到最優解,這裡只是用作與動態規劃演算法的比較。
三、適用條件
貪心演算法:
①貪心選擇性質:在求解乙個問題的過程中,如果再每乙個階段的選擇都是當前狀態下的最優選擇,即區域性最優選擇,並且最終能夠求得問題的整體最優解,那麼說明這個問題可以通過貪心選擇來求解,這時就說明此問題具有貪心選擇性質。
②最優子結構性質:當乙個問題的最優解包含了這個問題的子問題的最優解時,就說明該問題具有最優子結構。
分治演算法:見
二、演算法間的關聯與不同中的①②③④。
動態規劃:
①最優化原理:如果問題的最優解所包含的子問題的解也是最優的,就稱該問題具有最優子結構,即滿足最優化原理。
②無後效性:即某階段狀態一旦確定,就不受這個狀態以後決策的影響。也就是說,某狀態以後的過程不會影響以前的狀態,只與當前狀態有關。
四、優勢:
採用動態規劃方法,可以高效地解決許多用貪婪演算法或分而治之演算法無法解決的問題。
但貪心演算法也有它的優勢:構造貪心策略不是很困難,而且貪心策略一旦經過證明成立後,它就是一種高效的演算法。
分治 遞迴 動態規劃 貪心演算法區別
三者之間沒有根本區別,關鍵看有無最優的子結構。共性 找到重複子問題 差異性 動態規劃尋找最優子結構,中間可以淘汰次優解 動態規劃是尋找區域性,全域性最優解 貪心演算法是找區域性最優解,不一定得到全域性最優解 回顧下遞迴四步驟 terminator process drill dowm restore...
動態規劃 分治 貪心 遞迴
一言以蔽之 dp 和分治 之間的區別就在於是否有重疊子問題 如果有那就應該dp 否則就應該分治。當然如果可以每一步都產生最優解那麼就不必dp了,貪心演算法就可以了.而遞迴只是一種實現演算法的方法.例子 下面分別用 dp,dc 分治法 貪心來做 leetcode 514.自由之路 golang 如下 ...
動態規劃,貪心,分治演算法的區別
以下摘自 演算法筆記 在區別它們之前我們先明確兩個概念 1.什麼是重疊子問題?如果乙個問題可以被分解為若干子問題,並且這些子問題會重複出現,那麼就稱這個問題為重疊子問題。2.什麼是最優子結構?如果乙個問題的最優解可以由其他子問題的最優解有效的構造出來,那麼這個問題擁有最優子問題。動態規劃與分治的區別...