簡體   English   中英

動態規划:最優二叉搜索樹

[英]Dynamic Programming: Optimal Binary Search Tree

好吧,我希望有人可以向我解釋一下。 我正在攻讀決賽,我無法解決一些問題。

問題是動態編程; 構造最優二叉搜索樹(OBST)。 我理解一般的動態編程和特別是這個問題的概念,但我不明白這個問題的遞歸形式。

我得到的是,我們正在為這些節點中不斷增加的子集構建最佳二叉搜索樹,並在我們繼續時將答案保存在表中以避免重新計算。 當你在a_ {k}根樹時,我也得到了這一點,所有來自a_ {1}到a_ {k-1}的成功節點以及它們對應的虛構不成功節點(即樹的葉子)都在左子樹,然后右子樹中的子樹是a_ {k + 1}到a_ {n}。

這是我不明白的等式的遞歸形式:

c(i,j)= min(i <k <= j){c(i,k-1)+ c(k,j)+ p(k)+ w(i,k-1)+ w(k + J)}

其中w(i,j)= q(i)+從i + 1到j的總和(q(1)+ p(1))。

所以在c(i,j)中,從左到右,我們有左子樹的成本+右子樹的成本+成功搜索root + w(i,k-1)+ w(k + j)的概率。

我的困惑是c(i,k-1)與w(i,k-1)的區別。

文本是Horowitz,Sahni和Rajasekeran的計算機算法,但我也讀過OBST上的CLRS並在網上搜索,我所遇到的任何內容都沒有很好地解釋這些部分之間的差異。

c(i,j)表示搜索包含密鑰ki,...,kj的最優二叉搜索樹的預期成本。 w(i,j)表示包含密鑰ki,...,kj的子樹的概率和。 對於公式:

c(i, j) = min (i < k <= j) {c(i, k-1) + c(k, j) + p(k) + w(i, k-1) + w(k,j)}

如果我們選擇密鑰k作為根,則c(i,k-1)+ w(i,k-1)重新表示左子樹的成本。 c(k,j)+ w(k,j)表示右子樹的成本。 p(k)表示根k的成本。

請注意:如果我們選擇鍵k作為根,則左子樹包含鍵ki,...,k(k-1),右子樹包含kyes k(k + 1),...,kj 。 但我們不能簡單地說:

c(i,j)=min (i < k <= j) {c(i, k-1) + c(k, j) + p(k)}

因為當我們為根選擇密鑰k時,生成的子樹的深度加1.因此c(i,k-1)+ w(i,k-1)將是左子樹的正確成本!

這是計算特定深度的節點的頻率*深度的微妙方式。

每次將節點評估為根時,在總結其左(或右)子樹時,您將添加頻率總和以增加所有子節點的深度。

例如,假設節點'A','B'和'C',其中'A'是根,'B'是'A'的子節點而'C'是'B'的子節點。 (沒有合適的孩子可以讓事情變得簡單。)

以自下而上的方式,以葉'C'為根:

cost is Pr(C) = freqC*1  (no children)

以'B'為根:

cost = Pr(B) + Cost[C,C] + sum of children freq 
     = freqB*1 + freqC*1 + freqC*1
     = freqB*1 + freqC*2 

where Pr(B) = freqB*1
     Cost[C,C] = freqC*1
     sum of children freq = freqC*1

最后,以'A'為根:

cost = Pr(A) + Cost[C,B] + sum of children freq 
     = freqA*1 + freqB*1 + freqC*2 + freqB*1 + freqC*1
     = freqA*1 + freqB*2 + freqC*3

where Pr(A) = freqA*1
     Cost[C,B] = freqB*1 + freqC*2
     sum of children freq = freqB*1 + freqC*1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM