动态规划之最优二叉搜索树
来源:互联网 发布:淘宝窗帘上门安装服务 编辑:程序博客网 时间:2024/05/22 18:37
/* * 最优二叉搜索树 */public class OptimalBST {private final int MAX=10000;private final int SCALE = 5;//树的规模private double[][] e= null;//e[i][j]表示树ki..kj的期望代价private double[][] w= null;//子树期望代价增加值private int[][] root=null;//记录子树的根private double[] p = {0,0.15,0.10,0.05,0.10,0.20};//k1..k5的概率private double[] q = {0.05,0.10,0.05,0.05,0.05,0.10};//d1..d5的概率public static void main(String[] args) {OptimalBST obst = new OptimalBST();obst.compute();//最优二叉搜索树obst.print(1, obst.SCALE, 0);}public OptimalBST() {e = new double[SCALE+2][SCALE+1];w = new double[SCALE+2][SCALE+1];root = new int[SCALE+2][SCALE+1];}//计算得到最优二叉搜索树期望代价private void compute() {for(int i=1;i<=SCALE+1;i++) {e[i][i-1] = q[i-1];w[i][i-1] = q[i-1];}for(int len=1;len<=SCALE;len++) {for(int i=1;i<=SCALE-len+1;i++) {int j=i+len-1;e[i][j] = 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;root[i][j] = r;}}}}}//打印最优二叉查找树的结构void print(int i,int j,int r){int rootChild = root[i][j];//子树根节点if (rootChild == root[1][SCALE]) {//输出整棵树的根System.out.println("k" + rootChild + "是根");print(i,rootChild - 1,rootChild);print(rootChild + 1,j,rootChild);return;}if (j < i - 1) {return;}else if (j == i - 1) { //遇到虚拟键if (j < r) {System.out.println("d" + j + "是k" + r + "的左孩子");}elseSystem.out.println("d" + j + "是k" + r + "的右孩子");return;}else { //遇到内部结点if (rootChild < r) {System.out.println("k" + j + "是k" + r + "的左孩子");}else {System.out.println("k" + j + "是k" + r + "的右孩子");}}print(i,rootChild - 1,rootChild);print(rootChild + 1,j,rootChild);}}
运行结果与算法导论上一致:
k2是根k1是k2的左孩子d0是k1的左孩子d1是k1的右孩子k5是k2的右孩子k4是k5的左孩子k3是k4的左孩子d2是k3的左孩子d3是k3的右孩子d4是k4的右孩子d5是k5的右孩子
0 0
- 动态规划之最优二叉搜索树
- 动态规划之最优二叉搜索树
- 动态规划之最优二叉搜索树
- 动态规划之最优二叉搜索树
- 动态规划之最优二叉搜索树
- 动态规划之最优二叉搜索树(算法导论)
- 【算法导论】动态规划之“最优二叉搜索树”
- 动态规划之最优二叉搜索树(代码)
- 算法导论之动态规划:最优二叉搜索树
- 小白进阶之动态规划-最优二叉搜索树
- 动态规划-最优二叉搜索树
- 动态规划--最优二叉搜索树
- 最优二叉搜索树-动态规划
- 最优二叉搜索树(动态规划)
- 动态规划—最优二叉搜索树
- 最优二叉搜索树动态规划
- 动态规划-最优二叉搜索树
- 最优二叉搜索树动态规划算法
- OpenMP编程实例(向量点积、矩阵乘法和快排)
- DS之栈实现数制转换(补充)
- 常见数据结构查找、插入、删除、遍历性能比较 常见排序算法的比较(图)
- No.1 A+B Problem
- 【SEO经典】SEOWHY官方培训教程,SEO学习必看
- 动态规划之最优二叉搜索树
- 欢迎使用CSDN-markdown编辑器
- UVA - 1618 Weak Key 推理+DP
- c语言字符串操作大全
- 待我代码编完,娶你可否(三)
- Android 调试 自测工具01 (Hugo 、Timber 、Scalpel )
- 骨骼动画详解-Cocos Studio
- 剑指offer--按之字形顺序打印二叉树
- VMware虚拟机安装Win8系统详细教程