分治、動態規劃、貪婪 之 算法分析

分治、動態規劃、貪婪  之 算法分析

分治動態規劃都用到了遞歸的思想,但是對他們之間的區別在概念上一直比較模糊,今天附帶貪婪選擇稍微整理一下他們。


算法之道上說,標準分治、動態規劃、貪婪選擇稱得上是孫子兵法的下、中、上策。標準分治雖然將大問題分解成小問題,但是每個小問題都需要解決,相當於逢城必攻實屬下策動態規劃則聰明地發現,很多子問題都相同,那麼重複的子問題可以不用重複計算,就是不對每個城市進行攻破,從而節省精力和兵力,但仍然需要攻克子問題中的相當部分,屬於中策;而貪婪選擇則將子問題限於一個,即將攻城數量減少到了最低,從而最大限度上減少了精力和兵力,屬於上策。不過就像兵法裏所云,上策運用地不好,就有失策的時候。貪婪思想運用地不當,或者在條件不充分或不明朗的條件下用,則會大敗而歸。


從另一個方面看,三種策略都爲了在求解問題的時候成本儘量低,因此,從這個方面看,三種策略的目標一致,但是標準分治策略的目標只是獲得問題的解動態規劃貪婪選擇不僅是要獲得一個解,而且應該是個最優解,因此貪婪選擇和動態規劃之間的相似性最多。不過雖然動態規劃和貪婪選擇策略有許多相同的地方,但是有時候並不容易看出來。貪婪選擇屬性指的是一個全局最優解決方案可以通過解決一個局部最優的選擇來獲得。對於一個貪婪算法來說,其選擇具有貪婪的性質,那麼對於動態規劃來說呢,他每一步都需要作出一個選擇,而是在已知子問題解的基礎上作出的當前最好的選擇,所以動態規劃每一步都需要運用貪心策略。也就是說,貪婪策略是在解決子問題前作出選擇,希望作出的選擇是正確的,是自頂向下動態規劃則是在求解子問題後作出選擇,是自底向上但不管是在之前還是之後做選擇,都是試圖作出最好的選擇。揹包問題可用貪心策略來解決。


分治法和遞歸是緊密聯繫的,分治就是把大問題分解成規模較小的子問題,然後大問題的解可以通過小問題的解得出來,小問題是相互獨立的,可以通過遞歸來解決。
分治法所能解決的問題一般具有以下幾個特徵:
該問題的規模縮小到一定程度可以很容易地解決;
該問題可以分解成若干規模相同的子問題,即該問題具有最優子結構性質;
利用該問題分解出的子問題的解可以合併成該問題的解;
該問題所分解出的子問題是相互獨立的,即子問題不包含公共的子問題。
分治在每一層遞歸上都要完成分解、解決、合併三個操作。

歸併排序、堆排序、快速排序都有分治算法的思想。


通常遇到的複雜問題不能簡單地分解成幾個子問題,而是會分解成一系列子問題並且子問題並不是相互獨立的,簡單地把大問題分解成子問題,並綜合子問題的解求出大問題的解的方法,問題求解時會按問題規模呈現冪級數增加。爲了節約重複求相同子問題的時間,引入一個數組,不管他們是否對最終解有用,把所有子問題的解存於該數組中,這就是動態規劃法所採用的基本方法。典型的Fibonacci數列的求解就運用了動態規劃的思想。
發佈了49 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章