動態規劃之最優二叉搜尋樹(演算法導論)

2021-06-26 08:35:53 字數 2090 閱讀 9939

1、一些概念

二叉搜尋樹:在二叉樹中,對任意的節點x其左子樹的所有節點都不大於x.key,其右子樹的所有節點都不小於x.key。滿足此條件的二叉樹稱為二叉搜尋樹。對二叉搜尋樹進行中序遍歷將會得到乙個單調遞增的數列。

最優二叉樹:在二叉樹中,不同的節點都有不同的訪問頻率。為了減少查詢某個節點所需要遍歷的次數,通過將訪問頻率最高的節點放在離根節點近的位置,這樣就可以減少平均遍歷次數。最優二叉樹又稱赫夫曼樹。

最優二叉搜尋樹:就是滿足二叉搜尋樹性質的最優二叉樹。

2、問題描述

現在給定一組有序節點的查詢概率,以及查詢失敗的概率。關鍵字k1,k2,k3,...,kn的查詢的概率分別為p1,p2,p3,...,pn. 對於查詢失敗的偽關鍵字,有n+1個分別為:d0,d1,d2,d3,...,dn. 其分別對於的查詢概率為:q0,q1,q2,...,qn。假設現在有五個節點,每個節點的概率為p1,p2,...,p5。qi表示偽關鍵字di的概率,分別為q0,q1,q2,...,q5。如下表:

該錶對應的圖如下所示。

3、問題解析

由於最優二叉搜尋樹需要滿足節點之間連續有序,因而,對於任意滿足條件的子樹ti..j,其節點分別為ki,ki+1,...,kj. 在這個子樹中查詢失敗的偽關鍵字分別為di-1, di, di+1, ..., dj。

r[ i, j ]:表示子樹ti..j的根節點,用來構造滿足條件的最優二叉搜尋樹;

w[ i, j ]:表示子樹ti..j中從節點i到節點j的訪問概率之和,用來計算當子樹ti..j變成其他節點的子樹時,這時該子樹的所有節點的深度都增加了1,這時這顆子樹所增加的代價就為這顆子樹的所有節點的概率和包括偽關鍵字節點的概率。

w[ i, j ] = pi+p(i+1)+...+pj+q(i-1)+qi+q(i+1)+...+qj.

e[ i, j ]:表示對子樹ti..j進行一次訪問的平均代價,當訪問的平均代價越小,其效能越優;若kr為子樹ti..j的根節點,則有:

e[i, j] = pr+( e[i, r-1] + w[i, r-1] ) + ( e[r+1, j] + w[r+1, j])

而:w[i, j] = w[i, r-1] + pr + w[r+1, j]

所以e[ i, j ] = e[i, r-1] + w[i, j] + e[r+1, j]

於是有:

if j == i-1, then e[i, j] = q(i-1);

if i <= j, then e[i, j] = min ( i <= r <= j )

另外還有

w[i, j] = w[i, j-1]+pj+qj. 

4、**實現(感覺寫得很混亂,o(╯□╰)o)

#include #include #define max 102

double p[max], q[max], price;

int r[max][max];

void print(int i, int j, int c)

printf("%d ",r[i][j]);

price += p[r[i][j]]*c;

print(i, r[i][j]-1, c+1);

print(r[i][j]+1, j, c+1);

}void optimal_bst(int n)

//bottom to up

for(len=1; len<=n; len++)

}} }

// printf("e[1][n] = %lf\n",e[1][n]);

// printf("w[1][n] = %lf\n",w[1][n]);

//print result

//print(1, n); }

int main()

return 0;

}

動態規劃之最優二叉搜尋樹

在看這張之前,最好看看我寫的 動態規劃詳解 裡面都是講理論基礎,我下面的分析都是在此基礎上進展的。給定乙個由n個互異的關鍵字組成的序列k k1,k2,kn 且關鍵字有序 因此有k1 k2 kn 從這些關鍵字中構造一棵二叉查詢樹。對每個關鍵字ki,一次搜尋為ki的概率是pi。某些搜尋的值可能不在k內,...

動態規劃之最優二叉搜尋樹

最優二叉搜尋樹簡介 舉例以及詳細分析 塊測試結果 1 概念引入 基於統計先驗知識,我們可統計出乙個數表 集合 中各元素的查詢概率,理解為集合各元素的出現頻率。比如中文輸入法字型檔中各詞條 單字 片語等 的先驗概率,針對使用者習慣可以自動調整詞頻 所謂動態調頻 高頻先現原則,以減少使用者翻查次數。這就...

動態規劃之最優二叉搜尋樹

最優二叉搜尋樹 public class optimalbst k1.k5的概率 private double q d1.d5的概率 public static void main string args public optimalbst 計算得到最優二叉搜尋樹期望代價 private void ...