动态规划求解最优二叉查找树:计算平均搜索结点访问数
解题思路: 最优二叉查找树问题可用动态规划求解。设e[i][j]表示构造关键字ki到kj的最优二叉查找树的最小代价,w[i][j]表示构造关键字ki到kj的查找树中关键字的概率之和。则有以下递推关系式: e[i][i] = qi+di,当j=i时,构造只有一个结点的查找树,代价就是该结点的概率。 e[i][j] = min{e[i][r-1]+e[r+1][j]+w[i][j]},当j>i时,假设k(r)是关键字ki,...,kj中的根,那么只需找到使得代价最小的根。 根据以上递推关系式,可以用动态规划求解e[i][j],并得到最优二叉查找树的最小代价和平均搜索每个结点的访问结点数。 具体实现: 1. 读取输入的关键字概率和虚拟键概率。 2. 初始化二维数组e和w,将主对角线e[i][i]和w[i][i]的值设置为关键字概率和虚拟键概率。 3. 使用两个for循环计算e[i][j]和w[i][j],外层循环控制i和j的范围,内层循环计算e[i][j]和w[i][j]的值。 4. 输出最优二叉查找树的平均搜索每个结点的访问结点数,即e[1][n]的值。 代码实现如下: #include <iostream> #include <vector> #include <iomanip> using namespace std; double optimalBinarySearchTree(vector<double>& p, vector<double>& q) { int n = p.size(); vector<vector<double>> e(n + 2, vector<double>(n + 1, 0)); // 存储最优二叉查找树的代价 vector<vector<double>> w(n + 2, vector<double>(n + 1, 0)); // 存储概率之和 for (int i = 1; i <= n + 1; i++) { e[i][i - 1] = q[i - 1]; w[i][i - 1] = q[i - 1]; } for (int l = 1; l <= n; l++) { for (int i = 1; i <= n - l + 1; i++) { int j = i + l - 1; e[i][j] = INT_MAX; w[i][j] = w[i][j - 1] + p[j] + q[j]; for (int r = i; r <= j; r++) { double t = e[i][r - 1] + e[r + 1][j] + w[i][j]; if (t < e[i][j]) { e[i][j] = t; } } } } return e[1][n]; } int main() { vector<double> p = {0.15, 0.1, 0.05, 0.1, 0.2}; vector<double> q = {0.05, 0.1, 0.05, 0.05, 0.05, 0.1}; double result = optimalBinarySearchTree(p, q); cout << fixed << setprecision(2) << result << endl; return 0; } ######[AI写代码神器 | 1311点数解答 | 2024-06-09 14:30:32]
- 1 秒 300 次访问,系统压力究竟大不大?关键因素全揭秘!(讯飞星火 | 272点数解答 | 2024-02-04 16:02:32)378
- C++ 代码实现自定义运算 x@y = x² + y² - xy 及 x@(x+y) 计算(DeepSeek | 215点数解答 | 2025-12-13 15:08:14)70
- C++ 实现根据输入正整数奇偶性计算偶数和或约数和(字节豆包 | 838点数解答 | 2026-02-28 20:23:59)26
- Linux开发:用find命令查找/usr目录下超1MB的文件(百度文心 | 153点数解答 | 2023-11-09 18:45:10)207
- 8 个实用命令,助 Linux 开发者轻松查找服务器平均负载!(百度文心 | 311点数解答 | 2023-11-09 18:47:10)225
- C++实现顺序存储结构基本操作:初始化、插入、删除等全解析(GPT | 1743点数解答 | 2024-09-26 00:20:17)283
- C 语言实现:精准查找比特流中的同步码(字节豆包 | 336点数解答 | 2024-11-14 22:45:41)143
- C语言实现多班级学生信息管理系统:含增删改查与多样排序功能(GPT | 2547点数解答 | 2024-12-15 22:08:58)358
- C语言实现学生信息管理系统:含增删改查与多种排序功能(GPT | 6408点数解答 | 2024-12-15 22:10:03)349
- Python 实现多功能手机通讯录:添加、查看、删除、修改、查找全搞定!(字节豆包 | 1030点数解答 | 2025-06-05 15:47:56)242
- HTML+jQuery 实现列表元素悬停动画效果:代码详解与注意事项(字节豆包 | 475点数解答 | 2024-12-19 14:58:05)369
- HTML+jQuery:打造动态导航栏动画效果及注意事项(字节豆包 | 495点数解答 | 2024-12-19 14:58:06)317