您的位置:首页 > 其它

最优二叉查找树

2012-02-09 15:12 225 查看
给定一个由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

OPTIMAL-BST(p,q,n)
for(i=1;i<=n+1;++i)
e[i][i-1]=q[i-1]
w[i][i-1]=q[i-1]
for(l=1;l<=n;++i)
for(i=1;i<=n-l+1;++i)
j=i+l-1
w[i][j]=w[i][j-1]+p[j]+q[j]
e[i][j]=INFINITY
for(r=i;r<=j;++r)
if(e[i][r-1]+e[r+1][j]+w[i][j]<e[i][j])
e[i][j]=e[i][r-1]+e[r+1][j]+w[i][j]
root[i][j]=r
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: