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++中const关键字的使用方法,烦透了一遍一遍的搜,总结一下,加深印象!!!
之前一直在学习C/C++,关于const的使用,这里出现一点,那里出现一点.知识用时方恨少,这一段时间正好各种笔试题,其中关于const的用法也是层出不穷,所以疲于在书本上各种翻,这里汇总一下,加深自 ...
- react缓存问题
问题一: 问题描述: 我们公司自己的react项目,先打包部署v1.1版本,一切正常. v1.2版本做了很多页面和功能的修改和新增,但是打包部署之后,发现有些界面还是保持了v1.1的状态,比如有些新增 ...
- mongodb集群故障转移实践
简介 NOSQL有这些优势: 大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制. 高扩展性,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向 ...
- hdu 3966(树链剖分+线段树区间更新)
传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...
- 十一、java线程
目录: 一.线程的基本概念 二.线程的创建和启动 三.线程的调度和优先级 四.线程的状态控制 五.线程同步 一.线程的基本概念 线程是一个程序内部的顺序控制流 线程和进程的区别: 每个进程都由独立的代 ...
- Java_myBatis_一对多映射
例如我们有需求需要实现以下查询 "一个用户对多条订单编号": select user.*,o.number,o.createtime from user left JOIN or ...
- 使用rownum对oracle分页【原】
以Student表为例进行分页 建表及插入 -- 有表结构如下 create table STUDENT ( sno INTEGER, sname ), sage INTEGER ); -- 插入数据 ...
- 3 快速创建SpringBoot项目
一.Intellij IDEA 创建Spring Boot项目 1.创建工程 2.选择Spring Initializr 3.设置Maven版本管理参数 4.选择引用模块 5.命名工程名 6.选 ...
- Rancher
Rancher Docker容器管理平台:图像化管理平台. centos server 10.100.10.10 docker node 10.100.10.15 安装 docker search ...
- 发现一sonar-runner bug
最近在使用sonar-runner做代码扫描, 在windows环境运行多模块的扫描ok,但是在linux上sonar-runner扫描多模块报错: 先贴sonar-project.propertie ...