返回顶部

最优二叉搜索树

作者:@cherish.
课程学习内容为作者从学校的PPT处摘抄,仅供自己学习参考,若需转载请注明出处:https://www.cnblogs.com/cherish-/p/15730290.html


  • 背景:语言翻译,从英语到法语,对于给定的单词在单词表里找到该词
  • 方法:创建一棵二叉搜索树,以英语单词作为关键字构建树
  • 目标:尽快地找到英语单词,使总的搜索时间尽量少
  • 思路:频繁使用的单词,如the应尽可能的靠近根;而不经常出现的单词可以离根远一点

前提假设:所有元素互异

一些定义:

  • 二叉搜索树

    二叉搜索树T是一棵二元树,它或者为空,或者其每个结点含有一个可以比较大小的数据元素,且有:

    • T的左子树的所有元素比根结点中的元素小;
    • T的右子树的所有元素比根结点中的元素大;
    • T的左子树和右子树也是二叉搜索树。
  • 最优二叉搜索树

    给定含有n个关键字的已排序的序列K=<k1,k2,,kn>(不失一般性,设 k1<k2<<kn),对每个关键字ki,都有一个概率pi表示其被搜索的频率。根据kipi构建一个二叉搜索树T,每个ki对应树中的一个结点。

    搜索对象x,在T中可能找到、也可能找不到:

    • x等于某个ki,则一定可以在T中找到结点ki,称为成功搜索。成功搜索的情况一共有n种,分别是x恰好等于某个ki
    • x<k1x>knki<x<ki+1(1i<n), 则在T中搜索x将失败,称为失败搜索。
      • 为此引入外部结点d0,d1,...,dn,用来表示不在K中的值,称为伪关键字。
      • 伪关键字在T中对应外部结点,共有n+1个。—扩展二叉树:内结点表示关键字ki,外结点(叶子结点)表示di
      • 这里每个di代表一个区间。d0表示所有小于k1的值, dn表示所有大于kn的值,对于i=1,,n1di表示所有在kiki+1之间的值。每个di也有一个概率表示搜索对象x恰好落qi入区间di的频率。
  • 二叉搜索树的期望搜索代价

    • 一次搜索的代价等于从根结点开始访问结点的数量(包括外部结点)。从根结点开始访问结点的数量等于结点在T中的深度+1。记depthT(i)为结点iT中的深度。

    • 二叉搜索树T的期望代价为:

      E[searchcostinT]=i=1n(depthT(ki)+1)pi+i=0n(depthT(di)+1)qi=1+i=1ndepthT(ki)pi+i=0ndepthT(di)qi

  • 最优二叉搜索树

    对于给定的关键字及其概率集合,期望搜索代价最小的二叉搜索树称为其最优二叉搜索树。

    关键问题在于确定谁是根:1.树根不一定是概率最高的关键字;2.树也不一定是最矮的树;3.该树的期望搜索代价必须是最小的。

证明最优二叉搜索树的最优子结构:

如果T是一棵相对于关键字k1,,kn和伪关键字d0,,dn的最优二叉搜索树,则T中一棵包含关键字ki,,kj的子树T必然是相对于关键字ki,,kj(和伪关键字di1,,dj)的最优二叉搜索子树。

证明:用剪切-粘贴法证明

对关键字ki,,kj和伪关键字di1,,dj,如果存在子树T,其期望搜索代价比T低,那么将TT中删除,将T粘贴到相应位置上,则可以得到一棵比T期望搜索代价更低的二叉搜索树,与T是最优的假设矛盾。

构造最优二叉搜索树

利用最优二叉搜索树的最优子结构性来构造最优二叉搜索树。

分析: 对给定的关键字ki,,kj,若其最优二叉搜索(子)树的根结点是krirj,则kr的左子树中包含关键字ki,,kr1及伪关键字di1,,dr1,右子树中将含关键字ki+1,,kj及伪关键字dr,,dj

计算过程:求解包含关键字ki,...,kj的最优二叉搜索树,其中i1,jn,ji1。定义e[i,j]表示包含关键字ki,...,kj的最优二叉搜索树的期望搜索代价,最终解的期望搜索代价为e[1,n]

  1. ij时,从ki,...,kj中选择出根结点kr。其左子树包含关键字ki,...,kr1且是最优二叉搜索子树;其右子树包含关键字kr+1,...,kj且同样为最优二叉搜索树。

  2. 当一棵树成为另一个结点的子树时,有以下变化:子树的每个结点的深度增加1,根据搜索代价期望值计算公式,子树对根为kr的树的期望搜索代价的贡献是其期望搜索代价+其所含有结点的概率之和。对于包含关键字ki,...,kj的子树,所有结点的概率之和为(包含外部结点):ω(i,j)=l=ijpl+l=i1jql

  3. kr为包含关键字ki,...,kj的最优二叉搜索树的根,则其期望搜索代价e[i,j]与左右子树的期望搜索代价e[i,r1]e[r+1,j]的递推关系式为:

    e[i,j]=pr+(e[i,r1]+ω(i,r1))+(e[r+1,j]+w(r+1,j))

    其中ω(i,r1)ω(r+1,j)是左右子树所有结点的概率之和。且有ω(i,j)=ω(i,r1)+pr+ω(r+1,j)

    故递推关系式等价于:e[i,j]=e[i,r1]+e[r+1,j]+w(i,j)

    总的递推关系式为:

    e[i,j]={qi1j=i1minirj{e[i,r1]+e[r+1,j]+w(i,j)}ij

  4. 边界条件

    上述递推关系式存在e[i,i1]e[j+1,j]的边界情况。此时子树不包含实际的关键字,而只包含伪关键字di1,其期望搜索代价仅为e[i,i1]=qi1

  5. 构造最优二叉搜索树

    定义root[i,j],保存计算e[i,j]时,使e[i,j]取得最小值的rkr即为关键字ki,,kj的最优二叉搜索(子)树的树根。在求出e[1,n]后,利用root即可构造出最终的最优二叉搜索树。

计算最优二叉搜索树的期望值

定义三个数组:

  • e[1...n+1,0...n]:用于记录所有e[i,j]的值,其中e[n+1,n]表示伪关键字dn对应的子树;e[1,0]表示伪关键字d0对应的子树
  • root[1...n]:用于记录所有最优二叉搜索子树的根节点
  • ω[1...n+1,0...n]:用于保存子树的结点的概率之和,且有ω(i,j)=ω(i,j1)+pj+qj,这样每个ω(i,j)的计算时间仅为Θ(1)

伪代码:

时间复杂度:O(n3)
空间复杂度:O(n2)
一个简单的示例:

posted @   cherish-lgb  阅读(945)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示