项目中要使用到动态规划该怎么应用,怎么说?
因為前一段接了個項目,所以呢,其實在前一段時間我就有寫過關于動態規劃的一篇文章——淺談一下這個所謂的特殊算法——動態規劃!鏈接如下:
https://blog.csdn.net/qq_41946557/article/details/104704964
但是在項目的講述中,如果我要使用到它,我怎么講述?忽的這樣一想,好像對其算法好像并沒有自己想的那個隨意。所以再來說到說到這個動態規劃!
我們在一些搜索引擎上搜索——基于動態規劃時,你會發現關于使用動態規劃的領域,可謂是各行各業。比如:基于動態規劃的資源分配問題,基于動態規劃的路徑規劃方法等等等。其實早在最初的淺談動態規劃中,我就提出過DP實際意義上說是一個方法,并非一個算法!!
下面我先主要針對于動態編程進行一定的解釋說明:
維基百科的意思大致是:動態編程既是數學優化方法又是計算機編程方法。該方法是由理查德·貝爾曼(Richard Bellman)在1950年代開發的,并且已在從航空工程到經濟學的許多領域中得到應用。在這兩種情況下,它都是指通過以遞歸方式將其分解為更簡單的子問題來簡化一個復雜的問題。盡管無法以這種方式解決某些決策問題,但是跨越多個時間點的決策通常會遞歸拆分。同樣,在計算機科學中,如果可以通過將問題分解為子問題然后遞歸地找到子問題的最優解來最佳地解決問題,則可以說它具有最優子結構。
動態編程的介紹
動態編程是解決優化問題的最強大的設計技術。
分而治之算法將問題劃分為不相交的子問題,然后遞歸地解決子問題,然后結合其解決方案來解決原始問題。
當子問題不是獨立的時,例如當它們共享相同的子問題時,使用動態編程。在這種情況下,分治法可能會做比必要的更多的工作,因為它可以多次解決同一個子問題。
動態編程僅解決每個子問題一次,并將結果存儲在表中,以便在需要時可以重復檢索它。
動態編程是一種**自下而上的方法-**我們解決所有可能的小問題,然后結合以獲得更大問題的解決方案。
動態規劃是一種算法設計的范式,其中,通過實現子問題解決方案以及出現“ 最優原理 ” 的組合來解決優化問題。
動態編程的特點
當問題具有以下特征時,動態編程將起作用:
- **最優子結構:**如果最優解決方案包含最優子解決方案,那么問題將表現出最優子結構。
- **子問題重疊:**當遞歸算法將重復訪問相同的子問題時,則問題將具有子問題重疊。
如果問題具有最佳子結構,則可以遞歸定義最佳解決方案。如果問題有重疊的子問題,那么我們可以通過僅計算每個子問題一次來改進遞歸實現。
如果問題沒有最佳子結構,則沒有基礎來定義遞歸算法以找到最佳解決方案。如果一個問題沒有重疊的子問題,那么使用動態編程就無濟于事。
如果子問題的空間足夠大(即輸入大小為多項式),則動態編程比遞歸更有效。
動態編程的要素
基本上,三個要素是動態編程算法的特征:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SWAX3nC3-1584971186276)(https://static.javatpoint.com/tutorial/daa/images/elements-of-dynamic-programming.png)]
注意:自下而上是指:-
動態編程的組成部分
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Lzi92vLo-1584971186276)(https://static.javatpoint.com/tutorial/daa/images/components-of-dynamic-programming.png)]
動態規劃算法的發展
它可以分為四個步驟:
動態編程的應用
簡單舉一個動態編程的例子
太少寫算法的東西,所以這里以斐波那契做一個例子。后面舉幾個其他的例子,自行演示吧
斐波那契數是以下整數序列中的數字。
0,1,1,2,3,5,8,13,21,34,55,89,144,…
用數學術語來說,斐波納契數的序列Fn由遞歸關系定義
F n = F n-1 + F n-2具有種子值
F 0 = 0和F 1 = 1。給定數字n,打印第n個斐波那契數。
例子:
方法1(使用遞歸)
一種簡單的方法,它是上面給出的直接遞歸實現數學遞歸關系。
//Fibonacci Series using Recursion class fibonacci { static int fib(int n) { if (n <= 1) return n; return fib(n-1) + fib(n-2); } public static void main (String args[]) { int n = 9; System.out.println(fib(n)); } } /* This code is contributed by Rajat Mishra */輸出量
34時間復雜度: T(n)= T(n-1)+ T(n-2)是指數的。
我們可以觀察到該實現做了很多重復的工作(請參見下面的遞歸樹)。因此,對于第n個斐波那契數,這是一個錯誤的實現。
*額外空間:*如果考慮函數調用堆棧的大小,則為O(n),否則為O(1)。
方法2(使用動態編程)
通過存儲到目前為止計算出的斐波那契數,我們可以避免方法1的重復工作。
當然這只是使用動態規劃進行的優化,具體優化還有比如優化空間、使用矩陣等方式。
其他高深的關于動態規劃的算法自行百度吧。或者關注一下,等我下次有空專門來一篇。哈哈
其實根據上述的例子,你或許就有了一些想法和思路,沒錯在整體的數據分析中,比如最近開展的智慧交通,我們難免在大量的數據中分析各種TopN,那么每次的查詢我們都要進行重新的在大量的數據中進行去取TopN嗎?我們能不能使用一個動態規劃對程序進行優化,對每次的TopN進行存儲,避免每次的重復工作。當然不僅僅限于TopN的問題。在編程和計算中均可以進行應用,這也是目前我覺得最簡單的引用DP的方式。至于其他的后續再聊了。
我有一壺酒,足以慰風塵。感覺對你有點幫助的話,給個關注唄!或者點個贊再走嘍!
參考資料:https://www.javatpoint.com/dynamic-programming-introduction
總結
以上是生活随笔為你收集整理的项目中要使用到动态规划该怎么应用,怎么说?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Move or commit them
- 下一篇: 腾讯TEG团队打造轻量级数据可视化工具—