淺談動態規劃法與貪心法和回溯法的聯絡

鴨脖發表於2013-01-25

今天在建模的時候又回頭看了看自己的演算法課本,真是溫故而知新。這裡,我主要想從樹的角度來探討一下這三類演算法。


首先我想說的是,當你看到一個演算法的時候,腦子裡必須要有一個例項立馬出現,這樣才說明你對這個演算法算是有點掌握,否則看到一個演算法的時候,亂七八糟的演算法一下子都出來了,那麼說明你並沒有很好的理解這些演算法,而是把他們攪在一起了。


那麼看到這三種演算法,你應該有所出現:

貪心法是動態規劃法的特例,如0-1揹包,最小代價生成樹(prim演算法和cruskal演算法),huffman演算法,以及地傑斯特拉演算法。

動態規劃法是一種方法,注意和演算法的區別。如多段圖問題,備忘錄方法,弗洛伊德演算法,最長公共子序列問題

回溯法是比動態規劃法更加一般的演算法,如n皇后,子集和數問題


那麼,這三種有什麼區別呢?

首先,這些方法所要解決的問題,一般都是決策問題。而貪心法一般是來求解最優問題的,而且他們其實都是在對問題的狀態空間樹進行搜尋,在這個狀態空間樹中搜尋最佳的路徑以便求出最優策略。而貪心法是從上到下只進行深度搜尋的,也就是說它是一口氣走到黑的,一口氣吃成胖子的,它的代價取決於子問題的數目,也就是樹的高度,每次在當前問題的狀態上作出的選擇都是1,也就是說,它其實是不進行廣度搜尋的,這也造成了它的一個缺點:它得出的解不一定是最優解,很有可能是近似最優解。而動態規劃法在最優子結構的前提下,從狀態空間樹的葉子節點開始向上進行搜尋,並且在每一步都根據葉子節點的當前問題的狀況作出選擇,從而作出最優決策,所以她的代價就是子問題的個數和可選擇的數目,所以它求出的解一定是最優解。回溯法是從上到下進行深度搜尋,如果深度搜尋沒有進行到底而不滿足決策函式了,那麼不好意思,請回去,然後再從最近的可以岔開的地方選擇另一條路,繼續之前的深度搜尋,如果搜尋到底,那麼再通過for迴圈進行廣度搜尋。所以它也是深度搜尋和廣度搜尋並行的。求出的解也一定是最優解。

相關文章