最優二叉搜尋樹:
給定乙個n個不同關鍵字的已排序的序列k=(因此k1有些要搜尋的值可能不在k中,因此,我們還有n+1個「偽關鍵字」d0,d1,d2,...,dn表示不在k中的值。d0表示所有小於k1的值,dn表示所有大於kn的值,對i=1,2,...,n-1偽關鍵字di表示所有在ki和k(i+1)之間的值。
對每個偽關鍵字di也都有乙個概率qi表示對應的搜尋頻率。
假定一次搜尋的代價等於訪問的結點數,即此次搜尋找到的結點在t中的深度再加1.那麼在t中進行一次搜尋的期望代價為:
對於乙個給定的概率集合,我們希望構造一棵期望搜尋代價最小的二叉搜尋樹,我們稱之為最優二叉搜尋樹。
用動態規劃方法求解此問題:
步驟1:最優二叉搜尋樹的結構:
考慮一棵二叉搜尋樹的任意子樹,它必須包含連續關鍵字ki,...,kj(1<=i<=j<=n),而且其葉結點必然是偽關鍵字d(i-1),....,dj。
最優子結構:
如果一棵最優二叉搜尋樹t中有一棵包含關鍵字ki,...,kj(1<=i<=j<=n)的子樹t『,那麼t'必然是包含關鍵字ki,...,kj和偽關鍵字d(i-1),....,dj的子問題的最優解。
步驟2:乙個遞迴演算法
root[i, j]儲存根結點kr的下標r。
步驟3:計算最優二叉搜尋樹的期望搜尋代價
def optimal_bst(p,q,n):
e=[[0 for j in range(n+1)]for i in range(n+2)]
w=[[0 for j in range(n+1)]for i in range(n+2)]
root=[[0 for j in range(n+1)]for i in range(n+1)]
for i in range(n+2):
e[i][i-1]=q[i-1]
w[i][i-1]=q[i-1]
for l in range(1,n+1):
for i in range(1,n-l+2):
j=i+l-1
e[i][j]=float("inf")
w[i][j]=w[i][j-1]+p[j]+q[j]
for r in range(i,j+1):
t=e[i][r-1]+e[r+1][j]+w[i][j]
if t
>>>
== restart: d:\program files\python\test\algorithms\演算法導論\39-optimal-bst.py ==
演算法導論 最優二叉搜尋樹
len是關鍵字的數目 p i 是ki關鍵字的概率,q i 是di偽關鍵字的概率 w是子樹的概率之和 子樹作為乙個節點的子樹後,depth 1,對總體的期望代價相當於加上子樹概率之和 e是子樹的期望代價 葉子 子樹 更大的子樹 完整的樹 root是樹根 e 1 1 代表乙個關鍵字建成的最優二叉搜尋樹 ...
動態規劃之最優二叉搜尋樹(演算法導論)
1 一些概念 二叉搜尋樹 在二叉樹中,對任意的節點x其左子樹的所有節點都不大於x.key,其右子樹的所有節點都不小於x.key。滿足此條件的二叉樹稱為二叉搜尋樹。對二叉搜尋樹進行中序遍歷將會得到乙個單調遞增的數列。最優二叉樹 在二叉樹中,不同的節點都有不同的訪問頻率。為了減少查詢某個節點所需要遍歷的...
演算法導論 二叉搜尋樹
搜尋樹資料結構支援許多動態集合操作,包括search minimum maximum predecessor successor insert和delete等。因此,我們使用一棵搜尋樹既可以作為乙個字典又可以作為乙個優先佇列。二叉搜尋樹上的基本操作所花費的時間與這棵樹的高度成正比。對於乙個有n個結點...