貪心演算法和動態規劃 zz

2022-04-10 14:49:41 字數 2098 閱讀 9177

貪心演算法

1.貪心選擇性質

所謂貪心選擇性質是指所求問題的整體最優解可以通過一系列區域性最優的選擇,即貪心選擇來達到。這是貪心演算法可行的第乙個基本要素,也是貪心演算法與動態規劃演算法的主要區別在動態規劃演算法中,每步所作的選擇往往依賴於相關子問題的解。因而只有在解出相關子問題後,才能作出選擇。而在貪心演算法中,僅在當前狀態下作出最好選擇,即區域性最優選擇。然後再去解作出這個選擇後產生的相應的子問題。貪心演算法所作的貪心選擇可以依賴於以往所作過的選擇,但決不依賴於將來所作的選擇,也不依賴於子問題的解。正是由於這種差別,動態規劃演算法通常以自底向上的方式解各子問題,而貪心演算法則通常以自頂向下的方式進行,以迭代的方式作出相繼的貪心選擇,每作一次貪心選擇就將所求問題簡化為乙個規模更小的子問題。

對於乙個具體問題,要確定它是否具有貪心選擇性質,我們必須證明每一步所作的貪心選擇最終導致問題的乙個整體最優解。通常可以用我們在證明活動安排問題的貪心選擇性質時所採用的方法來證明。首先考察問題的乙個整體最優解,並證明可修改這個最優解,使其以貪心選擇開始。而且作了貪心選擇後,原問題簡化為乙個規模更小的類似子問題。然後,用數學歸納法證明,通過每一步作貪心選擇,最終可得到問題的乙個整體最優解。其中,證明貪心選擇後的問題簡化為規模更小的類似子問題的關鍵在於利用該問題的最優子結構性質。

2.最優子結構性質

當乙個問題的最優解包含著它的子問題的最優解時,稱此問題具有最優子結構性質。問題所具有的這個性質是該問題可用動態規劃演算法或貪心演算法求解的乙個關鍵特徵。在活動安排問題中,其最優子結構性質表現為:若a是對於正的活動安排問題包含活動1的乙個最優解,則相容活動集合a』=a—是對於e』=的活動安排問題的乙個最優解。

動態規劃

動態規劃的動機是消除遞迴過程中產生的大量重疊子問題, 兩種方法 : 記憶化搜尋 和 自底向上遞推.

無後效性,決策只取決於當前狀態的特徵因素, 而和到達此狀態的方式無關.

最優子結構, 在問題轉化為子問題時, 原問題最優當且僅當子問題最優.

決策, 狀態轉移方程就是決策, 對於多階段的決策問題, 如果具備最優子結構和無後效性, 就可以用動態規劃來解決它

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

1) 所有不同的子問題所組成的表(他包含的問題數目成為問題的大小).

2)問題解決得依賴關係可以看成是乙個圖.

3) 填充子問題的順序(實際上是2所得到的圖的拓撲排序).

如果子問題數目為o(n^t), 且每個子問題需要依賴o(n^e)個其他子問題, 則稱這個問題為td/ed的.

方程一(1d/1d):最長上公升子串行

定義乙個實函式w(i, j)(1<=ie[j] = min, 1<=i其中d[i]可以根據e[i]在常數時間裡計算出來.

方程二(2d/0d):最長公共子串行

已知d[i,0]和d[0,j](0<=i, j<=n), 狀態轉移方程為

e[i, j]=min

其中xi, yj, zij都可以在常數時間裡算出來

方程三(2d/1d)

定義實函式w(i, j)(1<=ic[i, j] = w(i, j) + min,1<=i方程四(2d/2d)

定義實函式w(i, j)(0<=ie[i, j] = min, 1<=i, j<=n

其中d[i, j]可以根據e[i, j]在常數時間裡算出來

向前遞推和向後遞推:遞迴模型容易算出狀態的前趨,適合順推; 用多階段決策建立模型, 容易算出狀態後繼, 適合逆推.

記憶化搜尋, 自頂向下遞迴, 可以避免無用狀態, 書寫簡單, 可以應用剪枝, 但是無法應用滾動陣列等優化手段.

recursivefunc(i, j){

if (calculated[i, j]) return memory[i, j];

fill calculated[i, j] and memory[i, j]

return memory[i, j]

動態規劃和貪心演算法

動態規劃 通過組合子問題的解來求解原問題,常用來求解最優化問題。常用來解決以下幾類問題,但不是說遇到類似問題必須用動態規劃來解決,可以往這方面去想 1.計數問題,如有多少種方式走到右下角,有多少種方法選出k個數使得和是sum 2.求最大最小值,如從左上角走到右下角路徑的最大數字和 3.求存在性,如取...

貪心演算法和動態規劃

貪心演算法 在求解問題時,總是做出在當前看來做好的選擇,所以它是區域性最優解,試圖通過區域性最優推出全域性最優。需要注意的是貪心演算法沒有固定的演算法框架,演算法設計的關鍵是選擇貪心策略,其必須具備無後效性,即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。常見的用貪心演算法解決的問題,比如...

貪心演算法 and 動態規劃

動態規劃dynamic programming 貪心演算法,又名貪婪法,是尋找最優解問題的常用方法 步驟1 從某個初始解出發 步驟2 採用迭代的過程,當可以向目標前進一步時,就根據區域性最優策略,得到一部分解,縮小問題規模 步驟3 將所有解綜合起來。假設你開了間小店,不能電子支付,錢櫃裡的貨幣只有 ...