最優二分檢索樹

2021-09-06 12:39:32 字數 1938 閱讀 8256

前面給出了二分檢索樹的定義,下圖給出了關於保留字的乙個子集的兩棵二分檢索樹。

為了確定識別符號x是否在一棵二分檢索樹中出現,將x先與根比較,如果x比根中識別符號小,則檢索在左子樹中繼續;如果x等於根中識別符號,則檢索成功地終止;否則檢索在右子樹中繼續下去。上述步驟可以形式化為過程search。

line void search (binarytree t,elemtype x,int

i) ;//

檢索成功

4else

5if(x//

檢索左子樹

6else ; //

檢索右子樹

7 };//

while

8 }//

search

已知乙個固定的識別符號集合,希望產生一種構造二分檢索樹的方法。可以預料,同乙個識別符號集合有不同的二分檢索樹,而不同的二分檢索樹有不同的效能特徵。

下面說說不成功檢索的含義:為了得到二分檢索樹的成本函式,在這棵檢索樹的每一棵空子樹的位置上加上乙個虛構的結點,即外部結點,它們在圖4.2中畫成方框。所有其它結點是內部結點。如果一棵二分檢索樹表示n個識別符號,那麼正好有n個內部結點和n+1個外部結點。每個內部結點代表一次成功檢索可能終止的位置。每個外部結點表示一次不成功檢索可能終止的位置。

二分檢索樹的預期成本可用公式表示如下:

σp(i)*level(ai) + σq(i)*(level(ei)-l)

1≤i≤n 0≤i≤n

定義識別符號集(a1,a2,…,an)的最優二分檢索樹是一棵使(4.1)式取最小值的二分檢索樹。

如果t是最優的,則(4.2)式必定是最小值。進而cost(l)對於包含a1,a2,…,ak-1和e0,el,…,ek-1的所有二分檢索樹必定是最小值,同理cost(r)也必定是最小值。

如果用c(i,j)表示包含ai+1,…,aj和ei,…,ej的最優二分檢索樹的成本,那麼要讓t是最優的,就必須有:

cost(l) = c(0,k-1)和cost(r) = c(k,n)

而且應該選擇k使得 p(k) + c(0,k-1) + c(k,n) + w(0,k-1) + w(k,n) 取最小值。

因此,關於c(0,n)有

c(0,n) = min

0用下列步驟解(4.4)式可得c(0,n)。

首先計算所有使得j-i=1的c(i,j)(注意c(i,i)=0且w(i,i)=q(i),0≤i≤n);

接著計算所有使得j-i=2的c(i,j);

然後計算j-i=3的所有c(i,j),等等。

如果在這計算期間,記下每棵tij樹的根r(i,j),那麼最優二分檢索樹就可以由

這些r(i,j)構造出來。

需要指出的是,r(i,j)是使(4.4)式取最小值的k值。

下面舉個例子:找最小成本二分檢索樹

line void

obst(p,q,n) ;//

for5 (w(n,n),r(n,n),c(n,n)) = (q(n),0,0);6

for(m=2;m<=n;m++) 取最小值的r值;

//用knuth的結果解(4.4)式

11 c(i,j) = w(i,j) + c(i,k-1) +c(k,j);

12 r(i,j) =k;

13 };//

for14 };//

for15} //

obst

動態規劃 最優二分檢索樹

最優二分檢索樹 最優二分檢索樹問題 求一棵使得預期成本最小的二分檢索樹 或是一棵空樹 或者是具有如下性質的非空二叉樹 1 左子樹的所有結點均小於根的值 2 右子樹的所有結點均大於根的值 對於乙個給定的識別符號集合,可能有若干棵不同的二分檢索樹 不同形態的二分檢索樹對識別符號的檢索效能是不同的。設給定...

java實現二分檢索樹

二分檢索樹的左子樹比根小,右子樹比根大。這裡用二分檢索樹實現了乙個符號表,包括常用的api。package symbolform import structure.queue public class bst,v implements symbolform public node node n ov...

二分檢索歸納

二分法搜尋並不是什麼很高深的演算法,任何時候需要編寫乙個這樣的演算法恐怕都不是難事,甚至c 標準庫里已經有相關數但是當現在的我看到二分法搜尋的 仁需要想一想是否確實是這樣寫的時候,我就知道我應該要寫一篇這樣的總結,把我對二法這個說難不難的問題梳理歸納一下,這樣即使以後忘記了也能夠比較完整地回憶起這方...