遞歸;分治及動態規劃的區別

本文介紹算法中易混淆的幾個概念,分別是遞歸,分治與動態規劃。很明顯,題目中的分號表明遞歸與後兩者是不同層次的概念。

 遞歸:
我更傾向於遞歸是一種編程技巧,遞歸的邏輯簡單,但是內存佔用大(棧存儲變量、操作等等);常見的遞歸問題如爬樓梯、漢諾塔、快排等等。

分治策略:
將原問題分解爲若干個規模較小但類似於原問題的子問題(Divide),「遞歸」的求解這些子問題(Conquer),然後再合併這些子問題的解來建立原問題的解。因爲在求解大問題時,需要遞歸的求小問題,因此一般用「遞歸」的方法實現,即自頂向下。

動態規劃(Dynamic Programming)
動態規劃其實和分治策略是類似的,也是將一個原問題分解爲若干個規模較小的子問題,遞歸的求解這些子問題,然後合併子問題的解得到原問題的解。
區別在於這些子問題會有重疊,一個子問題在求解後,可能會再次求解,於是我們想到將這些子問題的解存儲起來,當下次再次求解這個子問題時,直接拿過來就是。
其實就是說,動態規劃所解決的問題是分治策略所解決問題的一個子集,只是這個子集更適合用動態規劃來解決從而得到更小的運行時間。
即用動態規劃能解決的問題分治策略肯定能解決,只是運行時間長了。因此,分治策略一般用來解決子問題相互對立的問題,稱爲標準分治,而動態規劃用來解決子問題重疊的問題。

將「動態規劃」的概念關鍵點抽離出來描述就是這樣的:

1.動態規劃法試圖只解決每個子問題一次
2.一旦某個給定子問題的解已經算出,則將其記憶化存儲,以便下次需要同一個子問題解之時直接查表。動態規劃自底向上(迭代而非遞歸)求解問題,避免重複計算。
動態規劃的例子如爬臺階問題(以斐波那契數列迭代求解)、挖金礦問題(當前金礦挖或不挖)。

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