https://www.cnblogs.com/ChengzhiYang/p/12402529.htmlhtml
目錄spa
最優子結構和重疊子問題
最優子結構性質是指一個問題的最優解中所包含的全部子問題的解都是最優的。
動態規劃避開了遞歸時,重複計算相同子問題的過程,對每一個子問題只解一次,然後將其保存在一個
表格中,當再次須要的時候,查表獲取。
code
最優子結構性質:若是問題的解是最優的,則全部子問題的解也是最優的。在這裏,描述爲最優
路徑的子路徑也是最優的。
最優子結構證實:剪枝法
∵若是子路徑P1從開始到S1,j-1不是最優的,那麼必定存在一條從開始到S1,j-1的更優子路徑P2,
當用P2去替換原子路徑P1後,將獲得一條比原路徑更優的路線,這與假設從開始到S1,j是一條最
優路線矛盾。
∴子路徑P1必定也是最優的
htm
構造最優解結構(輸出最優路線)blog
給定一個矩陣序列<A1,A2,…,An>,其中矩陣Ai的維數爲Pi-1×Pi,要求計算A1×A2×…×An矩陣鏈乘的
乘法次數最少?
遞歸
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<m[i,j] m[i,j]=q s[i,j]=k //記錄最佳分裂點 return m and s
令給定序列X={x1,x2,…xm},另外一序列Z={z1,z2,…zk}是X的子序列必須知足:X的下標中存在一個
嚴格的遞增序i1<i2<…<ik,使得對全部的j均有Xij=Zj(1≤j≤k)。換句話說,子序列是原序列刪除
若干個元素所得。
對於序列X和Y,序列Z若是既是X的子序列又是Y的子序列,則Z是X和Y的公共子序列。
圖片
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
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={k1,k2,...,kn},其中k1<k2<…<kn;
pi:檢索關鍵字ki的機率
令d0,d1,…,dn表示不在關鍵字集K中的虛擬(dummy)關鍵字;
d0:小於k1的全部關鍵字;dn:大於kn的全部關鍵字;
di:介於ki和ki+1之間的全部關鍵字(i=1,2,…,n-1)
qi:檢索關鍵字di的機率
關鍵字檢索只有二種狀態 :成功檢索:找到關鍵字ki,機率爲pi; 不成功檢索:找到關鍵字di,機率爲qi;
總機率和 pi(i=1->n)+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。
io