簡述一下問題:假設有一顆詞典二叉樹,咱們從中查找須要的單詞,使用紅黑樹或平衡樹這樣的數據結構老是能夠在O(lgN)時間內進行查找,但單詞的出現頻率是不一樣的,咱們給每一個單詞加上一個搜索機率,而後經過這些帶有機率的節點計算出整棵樹的搜索指望E(T),找到一個最優節點做爲根節點,從新創建一顆二叉樹,稱爲最優二叉搜索樹,其指望最低,使得全部搜索操做訪問的節點總數最少。這樣的一顆詞典二叉樹對於搜索單詞能更快。ios
因爲我懶得打字了...因此就給出書上的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; }
有空再解釋代碼中的變量...code