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)554
- 求解特定条件下整数序列的最小值:算法分析与代码实现(字节豆包 | 746点数解答 | 2026-01-24 13:14:40)99
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)497
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)493
- iOS开发:weak关键字使用场景及与assign的差异揭秘(阿里通义 | 311点数解答 | 2023-11-08 00:37:04)296
- iOS开发全解析:“copy”关键字的使用方法与实例演示(阿里通义 | 272点数解答 | 2023-11-08 00:37:13)328
- iOS开发:@property声明NSString等用copy而非strong的原因及改strong的后果(阿里通义 | 278点数解答 | 2023-11-08 00:37:19)469
- iOS开发:Objective - C中weak与assign关键字的使用场景及差异揭秘(百度文心 | 360点数解答 | 2023-11-09 17:38:45)369
- C++实现:计算n个正整数中小于x的数的总和(字节豆包 | 341点数解答 | 2025-08-02 21:52:19)328
- C++ 实现:计算 n 个正整数中小于 x 的数的总和及代码详解(字节豆包 | 377点数解答 | 2025-12-06 20:17:15)86
- Python 实现:计算给定 n 个正整数中小于 x 的数的总和(字节豆包 | 132点数解答 | 2025-12-21 11:35:39)87
- C++ 实现:计算 n 个正整数中小于 x 的数的总和(字节豆包 | 405点数解答 | 2025-12-21 11:36:07)63