OBST(最优二叉搜索树)

Posted darkchii

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

  有空再解释代码中的变量...

以上是关于OBST(最优二叉搜索树)的主要内容,如果未能解决你的问题,请参考以下文章

动态规划习题 | 最优二叉搜索树

二叉搜索树和最优二叉搜索树的时间复杂度各是多少?

动态规划习题之最优二叉搜索树

c_cpp 【动态规划】最优二叉搜索树问题【3.11】

算法设计与分析基础22最优二叉查找树

哈夫曼树(最优二叉树)