動態規劃和分治法的初步認識

動態規劃和分治法都是對遞歸算法的一種運用。動態規劃和分治法都是用遞歸算法將一個問題分割成若干的子問題,對子問題進行求解,通過對子問題的組合來解決一個大問題。

 

分治法:核心思想就是分而治之。將一個問題分解成多個子問題,對每個子問題求解,再將子問題進行疊加,準確的說應該是組合,組合出的解就是最開始那個大問題的解。

分治法所能解決的問題一般具有以下幾個特徵:

1) 該問題的規模縮小到一定的程度就可以容易地解決

2) 該問題可以分解爲若干個規模較小的相同問題,即該問題具有最優子結構性質。

3) 利用該問題分解出的子問題的解可以合併爲該問題的解;

4) 該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子問題。

 

快速排序和歸併排序都是對分治法的經典應用。它們的思想都是將一個無序的序列進行分割,對分割出的子序列進行排序。快排是利用一個基準點讓一側小於基準點另一側大於基準點。而歸併排序是對兩個子序列進行合併,合併規則就是通過比較大小,合併成一個新的有序子序列。爲什麼要進行分割呢?這是因爲排序問題具有最優子結構,當子問題規模足夠小的時候非常容易的可以進行求解。依據分治法可以將很複雜的問題變得很簡單,而且效率非常高。

 

動態規劃:我覺得也是對一個問題進行分割,對子問題進行求解。動態規劃是對決策問題的求解方法。既然是決策,那麼必然存在好的決策和差的決策,動態規劃的目的就行尋找最優的決策。動態規劃不光具有子問題,而且還有很多子問題,這些子問題具有重疊性。所以動態規劃在求解子問題的同時要進行決策,決策的目的就是要保證求解每一部分的子問題所做出的決策都是最好的。那麼將每一步的決策組合的出來的最後決策也就是全局的最優決策。關於重疊子問題,我們解決每一個子問題時都會存在多個決策。那我們在做決策之間就會用到更小的子問題的結果。在選擇使用哪種決策的同時必然會對那個更小的子問題進行多次調用。如果我們每次調用都要對子問題進行求解的話就太浪費時間了。這是我們就可以使用記憶化所搜,也就是打表,將更小的子問題保存到表中。當然不用對所有的子問題的解都進行保存,那實在是太多了。我們只保存在那個局面下的最優解即可。就這樣一步一步的從最小的子問題開始,做出最優決策,將最優決策保存到表中,然後求解更大的子問題,求解中調用小問題解(已經存到了表中)。最後做出全局的最優決策。

動態規劃最經典的應用就是01揹包。在有限的空間內獲得最大價值的物品。我們可以將這個空間分割成一個不可再分的小空間,再由這個小空間一步一步到最大的空間。如過我每一個小空間拿到的都是最大價值,那我當我把這個空間裝滿的時候拿到的也一定是最大的價值。

 

再來說一說總體動態規劃和分治法。分治法只需要將問題分割,進行求解,然後將解進行組合,無需做其他的事情很簡單。而動態規劃就要複雜了,也是將問題分割,但是求解子問題的過程還要進行決策,選擇最好的,這就不容易了。分治法就是你只管分,分到你能解決,然後在把這些結果組合起來就行了。但是動態規劃是你不僅要分,還要在分完後進行決策,選擇你要組合那些解。

    以上就是在看完分治法後對於分治法和動態規劃的初步認識……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章