OBST(最優二叉搜索樹)

  簡述一下問題:假設有一顆詞典二叉樹,咱們從中查找須要的單詞,使用紅黑樹或平衡樹這樣的數據結構老是能夠在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

相關文章
相關標籤/搜索