算法設計與分析【7】幾個重要問題

1、分治法 vs 動態規劃

  • 相同點

    這個兩個方法都是講原問題分解爲若干個子問題遞歸或者迭代的求解子問題,通過子問題的解綜合得到原問題的解。這兩個算法的複雜度往往會受到子問題的影響。

  • 不同點

  1. 子問題不同:分治法的子問題要求是相互獨立且與原問題相同,而動態規劃的子問題可以是相互重疊的。特別的,在計算子問題時,動態規劃法會採用備忘錄的方法記錄子問題的解,以避免大量重複計算。
  2. 求解方向不同:分治法是自頂向下;動態規劃即可自底向上也可自頂向下。
  3. 複雜度:分治法的複雜度是指數級別,因爲分治法往往進行了更多重複的運算,導致複雜度很高;而動態規劃的獨立的子問題複雜度是多項式級別,不獨立的子問題多。
  4. 最優性:分治法未必會考慮最優性;動態規劃求解的子問題的解都是局部最優。

2、“揹包”問題:動態規劃 vs 貪心法

  • 對於0-1揹包問題,應該選擇動態規劃算法。貪心算法無法得到0-1揹包的最優解,原因是貪心法無法保證將揹包裝滿,且剩下閒置的揹包空間使得揹包單位重量價值降低了。在考慮0-1揹包問題時,應該比較物品是否選擇所導致的最終方案,依此做出最佳選擇,這樣就會存在一些互相重疊的子問題,這正是動態規劃算法求解的一重要特徵。
  • 對於揹包問題,應該選擇貪心法。因爲揹包問題可以只選擇物品的一部分,因此可以選擇 單位重量價值最高的物品優先裝入以保證得到最佳結果。
  • 這兩個問題都具有最優子結構性質,但是0-1揹包問題只能用動態規劃算法,而揹包問題只能用貪心法。

3、回溯法 vs 分支限界法

1、求解目標:回溯法可以找出滿足約束條件下的所有解;分支限界法是找出滿足約束條件下的一個解或者是在滿足約束條件的解下的某種意義下的最優解
2、 搜索方式不同:回溯法以深度優先方式搜索解空間樹;分支限界法以廣度優先或者最小消耗優先的方式搜索解空間樹。
3、 存儲空間要求不同:回溯法所需的額外輔助空間較分支限界法少。
4、解決問題不同:回溯法適合組合解空間問題;分支限界法適合組合優化問題。

4、動態規劃 vs 貪心法

  • 相同點
    都具有最優子結構性質
  • 不同點
    1、動態規劃一般得到的解爲全局最優解,而貪心法一般是局部最優解。
    3、動態規劃算法一般是自底向上的方式解子問題,而貪心法一般是自頂向下的方式解各子問題,以迭代的方式做出貪心選擇,每一次貪心選擇都會將問題簡化爲更小的子問題。

參考材料

mooc算法分析與設計
課程ppt

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