1. 程式人生 > >遞迴+分治+貪心+動態規劃

遞迴+分治+貪心+動態規劃

遞迴

1. 定義:一個函式在結束之前,直接或間接呼叫自身稱為遞迴。

2. 思想:將一個不好解決的大問題轉化為若干小問題,再把這些小問題進一步分解為更小的小問題,直至每個小問題可以直接解決為止。

3. 要素

(1)遞迴體使問題向邊界條件轉化的過程

(2)邊界條件:程式終止的條件,也稱為遞迴出口。

4. 優缺點

   優點:程式結構簡單,易證明其正確性。

   缺點:難以理解,執行中佔記憶體空間較多,執行效率低。

5.本質:遞迴程式在執行中需藉助棧來實現(遞迴程式的入口語句和出口語句一般用條件判斷語句來實現)。

分治

1. 基本思想:將一個規模為n的問題分解為k個規模較小的子問題,這些子問題互相獨立且與原問題相同。找出各部分的解,然後把各部分的解組合成整個問題的解。

2. 歸併排序是典型的基於分治策略的演算法,它的主要思想就是將待排序的序列拆分為若干子序列,然後將子序列進行排序,然後將排好序的子序列合併。

貪心

1.兩個性質:

   (1)貪心選擇性質

      貪心選擇性質是指所求問題的整體最優解可以通過一系列區域性最優的選擇,即貪心選擇來達到。

      貪心演算法僅在當前狀態下作出最好選擇(所作的貪心選擇可以依賴於以往所作過的選擇,但決不依賴於子問題的解), 然後再去解作出這個選擇後產生的相應的子問題。

  (2)最優子結構性質

      當問題的最優解包含其子問題的最優解時,稱此問題具有最優子結構性質。   
2.存在問題:   
(1)不能保證求出最優解,因此不能用來求最大或最小解問題;   
(2)只能求滿足某些約束條件的可行解的範圍。

動態規劃

1. 動機消除遞迴過程中產生的大量重疊子問題

2. 多階段策略問題利用遞迴的思想, 把規模為n的問題轉化為規模為n-1的問題, 直到轉化為可以直接求解的原子問題. 一般情況下, 這樣的遞迴方法的時間複雜度是指數級別的, 但是如果所有不同的子問題的數目是多項式級別的, 那麼只需要多項式時間就可以解決這個問題, 這就是動態規劃的本質.

3. 演算法四個步驟:(1)描述最優解結構(2)狀態轉移方程(3)bottom-up求解(4)構造最優解(最優分割,最優路徑)

在動態規劃演算法中,每步所作的選擇往往依賴於相關子問題的解。因而只有在解出相關子問題後,才能作出選擇。

貪心和動態規劃的比較:

不同點:(1)

動態規劃演算法通常以自底向上的方式解各子問題,而貪心演算法則通常以自頂向下的方式進行;

               (2)動態規劃能求出問題的最優解,貪心不能保證求出問題的最優解

相同點:動態規劃演算法或貪心演算法都要求問題具有最優子結構性質