演算法設計 動態規劃

2021-06-26 14:26:37 字數 2618 閱讀 7242

•動態規劃演算法的設計步驟

–分析優化解的結構

–遞迴地定義最優解的代價

–自底向上地計算優化解的代價儲存之,並獲取構造最優解的資訊

–根據構造最優解的資訊構造優化解

•使用dynamic programming的條件 –

optimal substructure

(優化子結構)

•當乙個問題的優化解包含了子問題的優化解時,我們說這個問題具有優化子結構。

•縮小子問題集合,只需那些優化問題中包含的子問題,減低實現複雜性

•優化子結構使得我們能自下而上地完成求解過程 –

subteties

(重疊子問題)

•在問題的求解過程中,很多子問題的解將被多次使用

最長公共子串行(longest common 

susequence)

公共子串行

–z是序列x與y的公共子串行,如果z是x的子序也是y的子串行。

最長公共子串行(lcs)問題

輸入:x = (x1,x2,...,xn),y = (y1,y2,...ym)

輸出:z = x與y的最長公共子串行

x和y的lcs的優化解結構為

子問題重疊性

遞迴方程

•計算lcs長度的演算法 –

資料結構

c[0:m,0:n]:

c[i,j]是

xi與y

j的lcs的長度

b[1:m,1:n]:

b[i,j

]是指標,指向計算

c[i,j

]時所選擇的子問題的優化解

所對應的

c表的表項 

列印最長子序列

•基本思想 –

從b[m, n]

開始按指標搜尋 –

若b[i, j]=「↖

」,則x

i=yj

是lcs

的乙個元素 –

如此找到的

「lcs」是

x與y的

lcs的

inverse 

print-lcs(b, x,i, j)

if i=0 or  j=0  then return;

if b[i, j]=「↖」 

then  print-lcs(b, x, i-1, j-1); print xi;

else   if   b[i, j]=「↑」 

then   print-lcs(b, x, i-1, j);

else   print-lcs(b, x, i, j-1).

矩陣鏈乘法

問題描述

•輸入:,  ai是矩陣

•輸出:計算a1´a2´...´an的最小代價方法

問題特徵

–矩陣乘法滿足結合率。

–計算乙個矩陣鏈的乘法可有多種方法:

–不同計算順序有不同的代價

矩陣鏈乘法優化問題的解空間

–設p(n)=計算n個矩陣乘積的方法數

–p(n)的遞迴方程

優化解的結構

–若計算a1~n的優化順序在k處斷開矩陣鏈, 即a1~n=a1~kxak+1~n,則在a1~n的優化順序中,對應於子問題a1~k的解必須是a1-k的優化解,對應於子問題ak+1~n的解必須是ak+1~n的優化解。

考慮到所有的k,優化解的代價方程為

m[i, j] =計算ai ~j的最小乘法數

子問題重疊性

演算法偽**:

演算法複雜性分析

•時間複雜性 –

計算代價的時間

•(l,

i, k)

三層迴圈

,每層至多

n-1步

•o(n3)

–構造最優解的時間

:o(n)

–總時間複雜性為:

o(n3)

•空降複雜性 –

使用陣列m和

s – 需要空間

o(n2)

演算法設計 動態規劃問題

適合採用動態規劃 dynamic programming 方法的最優化問題中的兩個要素 最優子結構和重疊子問題。最優子結構 用動態規劃求解最優化問題的第一步就是刻畫最優解的結構,如果乙個問題的解結構包含其子問題的最優解,就稱此問題具有最優子結構性質。因此,某個問題是否適合應用動態規劃演算法,它是否具...

演算法設計與分析 動態規劃

最大子段和問題 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。i.當所有整數均為負值時定義其最大子段和為0。所求的最優值為 i.例如,當 a1,a2,a7,a8 1,3,7,8,4,12,10,6 時,最大子段和為 bj是1到j位置的最大子段和 由bj的定義易知,當...

演算法設計與分析 動態規劃

分治技術的問題 子問題是相互獨立的 如果子問題不是相互獨立的,分治演算法將重複計算公共子空間,效率很低 提高效率的方法 從規模最小的子問題開始計算 用恰當資料結構儲存子問題的解,供以後查詢 確保每個子問題只求解一次 優化問題 給定一組約束條件和乙個代價函式,在解空間中搜尋具有最小或最大代價的優化解 ...