算法导论 ch15 动态规划 最优二叉查找树

本文介绍了一种用于计算最优二叉搜索树的算法,并通过示例展示了算法的具体实现过程。该算法使用动态规划方法来确定使搜索期望代价最小化的二叉搜索树结构。

1. source code

#include <iostream> using namespace std; void optimalBST(double *p, double *q, int n) { const int COL = n + 2; double *e = new double[(n + 2) * COL]; double *w = new double[(n + 2) * COL]; int *root = new int[(n + 2) * COL]; for (int i = 1; i <= n + 1; i++) { e[i * COL + (i - 1)] = q[i - 1]; w[i * COL + (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 * COL + j] = numeric_limits<int>::max(); w[i * COL + j] = w[i * COL + j - 1] + p[j]+ q[j]; for (int r = i ; r <= j; r++) { double t = e[i * COL + r - 1] + e[(r + 1) * COL + j]+ w[i * COL + j]; if (t < e[i * COL + j]) { e[i * COL + j] = t; root[i * COL + j] = r; } } } } cout << "matrix e :"<< endl; for (int i = 1; i < COL; i++) { for (int j = 0; j <= n; j++) { cout << e[i * COL + j]<< " "; } cout << endl; } cout << "matrix w :"<< endl; for (int i = 1; i < COL; i++) { for (int j = 0; j <= n; j++) { cout << w[i * COL + j]<< " "; } cout << endl; } cout << "matrix root :"<< endl; for (int i = 1; i < COL - 1; i++) { for (int j = 1; j < COL - 1; j++) { cout << root[i * COL + j]<< " "; } cout << endl; } } int main() { double p[] = { 0, 0.15, 0.1, 0.05, 0.1, 0.2 }; double q[] = { 0.05, 0.1, 0.05, 0.05, 0.05, 0.1 }; int n = sizeof(p)/sizeof(double); optimalBST(p, q, n - 1); }

2. test result

matrix e : 0.05 0.45 0.9 1.25 1.75 2.75 0 0.1 0.4 0.7 1.2 2 0 0 0.05 0.25 0.6 1.3 0 0 0 0.05 0.3 0.9 0 0 0 0 0.05 0.5 0 0 0 0 0 0.1 matrix w : 0.05 0.3 0.45 0.55 0.7 1 0 0.1 0.25 0.35 0.5 0.8 0 0 0.05 0.15 0.3 0.6 0 0 0 0.05 0.2 0.5 0 0 0 0 0.05 0.35 0 0 0 0 0 0.1 matrix root : 1 1 2 2 4 0 2 2 2 4 0 0 3 4 5 0 0 0 4 5 0 0 0 0 5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值