動態規劃 最優二分檢索樹

2021-09-06 09:39:47 字數 2177 閱讀 1799

最優二分檢索樹

最優二分檢索樹問題:求一棵使得預期成本最小的二分檢索樹

或是一棵空樹;或者是具有如下性質的非空二叉樹:

(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 標準庫里已經有相關數但是當現在的我看到二分法搜尋的 仁需要想一想是否確實是這樣寫的時候,我就知道我應該要寫一篇這樣的總結,把我對二法這個說難不難的問題梳理歸納一下,這樣即使以後忘記了也能夠比較完整地回憶起這方...