最优二叉查找树

给定一个由n个互异的关键字组成的序列K={k1,k2,...,kn},且关键字有序,对于每一个关键字ki,一次搜索为ki的概率是pi。某些搜索的值可能不在K内,因此还有n+1个虚拟键d0,d1,...,dn代表不再K内的值。d0代表所有小于k1的值,dn代表所有大于kn的值,对于i=1,2,...,n-1,di代表所有位于ki和ki+1之间的值。对每个虚拟键di,一次搜索对应于di的概率是qi。定义在T内一次搜索的期望代价为E=∑(depth(ki)+1)*pi+∑(depth(di)+1)*qi=1+∑depth(ki)*pi+∑depth(di)*qi

 

一颗最优二叉查找树就是期望代价最小的BST。

 

如果一颗最优二叉查找树T有一颗包含关键字ki,...,kj的子树T',那么这颗子树T'对于关键字ki,...,kj和虚拟键di-1,...,dj的子问题也是最优的。

 

在ki,...,kj的子树中,假设kr(i=<r<=j)是根,那么左子树包含ki,...,kr-1,di-1,...,dr-1,右子树包含kr+1,...,kj,dr,...,dj。特别的,当r=i时,左子树包含ki,...,ki-1,di-1,...,di-1,此时左子树只包含di-1;当r=j时,右子树包含kj+1,...,kj,dj,...dj,此时右子树只包含dj

 

定义e[i][j]为搜索一颗包含关键字ki,...,kj的最优二叉查找树的期望代价,其中1=<i,j<=n,j>=i-1(当j=i-1时子树只有虚拟键di-1),因此1=<i<=n+1,0=<j<=n.

 

 定义w[i][j]=∑pl+∑ql

以r为子树的根,有公式:

e[i][j]=pr+e[i][r-1]+e[r+1][j]+w[i][r-1]+w[r+1][j]=e[i][r-1]+e[r+1][j]+w[i][j]

所以,递归公式有:

e[i][j]=qi-1(if j=i-1)      or     min{e[i][r-1]+e[r+1][j]+w[i][j]}(if i<=j)

w[i][j]=qi-1(if j=i-1)   or    w[i][j-1]+pj+qj(if i<=j)

 

optimal bst
 1 OPTIMAL-BST(p,q,n)
2 for(i=1;i<=n+1;++i)
3 e[i][i-1]=q[i-1]
4 w[i][i-1]=q[i-1]
5 for(l=1;l<=n;++i)
6 for(i=1;i<=n-l+1;++i)
7 j=i+l-1
8 w[i][j]=w[i][j-1]+p[j]+q[j]
9 e[i][j]=INFINITY
10 for(r=i;r<=j;++r)
11 if(e[i][r-1]+e[r+1][j]+w[i][j]<e[i][j])
12 e[i][j]=e[i][r-1]+e[r+1][j]+w[i][j]
13 root[i][j]=r



posted @ 2012-02-09 15:12  Cavia  阅读(967)  评论(0编辑  收藏  举报