最优二叉搜索树
作者:@cherish.
课程学习内容为作者从学校的PPT处摘抄,仅供自己学习参考,若需转载请注明出处:https://www.cnblogs.com/cherish-/p/15730290.html
- 背景:语言翻译,从英语到法语,对于给定的单词在单词表里找到该词
- 方法:创建一棵二叉搜索树,以英语单词作为关键字构建树
- 目标:尽快地找到英语单词,使总的搜索时间尽量少
- 思路:频繁使用的单词,如the应尽可能的靠近根;而不经常出现的单词可以离根远一点
前提假设:所有元素互异
一些定义:
-
二叉搜索树
二叉搜索树是一棵二元树,它或者为空,或者其每个结点含有一个可以比较大小的数据元素,且有:
- 的左子树的所有元素比根结点中的元素小;
- 的右子树的所有元素比根结点中的元素大;
- 的左子树和右子树也是二叉搜索树。
-
最优二叉搜索树
给定含有个关键字的已排序的序列(不失一般性,设 ),对每个关键字,都有一个概率表示其被搜索的频率。根据和构建一个二叉搜索树,每个对应树中的一个结点。
搜索对象,在中可能找到、也可能找不到:
- 若等于某个,则一定可以在中找到结点,称为成功搜索。成功搜索的情况一共有种,分别是恰好等于某个。
- 若 或 或, 则在中搜索将失败,称为失败搜索。
- 为此引入外部结点,用来表示不在中的值,称为伪关键字。
- 伪关键字在中对应外部结点,共有个。—扩展二叉树:内结点表示关键字,外结点(叶子结点)表示
- 这里每个代表一个区间。表示所有小于的值, 表示所有大于的值,对于,表示所有在和之间的值。每个也有一个概率表示搜索对象x恰好落入区间的频率。
-
二叉搜索树的期望搜索代价
-
一次搜索的代价等于从根结点开始访问结点的数量(包括外部结点)。从根结点开始访问结点的数量等于结点在中的深度。记为结点在中的深度。
-
二叉搜索树的期望代价为:
-
-
最优二叉搜索树
对于给定的关键字及其概率集合,期望搜索代价最小的二叉搜索树称为其最优二叉搜索树。
关键问题在于确定谁是根:1.树根不一定是概率最高的关键字;2.树也不一定是最矮的树;3.该树的期望搜索代价必须是最小的。
证明最优二叉搜索树的最优子结构:
如果是一棵相对于关键字和伪关键字的最优二叉搜索树,则中一棵包含关键字的子树必然是相对于关键字(和伪关键字)的最优二叉搜索子树。
证明:用剪切-粘贴法证明
对关键字和伪关键字,如果存在子树,其期望搜索代价比低,那么将从中删除,将粘贴到相应位置上,则可以得到一棵比期望搜索代价更低的二叉搜索树,与是最优的假设矛盾。
构造最优二叉搜索树
利用最优二叉搜索树的最优子结构性来构造最优二叉搜索树。
分析: 对给定的关键字,若其最优二叉搜索(子)树的根结点是,则的左子树中包含关键字及伪关键字,右子树中将含关键字及伪关键字。
计算过程:求解包含关键字的最优二叉搜索树,其中。定义表示包含关键字的最优二叉搜索树的期望搜索代价,最终解的期望搜索代价为。
-
当时,从中选择出根结点。其左子树包含关键字且是最优二叉搜索子树;其右子树包含关键字且同样为最优二叉搜索树。
-
当一棵树成为另一个结点的子树时,有以下变化:子树的每个结点的深度增加,根据搜索代价期望值计算公式,子树对根为的树的期望搜索代价的贡献是其期望搜索代价+其所含有结点的概率之和。对于包含关键字的子树,所有结点的概率之和为(包含外部结点): 。
-
若为包含关键字的最优二叉搜索树的根,则其期望搜索代价与左右子树的期望搜索代价和的递推关系式为:
其中和是左右子树所有结点的概率之和。且有
故递推关系式等价于:
总的递推关系式为:
-
边界条件
上述递推关系式存在和的边界情况。此时子树不包含实际的关键字,而只包含伪关键字,其期望搜索代价仅为
-
构造最优二叉搜索树
定义,保存计算时,使取得最小值的,即为关键字的最优二叉搜索(子)树的树根。在求出后,利用即可构造出最终的最优二叉搜索树。
计算最优二叉搜索树的期望值
定义三个数组:
- :用于记录所有的值,其中表示伪关键字对应的子树;表示伪关键字对应的子树
- :用于记录所有最优二叉搜索子树的根节点
- :用于保存子树的结点的概率之和,且有,这样每个的计算时间仅为。
伪代码:
时间复杂度:
空间复杂度:
一个简单的示例:
作者:cherish.
出处:https://home.cnblogs.com/u/cherish-/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!