OBST(最優二叉搜索樹)
阿新 • • 發佈:2018-02-17
紅黑樹 std 變量 這樣的 最優二叉搜索樹 earch 操作 問題 問題:
簡述一下問題:假設有一顆詞典二叉樹,我們從中查找需要的單詞,使用紅黑樹或平衡樹這樣的數據結構總是可以在O(lgN)時間內進行查找,但單詞的出現頻率是不同的,我們給每個單詞加上一個搜索概率,然後通過這些帶有概率的節點計算出整棵樹的搜索期望E(T),找到一個最優節點作為根節點,重新建立一顆二叉樹,稱為最優二叉搜索樹,其期望最低,使得所有搜索操作訪問的節點總數最少。這樣的一顆詞典二叉樹對於搜索單詞能更快。
由於我懶得打字了...所以就給出書上的dp代碼:
#include <iostream> #include <vector> class DP{ public: int optimalBinarySearchTree(std::vector<double> p, std::vector<double> q, int n) { std::vector<std::vector<double> > e(n + 1, std::vector<double>(n)); std::vector<std::vector<double> > w(n + 1, std::vector<double>(n)); int root; for(int i = 1; i < n + 1; i++) { e[i][i - 1] = q[i - 1]; w[i][i - 1] = q[i - 1]; } for(int i = 1; i < n; i++) { for(int j = 1; j < n - i + 1; j++) { int k = j + i - 1; e[j][k] = INT_MIN; w[j][k] = w[j][k - 1] + p[k] + q[k]; for(int r = j; r < k; r++) { double t = e[j][r - 1] + e[r + 1][k] + w[j][k]; if(t < e[j][k]) { e[j][k] = t; root = r; } } } } return root; } }; int main() { DP dp; std::vector<double> p{0.15,0.10,0.05,0.10,0.20}; std::vector<double> q{0.10,0.05,0.05,0.05,0.10}; std::cout << dp.optimalBinarySearchTree(p,q,5) << std::endl; return 0; }
有空再解釋代碼中的變量...
OBST(最優二叉搜索樹)