假设关键字的总数为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 最优二叉搜索树..._第六次作业的更多相关文章

  1. OBST(最优二叉搜索树)

    简述一下问题:假设有一颗词典二叉树,我们从中查找需要的单词,使用红黑树或平衡树这样的数据结构总是可以在O(lgN)时间内进行查找,但单词的出现频率是不同的,我们给每个单词加上一个搜索概率,然后通过这些 ...

  2. OBST(Optimal Binary Tree最优二叉搜索树)

    二叉搜索树 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的 ...

  3. 算法导论( FFT & 自动机 & 最优二叉搜索树 !!!)

    原图链接:(!!!)

  4. 基本数据结构 —— 二叉搜索树(C++实现)

    目录 什么是二叉搜索树 二叉搜索树如何储存数值 二叉搜索树的操作 插入一个数值 查询是否包含某个数值 删除某个数值 测试代码 参考资料 什么是二叉搜索树 二叉搜索树(英语:Binary Search ...

  5. PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

    03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...

  6. 二叉查找树 _ 二叉排序树 _ 二叉搜索树_C++

    一.数据结构背景+代码变量介绍 二叉查找树,又名二叉排序树,亦名二叉搜索树 它满足以下定义: 1.任意节点的子树又是一颗二叉查找树,且左子树的每个节点均小于该节点,右子树的每个节点均大于该节点. 2. ...

  7. 数据结构学习笔记_树(二叉搜索树,B-树,B+树,B*树)

    一.查找二叉树(二叉搜索树BST) 1.查找二叉树的性质 1).所有非叶子结点至多拥有两个儿子(Left和Right): 2).所有结点存储一个关键字: 3).非叶子结点的左指针指向小于其关键字的子树 ...

  8. [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 ...

  9. [Swift]LeetCode96. 不同的二叉搜索树 | Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n? Example ...

随机推荐

  1. zoj3707(Calculate Prime S)解题报告

    1.计算(a/b)%c,其中b能整除a 设a=b*r=(bc)*s+b*t 则(b*t)为a除以bc的余数 r=c*s+t 而 (a/b)%c=r%c=t (a%bc)/b=(b*t)/b=t 所以对 ...

  2. DOM表格操作

    注意:就算代码中不包含<tbody>标签,浏览器解析时也可能会自动添加,因此需要注意子元素的选择 表格操作用到的属性: 1.tHead 2.tBodies 3.tFoot 更为细致的有: ...

  3. 算法入门及其C++实现

    https://github.com/yuwei67/Play-with-Algorithms (nlogn)为最优排序算法 选择排序 整个数组中,先选出最小元素的位置,将该位置与当前的第一位交换:然 ...

  4. Java_myBatis_XML代理_延迟加载

    使用mybatis的延迟加载,需要两个步骤: 1.在全局配置文件中添加一下语句(lazyLoadingEnabled默认为false,aggressiveLazyLoading默认为true) < ...

  5. 安装使用hibernate tools

    help-Eclipse marketplace-hibernate(搜索)-jboss tools(安装)

  6. saltstack 基本操作

    一.常用操作 ①.模块查看 #查看全部模块 [root@k8s_master ~]# salt '*' sys.list_modules # "*"为所有node节点 (此处可以写 ...

  7. 函数和常用模块【day04】:内置函数(九)

    一.11-20 11.ord(c) 功能:根据字符,找到对应的ascii值 1 2 >>> ord('a') 97 12.classmethod(function) 功能:类方法,这 ...

  8. Python基础【day03】:字符转编码操作(五)

    本节内容 1.编码介绍 2.字符编码介绍 3.总结 说到python的编码,一句话总结,说多了都是泪啊,这个在以后的python的开发中绝对是一件令人头疼的事情.所以有必要要讲讲清楚 一.编码介绍 1 ...

  9. Python复习笔记(二)变量进阶

    02. 可变和不可变类型 不可变类型,内存中的数据不允许被修改: 数字类型 int , bool , float , complex , long(2.x) 字符串 str 元组 tuple 可变类型 ...

  10. yolov3实践(一)

    很多博友看了我的第一篇博客yolo类检测算法解析——yolo v3,对其有了一定的认识和了解,但是并没有贴出代码和运行效果,略显苍白.因此在把篇博客理论的基础上,造就了第一篇实践文章,也就是本文.只要 ...