動態規劃與分治方法類似,都是通過組合子問題來求解原問題。通常用來求解最優化問題,通常按如下4個步驟設計乙個動態規劃演算法:
1.刻畫乙個最優解的結構特徵;
2.遞迴的定義最優解的值;
3.採用自底向上的方法計算最優解的值;
4.利用計算出的資訊構造乙個最優解。
二叉搜尋樹(optimal binary search tree,obst): 對於key 都有個p 表示搜尋到的概率,q表示沒有搜尋到概率,比如q1 表示搜尋數字位於
k1 和 k2 之間的概率,q0表示小於k1的概率。如果找到了key, 則相應的『p』 則記錄,否則『q』 加入
定義舉個例子吧:
有n=6,6個點,p1=10,p2 =3,p3=9,p4=2,p5=0,p6=10; q0 =5,q1=6,q2=4,q3=4,q4=3,q5=8,q6=0, 則首先計算w以及c
根據min的結果,記錄root節點,並填表,最後完成的root**。
根據最後的r**,計算得到obst
根據上面例子,很容易寫如下**: **部分,計算
m = r[i][j-1]; k = m+1; k <= r[i+1][j]; 是往r矩陣斜向下(副對角線)方向延伸
1. compute_w_c_r
void compute_w_c_r()
//construct cost matrix c and root matrix r
for(i = 0; i <= number_of_keys; i++)
c[i][i] = w[i][i];
for(i = 0; i <= number_of_keys - 1; i++)
// calculate min i
//construct the optimal binary search tree
obst *construct_obst(int i, int j)
return p;
}
最優二叉搜尋樹動態規劃
最優二叉搜尋樹問題是對於有序集s及其訪問概率或權值 q0,p1,q1,p2,q2,p3,q3 在所有表示有序集s的二叉搜尋樹中找出一顆具有最小平均路長的二叉搜尋樹。解決方法 使用動態規劃方法自底向上逐步構造最優二叉搜尋樹。動態規劃的兩個重要要素是 1 最優子結構。2 重疊子問題。1 所謂最優化子結構...
動態規劃最優二叉搜尋樹
前面的optimal bst還能寫出來,要去construct就不會了,也是理解不夠深刻的原因吧。以下 的construct用了兩種方法,參照了兩位博主,前乙個 風格非常暴力,能看懂以後寫不出來系列。第二種的d的輸出那我沒有看出邏輯,好像是用的輸出的相鄰兩個下標是在同乙個節點上連著?這個的理由我沒想...
動態規劃之最優二叉搜尋樹
在看這張之前,最好看看我寫的 動態規劃詳解 裡面都是講理論基礎,我下面的分析都是在此基礎上進展的。給定乙個由n個互異的關鍵字組成的序列k k1,k2,kn 且關鍵字有序 因此有k1 k2 kn 從這些關鍵字中構造一棵二叉查詢樹。對每個關鍵字ki,一次搜尋為ki的概率是pi。某些搜尋的值可能不在k內,...