最优二叉搜索树问题(带成功和失败频率版本)
字数 2168 2025-11-08 23:48:32
最优二叉搜索树问题(带成功和失败频率版本)
题目描述
假设我们有一组有序的关键字序列(例如,二叉搜索树的节点值),以及每个关键字被搜索成功的概率(称为“成功频率”)。同时,我们还知道在关键字之间的间隔区间(即不在关键字集合中的值)被搜索失败的概率(称为“失败频率”)。目标是构建一棵二叉搜索树,使得所有搜索操作的期望代价最小。期望代价定义为每个节点(成功)和每个间隔(失败)的搜索概率乘以其在树中的深度(或访问代价)的总和。
输入
- 关键字集合:\(K = [k_1, k_2, ..., k_n]\)(按升序排列)
- 成功频率:\(P = [p_1, p_2, ..., p_n]\),其中 \(p_i\) 是搜索关键字 \(k_i\) 的概率
- 失败频率:\(Q = [q_0, q_1, ..., q_n]\),其中 \(q_i\) 是搜索值落在区间 \((-\infty, k_1), (k_1, k_2), ..., (k_n, \infty)\) 的概率
输出
- 最小的期望搜索代价
解题过程
步骤1:问题分析
- 二叉搜索树(BST)的性质:对于任意节点,左子树的所有关键字小于该节点,右子树的所有关键字大于该节点。
- 期望代价的计算包括:
- 成功搜索:关键字 \(k_i\) 的代价 = \(p_i \times (depth(k_i) + 1)\)
- 失败搜索:间隔区间 \((k_i, k_{i+1})\) 的代价 = \(q_i \times (depth(间隔对应的叶子节点))\)
- 目标是通过调整树的结构,最小化总期望代价。
步骤2:定义动态规划状态
- 设 \(dp[i][j]\) 表示由关键字 \(k_i, k_{i+1}, ..., k_j\) 构成的子树(包括失败间隔)的最小期望代价。
- 为了方便处理边界,我们扩展区间:对于 \(0 \leq i \leq j \leq n\),若 \(i > j\) 则子树为空(仅包含失败间隔)。
步骤3:状态转移方程
- 考虑以关键字 \(k_r\)(其中 \(i \leq r \leq j\))作为根节点:
- 左子树包含关键字 \(k_i, ..., k_{r-1}\) 和对应的失败间隔。
- 右子树包含关键字 \(k_{r+1}, ..., k_j\) 和对应的失败间隔。
- 当以 \(k_r\) 为根时,整个子树的概率总和增加(因为根节点深度为0,但所有节点的深度会因新根而+1)。
- 转移方程:
\[ dp[i][j] = \min_{r = i}^{j} \left( dp[i][r-1] + dp[r+1][j] + w(i, j) \right) \]
其中:
- \(w(i, j) = \sum_{t=i}^{j} p_t + \sum_{t=i-1}^{j} q_t\) 是关键字 \(i\) 到 \(j\) 区间内所有成功和失败概率的总和。
- \(dp[i][r-1]\) 是左子树的代价,\(dp[r+1][j]\) 是右子树的代价。
- 注意:当 \(i > j\) 时,\(dp[i][j] = 0\)(空树代价为0)。
步骤4:计算顺序与初始化
- 按区间长度 \(L = 0, 1, ..., n\) 从小到大计算:
- \(L = 0\):区间只有一个失败间隔,即 \(dp[i][i-1] = q_{i-1}\)(实际计算中可初始化为0,因为代价已包含在 \(w(i,j)\) 中)。
- \(L \geq 1\):遍历所有起点 \(i\),计算 \(j = i + L - 1\)。
- 预处理前缀和数组以便快速计算 \(w(i, j)\)。
步骤5:示例演示
假设 \(n = 3\),关键字概率 \(P = [0.1, 0.2, 0.3]\),失败概率 \(Q = [0.05, 0.1, 0.15, 0.2]\)。
- 计算 \(w(i, j)\):例如 \(w(1,3) = p1+p2+p3 + q0+q1+q2+q3 = 0.1+0.2+0.3+0.05+0.1+0.15+0.2 = 1.1\)。
- 填表 \(dp[i][j]\):
- 基础情况:\(dp[1][0] = 0\), \(dp[2][1] = 0\), ...
- \(dp[1][1] = \min_{r=1} (dp[1][0] + dp[2][1] + w(1,1)) = 0 + 0 + (p1 + q0 + q1) = 0.1+0.05+0.1 = 0.25\)。
- 逐步计算更大区间,最终 \(dp[1][3]\) 即为答案。
步骤6:复杂度分析
- 时间复杂度:\(O(n^3)\)(三层循环:区间长度、起点、根位置)。
- 空间复杂度:\(O(n^2)\)(DP表)。
通过以上步骤,我们可以高效地找到构建最优二叉搜索树的方案,最小化搜索期望代价。