演算法導論程式39 最優二叉搜尋樹(Python)

2021-08-01 21:03:05 字數 2138 閱讀 5490

最優二叉搜尋樹:

給定乙個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個結點...