最優二叉尋找樹(動態規劃)

來源:互聯網
上載者:User


1. 描述

給定一個有序序列K={k1<k2<k3<,……,<kn}和他們被查詢的機率P={p1,p2,p3,……,pn},要求構造一棵二叉尋找樹T,使得查詢所有元素的總的代價最小。對於一個搜尋樹,當搜尋的元素在樹內時,表示搜尋成功。當不在樹內時,表示搜尋失敗,用一個“虛葉子節點”來表示搜尋失敗的情況,因此需要n+1個虛葉子節點{d0<d1<……<dn}。其中d0表示搜尋元素小於k1的失敗結果,dn表示搜尋元素大於kn的失敗結果。di(0<i<n)表示搜尋節點在ki和k(i+1)之間時的失敗情況。對於應di的機率序列是Q={q0,q1,……,qn}。


2. 分析

(1)最優子結構

一個最優二叉樹的子樹必定包含連續範圍的關鍵字ki~kj,1 <= i <= j<= n,同時也必須含有連續的虛葉子節點di-1~dj。

如果一棵最優二叉尋找樹T有一棵含有關鍵字ki~kj的子樹T',那麼,T'也是一棵最優尋找樹,這通過剪貼思想可以證明。

構造最優子結構:在ki~kj中,選定一個r,i <= r <= j,使以kr為根,ki~k(r-1)和k(r+1)~kj為左右孩子的最優二叉樹。注意r=i或者r=j的情況,表示左子樹或右子樹只有虛葉子節點。

(2)遞推公式

定義e[i,j]為一棵包含關鍵字ki~kj的最優二叉樹的期望代價。當j=i-1時沒有真實的關鍵在,只有虛葉子節點d(i-1)。

則:

e[i,i-1] = q(i-1)          j = i-1時,

當j >= i時,需要選擇合適的kr作為根節點,然後其餘節點ki~K(r-1)和k(r+1)~kj構造左右孩子。這時要考慮左右孩子這些節點成為一個節點的子樹後,它的搜尋代價的變化:它們的期望代價增加了“子樹中所有機率的總和”w。

w[i,j] = (pi + ... + pj) + (qi-1 + ... + qj)

於是當 j>= i時,e[i,j]=pr + (e[i,r-1]+w[i,r-1])+(e[r+1,j]+w[r+1,j]) = e[i,r-1] +e[r+1,j]+w[i,j];

(3)計算最優二叉樹的期望代價

e[i,j]=

         q(i-1)                                                    j = i-1時

         min{e[i,r-1] +e[r+1,j]+w[i,j]}                  i <= j,其中i <= r <= j

w[i,j] =

          q(i-1)                                                   j = i-1時

           w[i,j]=w[i,j-1]+pj+qj                            i <= j時

3. 演算法

演算法如下:

void optimalBST(int n, float p[], float q[]) // the length of p and q is (n + 1){    float w[n + 2][n + 1], e[n + 2][n + 1], temp;    int root[n + 1][n + 1];    int i, j, l, r;    for (i = 1;i <= n + 1; i++)        w[i][i - 1] = e[i][i - 1] = q[i - 1];    for (l = 1; l <= n; l++)        for (i = 1, j = l; i <= n - l + 1; i++, j++)        {            e[i][j] = INT_MAX;            w[i][j] = w[i][j - 1] + p[j] + q[j];            for (r = i; r <= j; r++)             {                temp = e[i][r - 1] + e[r + 1][j] + w[i][j];                if (e[i][j] > temp)                {                    e[i][j] = temp;                    root[i][j] = r;                }            }// for (r = i; )        }// for    printf("The optimal search cost is %.2f\n", e[1][n]);    constructOptimalBST(n, root);}


root是記錄構造過程中選擇的根節點,以便構造最優解。

constructOptimalBST函數如下:

void constructOptimalBST(int n, int root[][n + 1]){    printf("k%d is the root\n", root[1][n]);    recursiveConstruct(n, root, root[1][n], 1, n);}


其中recursiveConstruct函數如下:

void recursiveConstruct(int n, int root[][n + 1], int r, int i, int j){    if (j == i - 1)    {        if (i == r)            printf("d%d is the left child of k%d\n", r - 1, r);        else             printf("d%d is the right child of k%d\n", r, r);    } else {        if (i != r) {            printf("k%d is the left child of k%d\n", root[i][r - 1], r);            recursiveConstruct(n, root, root[i][r - 1], i, r - 1);        } else{            printf("d%d is the left child of k%d\n", r - 1, r);        if (j != r) {            printf("k%d is the right child of k%d\n", root[r + 1][j], r);            recursiveConstruct(n, root, root[r + 1][j], r + 1, j);        } else            printf("d%d is the right child of k%d\n", r, r);    }} 


測試如下:


#include <stdio.h>                                                                                                           #include <limits.h>void optimalBST(int n, float p[], float q[]);void constructOptimalBST(int n, int root[][n + 1]);void recursiveConstruct(int n, int root[][n + 1], int r, int i, int j);int main(void){    float p[] = {-1, 0.15, 0.10, 0.05, 0.10, 0.20};    float q[] = {0.05, 0.10, 0.05, 0.05, 0.05, 0.10};    int n = 5;    optimalBST(n, p, q);    return 0;}


輸出:



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.