算法与数据结构学习笔记-最优二叉搜索树(optimal binary search tree)的动态规划实现详解

本文详细讲解了如何使用动态规划方法构建最优二叉搜索树,以最小化搜索平均费用。通过分析节点深度和搜索频率,构建递归公式,并通过实例展示了计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一串字符中可能进行多次查找,每个字符被查找到的频率都不同,如何根据字符被查找到的频率,建立一个二叉搜索树,使得花费时间最少呢?

题目:给定一列按升序排列的键值K=[k1,k2,...,kn]K=[k_1,k_2,...,k_n]K=[k1,k2,...,kn]和它们被搜索到的频率P=[p1,p2,...,pn]P=[p_1,p_2,...,p_n]P=[p1,p2,...,pn],建立一个二叉搜索树,使得搜索的平均费用最低。要求输入键值和频率数组,返回搜索树及其费用。

二叉树的费用如何计算呢?我们知道节点越低,搜索经过的路程越长。因此定义搜索的花费cost(ki)=depth(ki)+1cost(k_i)=depth(k_i)+1cost(ki)=depth(ki)+1。因为对根节点进行查找也需要一次操作,而根节点的深度为0,所以定义每个节点的搜索花费为depth(ki)+1depth(k_i)+1depth(ki)+1。每一个节点kik_iki被搜索到的频率为pip_ipi,因此整棵树T的费用定义为:

E(T)=∑i=1ncost(ki)⋅pi=∑i=1n(depth(ki)+1)⋅pi=∑i=1ndepth(ki)⋅pi+∑i=1npiE(T)=\sum_{i=1}^{n} cost(k_i) \cdot p_i= \sum_{i=1}^{n} (depth(k_i)+1)\cdot p_i= \sum_{i=1}^{n} depth(k_i) \cdot p_i+\sum_{i=1}^{n} p_iE(T)=i=1ncost(ki)pi=i=1n(depth(ki)+1)pi=i=1ndepth(ki)pi+i=1npi
∑i=1npi\sum_{i=1}^{n} p_ii=1npi的值为1(每个键值的概率相加),因此
E(T)=∑i=1ndepth(ki)⋅pi+1E(T)=\sum_{i=1}^{n} depth(k_i) \cdot p_i+1E(T)=i=1ndepth(ki)pi+1

在搜索过程中会出现对给出的键值之外的值的搜索,为了方便,我们给搜索树的每个叶子节点加上两个“假的”节点,并给出搜索到假节点的概率用q0,q1,...,qnq_0, q_1, ...,q_nq0,q1,...,qn表示。

用该公式尝试计算一棵二叉搜索树的费用:

i 1 2 3 4 5
kik_iki 0.25 0.20 0.05 0.20 0.30

在这里插入图片描述
左树E(T)=∑i=1ndepth(ki)⋅pi+1=0.20×0+0.25×1+0.20×1+0.05×2+0.30×2+1=2.15E(T)=\sum_{i=1}^{n} depth(k_i)\cdot p_i+1=0.20×0+0.25×1+0.20×1+0.05×2+0.30×2+1=2.15E(T)=i=1ndepth(ki)pi+1=0.20×0+0.25×1+0.20×1+0.05×2+0.30×2+1=2.15
右树E(T)=∑i=1ndepth(ki)⋅pi+1=0.20×0+0.25×1+0.30×1+0.20×2+0.05×3+1=2.10E(T)=\sum_{i=1}^{n} depth(k_i)\cdot p_i+1=0.20×0+0.25×1+0.30×1+0.20×2+0.05×3+1=2.10E(T)=i=1

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值