动态规划——最优二叉查找树

本文介绍了如何使用动态规划方法构建最优二叉查找树,以最小化有序序列的搜索期望代价。通过分析问题并定义递归解,详细阐述了计算最优二叉树期望代价的过程,并给出了C++实现代码。

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

1,问题描述:给定一个有序序列K={k1<k2<k3<,……,<kn}和他们被查询的概率P={p1,p2,p3,……,pn},要求构造一棵二叉查找树T,使得查询所有元素的总的代价最小。对于一个搜索树,当搜索的元素在树内时,表示搜索成功。当不在树内时,表示搜索失败,用一个“虚叶子节点”来标示搜索失败的情况,因此需要n+1个虚叶子节点{d0<d1<……<dn}。其中d0表示搜索元素小于k1的失败结果,dn表示搜索元素大于kn的失败情况。di(0<i<n)表示搜索节点在ki和k(i+1)之间时的失败情况。对于应di的概率序列是Q={q0,q1,……,qn}。

2,问题分析:

在二叉树中T内搜索一次的期望代价为:

E[T]=

         (depth(ki)+1)*pi  //对每个i=1~n,搜索成功情况

       +(depth(di)+1)*qi //对每个i=0~n,搜索失败情况

3,问题求解:动态规划

步骤一:寻找最优子结构。

一个最优二叉树的子树必定包含连续范围的关键字ki~kj,1<=i<=j<=n,同时也必须含有连续的虚叶子节点di-1~dj。

如果一棵最优二叉查找树T有一棵含有关键字ki~kj的子树T',那么,T'也是一棵最优查找树,这通过剪贴思想可以证明。

现在开始构造最优子结构:在ki~kj中,选定一个r,i&l

### 动态规划求解最优二叉搜索树 #### 定义与目标 最优二叉搜索树(Optimal Binary Search Tree, OBST)是指在一棵给定关键字集合上构建的一棵树,在这棵树中执行查找操作的期望成本最小化。当各个节点被访问的概率不相等时,通过调整这些节点的位置可以减少平均查找长度。 #### 算法描述 为了利用动态规划方法解决这个问题,定义 `C[i][j]` 表示从第 i 到 j 的键构成的最佳子树的成本。对于每一个可能成为根节点的关键字 k(i≤k≤j),计算左子树 C[i][k−1] 和右子树 C[k+1][j] 的总成本加上所有概率之和 p(k)+∑q(m)(i-1<=m<=j) ,这里 q(m) 是失败匹配的概率。最终的目标是最小化整个表达式的值: \[ \text{Cost}(i,j)=\min_{i \leq k \leq j}\left(\sum_{r=i}^{j} w(r)+\text { Cost }(i, k-1)+\text { Cost }(k+1, j)\right)[^1] \] 其中 \(w(r)\) 代表成功或失败查询 r 发生的概率权重。 #### Python 实现代码 下面是一个简单的Python程序来展示如何使用动态规划实现上述过程: ```python def opt_bst(p, q, n): e = [[0]*(n+1) for _ in range(n+2)] w = [[0]*(n+1) for _ in range(n+2)] root = [[0]*(n+1) for _ in range(1+n)] for i in range(1, n+2): e[i][i-1], w[i][i-1] = q[i-1], q[i-1] for length in range(1, n+1): for i in range(1, n-length+2): j = i + length - 1 e[i][j], w[i][j] = float('inf'), sum(p[i:j+1]) + sum(q[i-1:j+1]) for r in range(i, j+1): t = e[i][r-1] + e[r+1][j] + w[i][j] if t < e[i][j]: e[i][j], root[i][j] = t, r return e, root if __name__ == "__main__": # Example usage with probabilities as input. p = [0.15, 0.10, 0.05, 0.10, 0.20] # Key success probability q = [0.05, 0.10, 0.05, 0.05, 0.05, 0.10] # Failure match probability result_e, result_root = opt_bst(p, q, len(p)) print("Expected cost:", result_e[1][-1]) ``` 此代码片段展示了如何创建一个函数 `opt_bst()` 来接收两个列表参数——p 和 q 分别表示成功的查询概率以及失败情况下的概率,并返回预期最低成本矩阵e及其对应的root结构用于重建实际的OBST。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值