Ex 6_20 最优二叉搜索树..._第六次作业



假设关键字的总数为n,用c[i,j]表示第i个关键字到第j个关键字的最优二叉查找树的代价,我们的目标是求c[0,n-1]。要求c[i,j],首先要从第i个关键字到第j个关键字中选一个出来作为根结点,选出根结点后,最优二叉搜索树的代价为左子树的代价加上右子树的代价,由于每选出一个根结点,每个关键字的搜索长度都增加1,因此得出递推式,即当

package org.xiu68.ch06.ex6;
public class Ex6_20 {
//动态规划,最优二叉搜索树
public static void main(String[] args) {
// TODO Auto-generated method stub
double[] w=new double[]{0.05,0.4,0.08,0.04,0.1,0.1,0.23};
String[] words=new String[]{"begin","do","else","end","if","then","while"};
int[][] roots=new int[w.length][w.length]; //i到j之间的二叉搜索树的根结点
optimalBST(w,roots);
for(int i=0;i<roots.length;i++){
for(int j=0;j<roots[i].length;j++){
System.out.print(roots[i][j]+"\t");
}
System.out.println();
}
printRoot(words, roots,0,w.length-1);
/*
最少平均比较次数为:2.18
0 1 1 1 1 1 1
0 1 1 1 1 1 4
0 0 2 2 4 4 6
0 0 0 3 4 4 6
0 0 0 0 4 4 6
0 0 0 0 0 5 6
0 0 0 0 0 0 6
begin和while的根结点为 do
begin和begin的根结点为 begin
else和while的根结点为 while
else和then的根结点为 if
else和end的根结点为 else
end和end的根结点为 end
then和then的根结点为 then
*/
}
//roots中存放i到j之间的二叉搜索树的根结点
public static void optimalBST(double[] w,int[][] roots){
double[][] c=new double[w.length][w.length]; //i到j之间的二叉搜索树的最小代价
for(int i=0;i<w.length;i++){
c[i][i]=w[i]; //树只有自身,则代价为自身的频率
roots[i][i]=i; //(i到j的树的根结点)自身作为根结点
}
for(int s=2;s<=w.length;s++){ //s个单词作为子问题(子问题的规模)
for(int i=0;i<=w.length-s;i++){ //s个单词的第一个单词
int j=i+s-1; //s个单词的最后一个单词
double min=Double.MAX_VALUE;
for(int k=i;k<=j;k++){ //寻找使平均查找次数最少的根结点
double cLeft=0; //以k作为根结点的左子树的代价
double cRight=0; //以k作为根结点的右子树的代价
if(k>i)
cLeft=c[i][k-1];
if(k<j)
cRight=c[k+1][j];
if(cLeft+cRight<min){
min=cLeft+cRight;
roots[i][j]=k;
}
}//
double sum=0;
for(int t=i;t<=j;t++){
sum+=w[t];
}
c[i][j]=min+sum;
}//
}//
System.out.println("最少平均比较次数为:"+c[0][w.length-1]);
}
//打印最优根
public static void printRoot(String[] words,int[][] roots,int i,int j){
if(i<=j){
int k=roots[i][j];
System.out.println(words[i]+"和"+words[j]+"的根结点为 "+words[k]);
printRoot(words,roots,i,k-1);
printRoot(words,roots,k+1,j);
}
}
}
Ex 6_20 最优二叉搜索树..._第六次作业的更多相关文章
- OBST(最优二叉搜索树)
简述一下问题:假设有一颗词典二叉树,我们从中查找需要的单词,使用红黑树或平衡树这样的数据结构总是可以在O(lgN)时间内进行查找,但单词的出现频率是不同的,我们给每个单词加上一个搜索概率,然后通过这些 ...
- OBST(Optimal Binary Tree最优二叉搜索树)
二叉搜索树 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的 ...
- 算法导论( FFT & 自动机 & 最优二叉搜索树 !!!)
原图链接:(!!!)
- 基本数据结构 —— 二叉搜索树(C++实现)
目录 什么是二叉搜索树 二叉搜索树如何储存数值 二叉搜索树的操作 插入一个数值 查询是否包含某个数值 删除某个数值 测试代码 参考资料 什么是二叉搜索树 二叉搜索树(英语:Binary Search ...
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...
- 二叉查找树 _ 二叉排序树 _ 二叉搜索树_C++
一.数据结构背景+代码变量介绍 二叉查找树,又名二叉排序树,亦名二叉搜索树 它满足以下定义: 1.任意节点的子树又是一颗二叉查找树,且左子树的每个节点均小于该节点,右子树的每个节点均大于该节点. 2. ...
- 数据结构学习笔记_树(二叉搜索树,B-树,B+树,B*树)
一.查找二叉树(二叉搜索树BST) 1.查找二叉树的性质 1).所有非叶子结点至多拥有两个儿子(Left和Right): 2).所有结点存储一个关键字: 3).非叶子结点的左指针指向小于其关键字的子树 ...
- [Swift]LeetCode95. 不同的二叉搜索树 II | Unique Binary Search Trees II
Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ...
- [Swift]LeetCode96. 不同的二叉搜索树 | Unique Binary Search Trees
Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n? Example ...
随机推荐
- C++中>>,<<的重载问题
在学习对运算符的重载的时候,重载了++,--(前缀后缀),并且都是在定义为类中的成员函数.但是当我尝试去重载>>,<<为某一个类的成员函数的时候,就会报错,无论如何改参数的属性 ...
- CentOS 6.5 升级内核
Docker需要3.10以上内核支持,Centos6.5 默认内核为2.6.所以手动编译安装3.10内核. 查看当前系统内核版本 [root@gu ~]# uname -r2.6.32-431.el6 ...
- Windows环境安装MySQL数据库
Windows环境安装MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近在学习Java语言,开发环境在Windows操作系统上,因此需要在Windows上安装My ...
- Hadoop生态圈-HUE环境部署
Hadoop生态圈-HUE环境部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HUE简介 1>.HUE的由来 HUE全称是HadoopUser Experienc ...
- Hibernate的实体类中为什么要继承Serializable?
确切的说应该是对象的序列化,一般程序在运行时,产生对象,这些对象随着程序的停止运行而消失,但如果我们想把某些对象(因为是对象,所以有各自 不同的特性)保存下来,在程序终止运行后,这些对象仍然存在,可以 ...
- 学习windows编程 day2 之滚动条使用
相关函数: setscrollrange,setscrollpos,getscrollrange,getscrollpos 使用滚动条时我们需要进行的操作: 1.初始化滚动条范围和位置 在窗口创建时W ...
- mysql -- 动态获取结果集(重点)
注意:语句传值的时候必须是带有@符号的参数,不能是自己的局部变量,一个@叫用户变量,两个@叫做全局变量.用户变量:当前用户的‘’全局变量‘’,用户状态存在时就存在,用户退出时消失. 初始版 delim ...
- centos7 pgpool+postgresql
安装postgresql CentOS7安装并配置PostgreSQL 安装pgpool rpm -ivh http://www.pgpool.net/yum/rpms/3.7/redhat/rhel ...
- npm webpack工具 (监听压缩等)
压缩.监听变动自动打包,:开发后,js编译压缩及样式去空格等 $ webpack --config XXX.js //url使用另一份配置文件(比如webpack.config2.js)来打包 $ w ...
- win10如何获得管理员权限_百度经验
win10如何获得管理员权限_百度经验http://jingyan.baidu.com/article/0aa223755448db88cd0d6450.html 在右下方任务栏的“搜索web和win ...