跟我一起學演算法 動態規劃

2021-10-03 11:49:25 字數 3195 閱讀 5511

目錄

最優子結構和重疊子問題

最優子結構性質是指乙個問題的最優解中所包含的所有子問題的解都是最優的。

動態規劃避開了遞迴時,重複計算相同子問題的過程,對每個子問題只解一次,而後將其儲存在乙個

**中,當再次需要的時候,查表獲取。

最優子結構性質:如果問題的解是最優的,則所有子問題的解也是最優的。在這裡,描述為最優

路徑的子路徑也是最優的。

最優子結構證明:剪枝法

∵如果子路徑p1從開始到s1,j-1不是最優的,那麼一定存在一條從開始到s1,j-1的更優子路徑p2,

當用p2去替換原子路徑p1後,將得到一條比原路徑更優的路線,這與假設從開始到s1,j是一條最

優路線矛盾。

∴子路徑p1一定也是最優的

遞迴定義最優路線的最快時間

最快時間 f=min(f1[n]+x1,f2[n]+x2)

要得到f值,需要計算fi[j]的每個值

f1[j]=min

f2[j]=min

遞迴初始值:f1[1]=e1+a(1,1); f2[1]=e2+a(2,1)

先確定此問題的底,然後再自底向上計算最優解值,o(n)

構造最優解結構(輸出最優路線)

給定乙個矩陣序列,其中矩陣ai的維數為pi-1×pi,要求計算a1×a2×…×an矩陣鏈乘的

乘法次數最少?

最優子結構

設矩陣a_i 的維數是 p_(i-1) * p_i,輸入序列為p0,p1...pn,則

假設子問題a_ij的解(a_i*a_(i+1)…a_j)是乙個最優解,則在aij中一定存在乙個最佳**點k(i≤k

遞迴定義最優解值

規模為n^2的輔助結構m[i,j]存放子鏈a_ij=(a_ia_(i+1)…a_j)的乘法次數,m[1,n]表示所有n個矩

陣鏈乘的乘法次數。m[i,j] 的規模為矩陣上三角=o(n^2)

i=j時,m[i,j] = 0

i自底向上計算最優解值

輔助結構s[i,j]用於記錄最佳**點k的位置

遞迴計算鏈長分別為2到n的矩陣鏈的最佳組合,長鏈計算依賴短鏈的最佳計算結果。

時間複雜度o(n^3)

matrix-chain-order(p)

n=length[p]-1

for i=1 to n

m[i,i]=0

for l=2 to n //l為鏈長

for i=1 to n-l+1 //具有n-l+1個鏈長為l的組合

j=i+l-1

m[i,j]=∞

for k=i to j-1 //找最佳**點k

q=m[i,k]+m[k+1,j]+ p_(i-1)*p_k*p_j

if q輸出最優解結構

令給定序列x=,另一串行z=是x的子串行必須滿足:x的下標中存在乙個

嚴格的遞增序i1lcs問題最優子結構性質

令x=,y=為二個序列,子串行z=是x和y的乙個最長公共

子串行,則:

遞迴定義lcs值

令c[i,j]存放子串行xi和yj的lcs長度,則:

自底向上計算lcs值

o(mn)

b[i,j]用於存放xi和yi的lcs是哪種情況,=0表示情況1,=1和-1分別表示x_m-1和y的lcs及x和y_m-1的lcs

def lcs_length(x,y):

m=len(x)

n=len(y)

for i in range(m):

c[i][0]=0

for j in range(n):

c[0][j]=0

for i in range(1,m):

for j in range(1,n):

if x[i]=y[j]:

c[i][j] = c[i-1][j-1] + 1

b[i][j] = 0

elif c[i-1][j]>=c[i][j-1]:

c[i][j]=c[i-1][j]

b[i][j] = 1

else:

c[i][j]=c[i][j-1]

b[i][j] = -1

return c,b

根據c和b輸出lcs

改進:直接由x[i] ?= y[j],c[i-1][j],c[i][j-1]判斷,可以取締b[i,j]。

def printlcs(c,x,y,i,j)

if i == 0 or j == 0:

return

if x[i] == y[j]:

printlcs(c,x,y,i-1,j-1)

print(x[i])

elif c[i-1][j]>=c[i][j-1]:

printlcs(c,x,y,i-1,j)

else

printlcs(c,x,y,i,j-1)

對於單個關鍵字的查詢,在紅黑樹上查詢時間為o(lgn),但若查詢的是一系列關鍵字且每個關鍵字

的查詢頻度值不同,此時從整體來看紅黑樹不能產生最少的時間。

令n個不同的關鍵字集k=,其中k1n)+pj(i=0->n)=1.

定義e(搜尋代價)= (depth(k_i)+1)*p_i(i=1->n) + (depth(d_i)+1)*q_i(i=0->n) =

1 + depth(k_i)*p_i(求和i=1->n) + depth(d_i)*q_i(求和i=0->n)

e最小的二叉查詢樹稱為 最優bst。

最優子結構

如果tr是一棵以kr為根且包含ki,…,…,kj的obst,那麼包含關鍵字ki,…kr-1的左子樹tl及包含

關鍵字kr+1,…,kj的右子樹tr也是obst。思想類似於找矩陣鏈的最佳**點。

遞迴定義最優解值

令e[i,j]為包含關鍵字ki,…,kj的obst平均檢索代價,則e[1,n]為所求解,其中i≥1,j≤n且j≥i-1

當j=i-1時,e[i,j]=q_i-1

當j>=i時,e[i,j] = min;其中

w(i,j)=p_k(求和k=i->j)+q_k(求和k=i-1 -> j);

自底向上計算最優解值

o(n^3)

跟我一起學攝影

咦 好巧!我也是攝影愛好者。咱們一起學習吧。或許你也有這樣的體驗,並茂的文章更能讓人快速進入學習狀態,更何況是攝影,必須有圖。下面是我彙總的資料,必須深入淺出,拒絕一切晦澀難懂。學習課本 1.佳能官網 能系統學習攝影知識,從入門 初級 中級 高階 高階。每個頁面講解乙個知識點,結合實際的拍攝效果,深...

跟我一起學 演算法導論 堆

encoding utf 8 遞迴 單條路 自下往上排序 defheap adjust data,s,m if2 s m return 宣告 預設父節點位置 temp s 1 左 子節點值 大於 父節點值 預設父節點位置 為 左子節點位置 ifdata 2 s 1 data temp temp 2 ...

跟我一起學演算法 分治法

目錄 應用2 快速排序 參考分治法 divide and conquer 對於具備以下特點的問題 分治法所能解決的問題一般具有以下幾個特徵 該問題的規模縮小到一定的程度就可以容易地解決 該問題可以分解為若干個規模較小的相同問題,即該問題具有最優子結構性質 利用該問題分解出的子問題的解可以合併為該問題...