最優二叉搜尋樹動態規劃

2021-07-07 08:45:43 字數 1083 閱讀 1928

最優二叉搜尋樹問題是對於有序集s及其訪問概率或權值(q0,p1,q1,p2,q2,p3,q3),在所有表示有序集s的二叉搜尋樹中找出一顆具有最小平均路長的二叉搜尋樹。

解決方法:

使用動態規劃方法自底向上逐步構造最優二叉搜尋樹。

動態規劃的兩個重要要素是:

1、最優子結構。2、重疊子問題。

1)所謂最優化子結構是說若問題的乙個最優解中包含了子問題的最優解,則該問題具有最優子結構。

2)重疊子問題,是指在遞迴解決方案中,若產生了大量的相同子問題,那麼相同的子問題就會被重複計算很多次,這樣演算法的效率損耗就很大。

問題中,q0,q1,q2,q3為外部節點,即搜尋不成功的權值或概率,p1,p2,p3為內部節點,即搜尋成功的權值或概率,t[i][j]為一顆從i到j的子樹,w[i][j]來存放累計權值,c[i][j]為一顆樹的代價,r[i][j]存放一棵樹的根。

<1>、演算法思路:

(1)、構造只有乙個內部節點的最優二叉搜尋樹:

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

r[i-1][i]=i

(2)、構造具有m(m>=2)個內部節點的最優二查搜尋樹:

c[i][j]=w[i][j]+min,i

r[i][j]=k,i

<2>、演算法**:

#includeusing namespace std;

const int n = 3;

int r[n+1][n+1];//存放各最優二叉樹搜尋樹的根

int c[n+1][n+1];//最優二查搜尋樹的代價(最小平均路長)

int w[n+1][n+1];//存放內部節點外部節點的累計權值

void obst(int *p,int *q,int n);

void printobst(int r[n+1][n+1],int i,int j,int n,int f,char ch);

int main()

;//內部節點的權值

int q=;//外部節點的權值

cout<<"內部節點的權值為:"<0)

int m=k+1;

if(t<=j)

}}

動態規劃 最優二叉搜尋樹

動態規劃與分治方法類似,都是通過組合子問題來求解原問題。通常用來求解最優化問題,通常按如下4個步驟設計乙個動態規劃演算法 1.刻畫乙個最優解的結構特徵 2.遞迴的定義最優解的值 3.採用自底向上的方法計算最優解的值 4.利用計算出的資訊構造乙個最優解。二叉搜尋樹 optimal binary sea...

動態規劃最優二叉搜尋樹

前面的optimal bst還能寫出來,要去construct就不會了,也是理解不夠深刻的原因吧。以下 的construct用了兩種方法,參照了兩位博主,前乙個 風格非常暴力,能看懂以後寫不出來系列。第二種的d的輸出那我沒有看出邏輯,好像是用的輸出的相鄰兩個下標是在同乙個節點上連著?這個的理由我沒想...

動態規劃之最優二叉搜尋樹

在看這張之前,最好看看我寫的 動態規劃詳解 裡面都是講理論基礎,我下面的分析都是在此基礎上進展的。給定乙個由n個互異的關鍵字組成的序列k k1,k2,kn 且關鍵字有序 因此有k1 k2 kn 從這些關鍵字中構造一棵二叉查詢樹。對每個關鍵字ki,一次搜尋為ki的概率是pi。某些搜尋的值可能不在k內,...