動態編程是一種在數學和電腦科學中使用的,用於求解包含重疊子問題的最最佳化問題的方法。其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。動態編程的思想是多種演算法的基礎,被廣泛套用於電腦科學和工程領域。比較著名的套用實例有:求解最短路徑問題,背包問題,專案管理,網路流最佳化等。
概述
動態編程在查找有很多重疊子問題的情況的最優解時有效。它將問題重新組合成子問題。為了避免多次解決這些子問題,它們的結果都逐漸被計算並被保存,從簡單的問題直到整個問題都被解決。因此,動態編程保存遞歸時的結果,因而不會在解決同樣的問題時花費時間。
動態編程只能套用於有最優子結構的問題。最優子結構的意思是局部最優解能決定全局最優解(對有些問題這個要求並不能完全滿足,故有時需要引入一定的近似)。簡單地說,問題能夠分解成子問題來解決。
步驟
最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質(即滿足最最佳化原理)。最優子結構性質為動態規劃算法解決問題提供了重要線索。
子問題重疊性質。子問題重疊性質是指在用遞歸演算法自頂向下對問題進行求解時,每次產生的子問題並不總是新問題,有些子問題會被重複計算多次。動態規划算法正是利用了這種子問題的重疊性質,對每一個子問題只計算一次,然後將其計算結果保存在一個表格中,當再次需要計算已經計算過的子問題時,只是在表格中簡單地查看一下結果,從而獲得較高的效率。
實例
斐波那契數列
計算斐波那契數列的一個最基礎的演算法是,直接按照定義計算:
function fib(n)
if n = 0 or n = 1
return 1
return fib(n − 1) + fib(n − 2)
當n=5時,fib(5)的計算過程如下:
fib(5)
fib(4) + fib(3)
(fib(3) + fib(2)) + (fib(2) + fib(1))
((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
(((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1))
由上面可以看出,這種演算法對於相似的子問題進行了重複的計算,因此不是一種高效的演算法。實際上,該演算法的運算時間是指數級增長的。 改進的方法是,我們可以通過保存已經算出的子問題的解來避免重複計算:
array map [0...n] = { 0 => 0, 1 => 1 }
fib( n )
if ( map( n ) is cached )
return map( n )
return map( n ) = fib( n - 1 ) + fib( n - 2 )
將前n個已經算出的前n個數保存在數組map中,這樣在後面的計算中可以直接易用前面的結果,從而避免了重複計算。演算法的運算時間變為O(n)
相關詞條
-
《ASP動態網頁編程》
《ASP動態網頁編程》由《工作過程導向新理念叢書》編委會編寫,清華大學出版社出版。本書共10章,30課。前8章介紹了ASP編程的相關基礎知識;後2章為課...
圖書信息 內容簡介 圖書目錄 -
《JSP動態網頁編程》
《JSP動態網頁編程》是王麗菊,時武略編著的計算機類作品,由北京理工大學出版社在2009年6月1日出版。本書將以《JSP動態網頁編程》的主要知識體系為基...
內容簡介 本書特點 目錄 -
編程
編程是編寫程式的中文簡稱,就是讓計算機為解決某個問題而使用某種程式設計語言編寫程式代碼,並最終得到相應結果的過程。為了使計算機能夠理解人的意圖,人類就必...
執行原理 基本簡介 語言沿革 語言目錄 語言排行 -
ASP動態網站編程
ASP動態網站編程是由作者:石志國編著,清華大學出版社於2002年4月出版發行的圖書。
簡介 -
ASP動態網頁編程
《ASP動態網頁編程》是2009年10月1日清華大學出版社出版的一本圖書,作者是《工作過程導向新理念叢書》編委會。
內容簡介 圖書目錄 -
JSP動態網頁編程
《JSP動態網頁編程》是2009年北京理工大學出版社出版的圖書,作者是王麗菊、時武略。
內容簡介 圖書目錄 -
動態網站編程基礎
內容介紹 ...
內容介紹 -
ASP動態網頁編程(第2版)
《ASP動態網頁編程(第2版)》是2009-9-27出版的圖書,作者是叢書編委會圖書簡介本書針對中等職業學校教學與學生就業需求,按照新的“工作過程導向”...
圖書簡介 圖書前言 圖書目錄