15.5 最优二叉搜索树(笔记)

背景

假定我们正在设计一个程序,实现英语文本到中文的翻译。对英语文本中出现的每个单词,我们需要查找对应的中文。为了实现这些操作,我们可以创建一个二叉搜索树,将n个英语单词作为关键字,对应的中文作为关联数据。

定义

给定一个n个不同关键字的已排序的序列K=<k1,k2,…,kn>,我们希望用这些关键字构造一颗二叉搜索树。对每个关键字ki,都有一个概率pi表示其搜索频率。有些要搜索的值可能不在K中,因此我们还有n+1个“伪关键字”d0,d1,d2,…dn表示不在K中的值。d0表示所有小于k1的值,dn表示所有大于kn的值,对i=1,2…,n-1,伪关键字di表示所有在ki和ki+1之间的值。对每个伪关键字di,也都有一个概率qi表示对应的搜索频率。

相关公式

基本公式

频率之和为1:
∑ i = 1 n p i + ∑ i = 0 n q i = 1 \sum_{i=1}^n p_{i} + \sum_{i=0}^n q_{i} = 1 i=1npi+i=0nqi=1 (15.10)

E[T中的搜索代价]:
= ∑ i = 1 n ( d e p t h T ( k i ) + 1 ) ⋅ p i + ∑ i = 0 n ( d e p t h T ( d i ) + 1 ) ⋅ q i = \sum_{i=1}^n(depth_{T}(k_{i})+1)\cdot p_{i} + \sum_{i=0}^n(depth_{T}(d_{i})+1)\cdot q_{i} =i=1n(depthT(ki)+1)pi+i=0n(depthT(di)+1)qi
= 1 + ∑ i = 1 n d e p t h T ( k i ) ⋅ p i + ∑ i = 0 n d e p t h T ( d i ) ⋅ q i = 1 + \sum_{i=1}^ndepth_{T}(k_{i})\cdot p_{i} + \sum_{i=0}^ndepth_{T}(d_{i})\cdot q_{i} =1+i=1ndepthT(ki)pi+i=0ndepthT(di)qi (15.11)

拓展公式

当我们选取子问题域为:求解包含关键字ki,…,kj的最优二叉搜索树,其中i>=1,j<=n且j>=i-1(当j=i-1时,子树不包含实际关键字,只包含伪关键字di-1)。定义e[ i, j]为在包含关键字ki,…,kj的最优二叉搜索树中进行一次搜索的期望代价。最终,我们希望计算出e[ 1, n]。有如下公式:

对于包含关键字ki,…,kj的子树,所有概率之和为:
w ( i , j ) = ∑ l = i j p l + ∑ l = i − 1 j q l w(i,j) = \sum_{l=i}^jp_{l} + \sum_{l=i-1}^jq_{l} w(i,j)=l=ijpl+l=i1jql (15.12)

若kr为包含关键字ki,…,kj的最优二叉搜索树的根节点,我们有如下公式:
e [ i , j ] = p r + ( e [ i , r − 1 ] + w ( i , r − 1 ) ) + ( e [ r + 1 , j ] + w ( r + 1 , j ) ) e[i,j] = p_{r} + (e[i,r-1] + w(i,r-1)) + (e[r+1,j] + w(r+1,j)) e[i,j]=pr+(e[i,r1]+w(i,r1))+(e[r+1,j]+w(r+1,j))

注意
w ( i , j ) = w ( i , r − 1 ) + p r + w ( r + 1 , j ) w(i,j) = w(i,r-1) + p_{r} + w(r+1,j) w(i,j)=w(i,r1)+pr+w(r+1,j)

因此e[i, j]可重写为:
e [ i , j ] = e [ i , r − 1 ] + e [ r + 1 , j ] + w ( i , j ) e[i,j] = e[i,r-1]+e[r+1,j]+w(i,j) e[i,j]=e[i,r1]+e[r+1,j]+w(i,j) (15.13)

递归公式(15.13)假定我们知道哪个节点k应该作为根节点。如果选取期望搜索代价最低者作为根节点,可得最终递归公式:
e [ i , j ] = q i − 1 e[i,j] = q_{i-1} e[i,j]=qi1 ,若 j = i - 1
$= \min_{i\leq r\leq j}\left{ e[i,r-1]+e[r+1,j]+w(i,j)\right} $ ,若i<=j (15.14)
为了避免重新计算w(i,j),对于 j>=i 的情况,可如下计算:
w [ i , j ] = w [ i , j − 1 ] + p j + q j w[i,j] = w[i,j-1]+p_{j}+q_{j} w[i,j]=w[i,j1]+pj+qj (15.15)

相关算法

应用动态规划的算法optimalBST

伪代码
下面的伪代码接受概率列表 p1,…,pn 和 q0,…,qn 及规模 n 作为输入,返回表 e 和 root。

optimalBST(p,q,n)
  let e[1..n+1,0..n],w[1..n+1,0..n],and root[1..n,1..n]be new tables
  for i=1 to n+1
    e[i,i-1] = q[i-1]
    w[i,i-1] = q[i-1]
  for l=1 to n
    for i=1 to n-l+1
      j = i+l-1
      e[i,j] = MAX_INT
      w[i,j] = w[i,j-1]+p[j]+q[j]
      for r=i to j
        t = e[i,r-1]+e[r+1,j]+w[i,j]
        if t<e[i,j]
          e[i,j] = t
          root[i,j] = r
return e and root
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值