OBST(最优二叉搜索树)
简述一下问题:假设有一颗词典二叉树,我们从中查找需要的单词,使用红黑树或平衡树这样的数据结构总是可以在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; }
有空再解释代码中的变量...
相关推荐
JayFighting 2020-06-28
Chenliaoyuan 2020-06-11
星辰大海的路上 2020-06-10
myveer 2020-06-01
willluckysmile 2020-05-03
容数据服务集结号 2020-04-22
shayuchaor 2020-04-20
fengyun 2020-04-17
htofly 2020-03-27
MrFuWen 2020-02-22
yuanye0 2019-12-09
laohyx 2019-11-03
shenxiuwen 2019-10-31
lixinghui0 2011-05-02
nimeijian 2019-10-21
hacker0ne 2018-09-30
agjllxchjy 2013-01-17