最優二叉查詢樹(optimal BST)

2021-06-02 03:27:37 字數 894 閱讀 4238

/**

最優二叉查詢樹:一棵有n個結點的二叉查詢樹,已知每個結點的查詢概率pi(且∑pi=1),要使查詢操作的平均比較次數最小。(這裡討論的是成功查詢,不討論不成功的查詢)

動態規劃:

c[i][j]表示由結點i~j組成的bst成功查詢的最小平均查詢次數。

r[i][j]表示由結點i~j構成最優二叉查詢樹時的樹根結點。

轉換公式:

c[i][j] = min[i<=k<=j] + sum;

時間複雜度是o(n^3)

優化:把原來的樹根可能是i->j中的任何乙個,優化成r[i,j-1] <= r[i,j] <= r[i+1,j]

可以證明優化後的時間複雜度是o(n^2)

**/const int maxn = 1000 + 5;

double c[maxn][maxn];

int r[maxn][maxn];

double optimalbst(int n, double p)

; for (int i = 1; i <= n; i++) // 求前i項和是為了簡化後面的計算

sum[i] = sum[i-1] + p[i];

if ( fabs(sum[n] - 1.0) > 1e-6 ) // 檢驗∑pi=1

return -1.0;

for (int i = 1; i <= n; i++) // initialize

c[n+1][n] = 0;

for (int d = 1; d < n; d++)

}r[i][j] = root;

c[i][j] = minv + sum[j] - sum[i-1];}}

return c[1][n];

}

最優二叉查詢樹

1.演算法講解見 演算法設計與分析基礎 p223 p227 2.關於如何確定迴圈的值,見下圖 可得到下表 很顯然,d作為最外層迴圈,i為次外層,而j作為i的因變數存在。i 1 n d 相應的j i d k作為最記憶體迴圈,每次開始迴圈時,始終用temp儲存此次迴圈的最小值,即 3.如下 includ...

最優二叉查詢樹

問題描述 對於給定的一組改路,構造乙個期望搜尋代價最小的二叉查詢樹。演算法導論 第二版213頁。include include using namespace std define key number 5 define infinity 1000 期望搜尋代價,只使用1 i n 1,0 j n的表...

最優二叉檢索樹

給定資料集 s x1 x2 xn 及s 的訪問概率分布如下 p a0 b1 a1 b2 a2 bn,an 求一棵最優的 即平均比較次數最少的 二分檢索樹.令w i,j 是p i,j 中所有概率 資料與空隙 之和 設m i,j 是相對於輸入s i,j 和p i,j 的最優二叉搜尋樹的平均比較次數 遞推...