動態規劃 最優二叉搜尋樹

2021-07-04 23:08:12 字數 1432 閱讀 3320

動態規劃與分治方法類似,都是通過組合子問題來求解原問題。通常用來求解最優化問題,通常按如下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內,...