Python实现从给定关键字序列构造最优二叉查找树并计算平均搜索结点数
""" 思路: 1. 动态规划解决问题 2. 设root[i][j]: i <= j, 二叉查找树的根节点是k[i]到k[j]的虚拟键 3. 设dp[i][j]: i <= j, 表示二叉查找树的期望代价 所以 dp[i][j] = min(dp[i][k-1] + dp[k+1][j]) + sum[p[i]...p[j]] 其中 k 是根节点 虚拟键可以通过下标在 dp[i][j] 中找到对应位置的代价 """ def optimalBST(p, q): n = len(p) # 初始化dp为0,表示还没有计算过对应位置的二叉查找树的期望代价 dp = [[0] * (n + 1) for _ in range(n + 1)] # 初始化二叉查找树的根节点 root = [[0] * (n + 1) for _ in range(n + 1)] # 初始化dp和root for i in range(1, n + 2): dp[i - 1][i - 1] = q[i - 1] root[i - 1][i - 1] = i - 1 # 计算dp和root for gap in range(1, n + 1): for i in range(n - gap + 1): j = i + gap dp[i][j] = float("inf") for k in range(i, j + 1): temp = dp[i][k - 1] + dp[k + 1][j] + sum(p[i:j+1]) + sum(q[i:j+2]) if temp < dp[i][j]: dp[i][j] = temp root[i][j] = k return dp[0][n], root if __name__ == "__main__": p = [0.15, 0.1, 0.05, 0.1, 0.2, 0.05, 0.1, 0.05, 0.05, 0.05, 0.1] q = [0.1, 0.05, 0.05, 0.05, 0.05, 0.1] avg_cost, root = optimalBST(p, q) print('{:.2f}'.format(avg_cost)) """ ######[AI写代码神器 | 857点数解答 | 2024-06-09 14:30:52]
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)460
- 求解特定条件下整数序列的最小值:算法分析与代码实现(字节豆包 | 746点数解答 | 2026-01-24 13:14:40)55
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)416
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)408
- C++实现:计算n个正整数中小于x的数的总和(字节豆包 | 341点数解答 | 2025-08-02 21:52:19)259
- C++ 实现:计算 n 个正整数中小于 x 的数的总和及代码详解(字节豆包 | 377点数解答 | 2025-12-06 20:17:15)55
- Python 实现:计算给定 n 个正整数中小于 x 的数的总和(字节豆包 | 132点数解答 | 2025-12-21 11:35:39)48
- C++ 实现:计算 n 个正整数中小于 x 的数的总和(字节豆包 | 405点数解答 | 2025-12-21 11:36:07)43
- C++ 实现:计算 n 个正整数中小于 x 的数的总和(字节豆包 | 595点数解答 | 2026-01-24 22:53:05)38
- C++ 实现:计算 n 个正整数中小于 x 的数的总和(字节豆包 | 567点数解答 | 2026-01-24 23:00:47)33
- C++ 计算指定个数正整数中小于特定值的数的总和(字节豆包 | 386点数解答 | 2026-02-13 21:53:17)17
- C++ 计算小于指定值的正整数总和的实现(字节豆包 | 523点数解答 | 2026-03-13 21:42:16)14