問題描述(詳見演算法導論p212-p213)
對於給定關鍵字序列,構造一顆最優的二叉查詢樹t,使得在t內的一次搜尋的期望代價最小
前提概念
最優子結構
設包含有序關鍵字(ki, ..., kj)的最優二叉查詢樹以kr(i≤r≤j)為根節點,則其左子樹(ki, ..., kr-1)和右子樹(kr+1, ..., kj)也同樣為最優二叉查詢樹
遞迴表示式
作如下定義
遞迴表示式如下(推導過程見演算法導論p214-p215)
自底向上的求解
求解過程類似於矩陣鏈乘法問題
構造最優解
根據矩陣root中記錄的值進行構造
1,問題描述:給定乙個有序序列k={k12,問題分析:
在二叉樹中t內搜尋一次的期望代價為:
e[t]=
(depth(ki)+1)*pi //對每個i=1~n,搜尋成功情況
+(depth(di)+1)*qi //對每個i=0~n,搜尋失敗情況
3,問題求解:動態規劃
步驟一:尋找最優子結構。
乙個最優二叉樹的子樹必定包含連續範圍的關鍵字ki~kj,1<=i<=j<=n,同時也必須含有連續的虛葉子節點di-1~dj。
如果一棵最優二叉查詢樹t有一棵含有關鍵字ki~kj的子樹t',那麼,t'也是一棵最優查詢樹,這通過剪貼思想可以證明。
現在開始構造最優子結構:在ki~kj中,選定乙個r,i<=r<=j,使以kr為根,ki~k(r-1)和k(r+1)~kj為左右孩子的最優二叉樹。注意r=i或者r=j的情況,表示左子樹或右子樹只有虛葉子節點。
步驟二:乙個遞迴解。
定義e[i,j]為一棵包含關鍵字ki~kj的最優二叉樹的期望代價。當j=i-1時沒有真實的關鍵在,只有虛葉子節點d(i-1)。
於是:當j=i-1時,e[i,i-1]=q(i-1)。
當j>=i時,需要選擇合適的kr作為根節點,然後其餘節點ki~k(r-1)和k(r+1)~kj構造左右孩子。這時要考慮左右孩子這些節點成為乙個節點的子樹後,它的搜尋代價的變化:根據e[t]的計算,得知它們的期望代價增加了「子樹中所有概率的總和」w。
w[i,j]=
pl // 對每個l=i~j
+ql //對每個l=i-1~j
於是當j>=i時,e[i,j]=pr + (e[i,r-1]+w[i,r-1])+(e[r+1,j]+w[r+1,j]) = e[i,r-1] + e[r+1,j]+w[i,j];
步驟三:計算最優二叉樹的期望代價
e[i,j]=
q(i-1) //如果j=i-1
min(e[i,r-1] + e[r+1,j]+w[i,j]),如果i<=j,其中i<=r<=j
w[i,j] =
q(i-1) 如果j=i-1
w[i,j]=w[i,j-1]+pj+** 如果i<=j
最優二叉搜尋樹2
include stdio.h include stdlib.h include math.h define max 100 此函式返回一棵二叉樹的最小平均路長 n為有序集個數 a中存放在二叉樹中的葉節點找到x的概率 成功 b中存放在內節點上找到x的概率 失敗 s i j 存放最優子樹t i,j 根...
動態規劃 最優二叉搜尋樹
動態規劃與分治方法類似,都是通過組合子問題來求解原問題。通常用來求解最優化問題,通常按如下4個步驟設計乙個動態規劃演算法 1.刻畫乙個最優解的結構特徵 2.遞迴的定義最優解的值 3.採用自底向上的方法計算最優解的值 4.利用計算出的資訊構造乙個最優解。二叉搜尋樹 optimal binary sea...
最優二叉搜尋樹動態規劃
最優二叉搜尋樹問題是對於有序集s及其訪問概率或權值 q0,p1,q1,p2,q2,p3,q3 在所有表示有序集s的二叉搜尋樹中找出一顆具有最小平均路長的二叉搜尋樹。解決方法 使用動態規劃方法自底向上逐步構造最優二叉搜尋樹。動態規劃的兩個重要要素是 1 最優子結構。2 重疊子問題。1 所謂最優化子結構...