最優二分檢索樹
最優二分檢索樹問題:求一棵使得預期成本最小的二分檢索樹
或是一棵空樹;或者是具有如下性質的非空二叉樹:
(1)左子樹的所有結點均小於根的值;
(2)右子樹的所有結點均大於根的值;
對於乙個給定的識別符號集合,可能有若干棵不同的二分檢索樹:
不同形態的二分檢索樹對識別符號的檢索效能是不同的。
設給定的識別符號集合是,並假定a1<a2< … < an。設,p(i)是對ai檢索的概率,q(i)是正被檢索的識別符號x恰好滿足: ai<x<ai+1,0≤i≤n(設a0=-∞,an+1=+∞)時的概率,即一種不成功檢索情況下的概率。
內結點:代表成功檢索情況,剛好有n個
外結點:代表不成功檢索情況,剛好有n+1個
平均檢索成本=σ每種情況出現的概率×該情況下所需的比較次數
平均檢索成本的構成:成功檢索成分+不成功檢索成分
●成功檢索:在內結點終止的成功檢索 p(i)*level(ai) ; 其中,level(ai)= 結點ai的級數=l
●不成功檢索:外部結點的不成功檢索的成本分擔額為:q(i)*(level(ei)-1)
最優二分檢索樹問題:求一棵使得預期成本最小的二分檢索樹
把構造二分檢索樹的過程看成一系列決策的結果。
決策的策略:決策樹根,如果存在一棵二分檢索樹,ak是該樹的根,則內結點a1,a2,…,ak-1和外部結點e0,e1,…,ek-1將位於根ak的左子樹中,而其餘的結點將位於右子樹中。
● 左、右子樹的預期成本——左、右子樹的根處於第一級
● 左、右子樹中所有結點的級數相對於子樹的根測定,而相對於原樹的根少1
若t最優二分檢索樹,則cost(l)和cost(r)將分別是包含a1,a2,…,ak-1和e0,e1,…,ek-1、及ak
+1, ak+2, …,an和ek,ek+1,…,en的最優二分檢索(子)樹。記由ai+1,ai+2,…,aj和ei,ei+!,…,ej構成的二分檢索樹的成本為c(i,j),則對於最優二分檢索樹t有,
c[i,j] 表示點i+1,i+2到點j所組成的最優解
w[i,j] 表示i-j所有節點的概率和,因為在左右子樹新增乙個根節點,導致左右子樹的所有節點的深度增加了1,所以加上w[i,j]
設n=4,且(a1,a2,a3,a4)=(do,if,read,while)。設p(1:4) = (3,3,1,1),q(0:4) = (2,3,1,1,1) (概率值「擴大」了16倍)
初始:w(i,i)=q(i) c(i,i)=0 r(i,i)=0
1、計算w c r
2、計算結果
3、二分檢索樹:
t04=2 =>t01(左子樹),t24(右子樹) 即0到4以2為分界
t01=1 =>t00(左子樹),t11(右子樹)
t24=3 =>t22(左子樹),t34(右子樹)
4、樹的形態
最優二分檢索樹
前面給出了二分檢索樹的定義,下圖給出了關於保留字的乙個子集的兩棵二分檢索樹。為了確定識別符號x是否在一棵二分檢索樹中出現,將x先與根比較,如果x比根中識別符號小,則檢索在左子樹中繼續 如果x等於根中識別符號,則檢索成功地終止 否則檢索在右子樹中繼續下去。上述步驟可以形式化為過程search。line...
java實現二分檢索樹
二分檢索樹的左子樹比根小,右子樹比根大。這裡用二分檢索樹實現了乙個符號表,包括常用的api。package symbolform import structure.queue public class bst,v implements symbolform public node node n ov...
二分檢索歸納
二分法搜尋並不是什麼很高深的演算法,任何時候需要編寫乙個這樣的演算法恐怕都不是難事,甚至c 標準庫里已經有相關數但是當現在的我看到二分法搜尋的 仁需要想一想是否確實是這樣寫的時候,我就知道我應該要寫一篇這樣的總結,把我對二法這個說難不難的問題梳理歸納一下,這樣即使以後忘記了也能夠比較完整地回憶起這方...