给定一个由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)
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]