最优二叉搜索树算法的java实现(动态规划法)

具体问题描述以及C/C++实现参见网址

http://blog.csdn.net/liufeng_king/article/details/8694652

未改进版的java代码如下:

/*** 最优二叉搜索树(动态规划)---未改进版* @author Lican**/
public class BinarySearchTree {public void optimalBinarySearchTree(float[] a,float[] b,float[][] m,int[][] s,float[][] w){int n=a.length-1;        for(int i=0;i<=n;i++){//初始化构造无内部节点的情况w[i+1][i]=a[i];m[i+1][i]=0;}for(int r=0;r<n;r++){//r为i与j之间的差值for(int i=1;i<=n-r;i++){int j=i+r;//i,j之间距离为r时,首选i为根,其左子树为空,右子树为节点w[i][j]=w[i][j-1]+a[j]+b[j];//计算w[i][j]m[i][j]=m[i+1][j];s[i][j]=i;for(int k=i+1;k<=j;k++){//i<=k<=j,通过k循环,找到min{m(i,k-1)+m(k+1,j)}的值float temp=m[i][k-1]+m[k+1][j];if(temp<m[i][j]){m[i][j]=temp;s[i][j]=k;//k作为根节点}}m[i][j]+=w[i][j];//m(i,j)=wi,j+min{m(i,k-1)+m(k+1,j)}}}}public void backtrace(int[][] s,int n,int i,int j,int p,String str){int k=s[i][j];if(k>0){if(p==0){System.out.println("root is:"+k);}else{System.out.println(str+" of "+p+" is "+k+"; and (i:j) is "+i+":"+j);}int t=k-1;if(t>=i&&t<=n)backtrace(s,n,i,t,k,"left");t=k+1;if(t<=j)backtrace(s,n,t,j,k,"right");}}public static void main(String[] args) {float a[] = {0.15f,0.1f,0.05f,0.05f};//a,b的下标都是从0开始float b[] = {0.00f,0.5f,0.1f,0.05f};int n=a.length-1;float[][] m=new float[n+2][n+2];int[][] s=new int[n+2][n+2];//因为w[i+1][i]存在,i最大为n,即可以从0.....n,n+1,共n+2个float[][] w=new float[n+2][n+2];BinarySearchTree bi = new BinarySearchTree();bi.optimalBinarySearchTree(a, b, m, s, w);System.out.println("二叉搜索树最小平均路长为:"+m[1][n]);bi.backtrace(s, n, 1, n, 0, "0");}}

算法实现结果如图:

===================================================================================================================================

改进后的java代码如下(具体改进的地方,参见引文中的介绍)

/*** 最优二叉搜索树(动态规划)---改进版* @author Lican**/
public class BinarySearchTree2 {public void optimalBinarySearchTree(float[] a,float[] b,float[][] m,int[][] s,float[][] w){int n=a.length-1;       for(int i=0;i<=n;i++){//初始化构造无内部节点的情况w[i+1][i]=a[i];m[i+1][i]=0;s[i+1][i]=0;}for(int r=0;r<n;r++){//r为i与j之间的差值for(int i=1;i<=n-r;i++){int j=i+r;/*以下为 改进后的地方*/int i1=s[i][j-1]>i?s[i][j-1]:i;int j1=s[i+1][j]>i?s[i+1][j]:j;//i,j之间距离为r时,首选i为根,其左子树为空,右子树为节点w[i][j]=w[i][j-1]+a[j]+b[j];//计算w[i][j]m[i][j]=m[i][i1-1]+m[i1+1][j];//k=i1时的情况s[i][j]=i1;//左子树为节点:i1,i1+1……k-1,右子树为节点:k+1,k+2,……j1for(int k=i1+1;k<=j1;k++){//i1<=k<=j1,通过k循环,找到min{m(i,k-1)+m(k+1,j)}的值float temp=m[i][k-1]+m[k+1][j];if(temp<m[i][j]){m[i][j]=temp;s[i][j]=k;//k作为根节点}}m[i][j]+=w[i][j];//m(i,j)=wi,j+min{m(i,k-1)+m(k+1,j)}}}}public void backtrace(int[][] s,int n,int i,int j,int p,String str){int k=s[i][j];if(k>0){if(p==0){System.out.println("root is:"+k);}else{System.out.println(str+" of "+p+" is "+k+"; and (i:j) is "+i+":"+j);}int t=k-1;if(t>=i&&t<=n)backtrace(s,n,i,t,k,"left");t=k+1;if(t<=j)backtrace(s,n,t,j,k,"right");}}public static void main(String[] args) {float a[] = {0.15f,0.1f,0.05f,0.05f};//a,b的下标都是从0开始float b[] = {0.00f,0.5f,0.1f,0.05f};int n=a.length-1;float[][] m=new float[n+2][n+2];int[][] s=new int[n+2][n+2];//因为w[i+1][i]存在,i最大为n,即可以从0.....n,n+1,共n+2个float[][] w=new float[n+2][n+2];BinarySearchTree bi = new BinarySearchTree();bi.optimalBinarySearchTree(a, b, m, s, w);System.out.println("二叉搜索树最小平均路长为:"+m[1][n]);bi.backtrace(s, n, 1, n, 0, "0");}}

运行结果与未改进版相同。

算法java实现--动态规划--最优二叉树搜索相关推荐

  1. 算法设计——最优二叉树搜索问题

    ​​​​​​1.问题描述 假定我们正在设计一个程序,实现英语文本到法语的翻译.对英语文本中出现的每个单词,我们需要查找对应的法语单词.为了实现这些查找操作,可以创建一棵二叉搜索树,将n个英语单词作为关 ...

  2. 7.8 最优二叉树与哈夫曼编码

    最优二叉树定义 对于一棵树,可以将每一个结点赋一个数值,称之为结点的权重(weight),简称权.定义一棵树上某个结点ViV_i的带权路径长度(weighted path length)为从根节点到该 ...

  3. 算法(Java)——动态规划

    算法相关数据结构总结: 序号 数据结构 文章 1 动态规划 动态规划之背包问题--01背包 动态规划之背包问题--完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 ...

  4. java 实现最优二叉树_哈夫曼树(最优二叉树)及其Java实现

    一.定义 一些定义: 节点之间的路径长度:在树中从一个结点到另一个结点所经历的分支,构成了这两个结点间的路径上的经过的分支数称为它的路径长度 树的路径长度:从树的根节点到树中每一结点的路径长度之和.在 ...

  5. 算法导论之动态规划(最长公共子序列和最优二叉查找树)

    动态规划师通过组合子问题的解而解决整个问题,将问题划分成子问题,递归地求解各子问题,然后合并子问题的解而得到原问题的解.和分治算法思想一致,不同的是分治算法适合独立的子问题,而对于非独立的子问题,即各 ...

  6. 二叉查找树(1)-二叉树-数据结构和算法(Java)

    文章目录 1 前言 1.1 二叉查找树定义 1.2 二叉查找树的性质 2 基本实现 2.1 API 2.2 实现代码 2.2.1 数据表示 2.2.2 查找 2.2.3 插入 3 分析 4 有序性相关 ...

  7. Java使用动态规划算法思想解决01背包问题

    Java使用动态规划算法思想解决背包问题 背包问题是一种组合优化的NP完全问题.问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高 动 ...

  8. [算法] 二叉树的DFS与BFS算法 (Java) -- 痛定思痛 彻底搞懂

    二叉树的DFS与BFS算法 (Java) 1.概念 ①DFS (深度优先搜索) 维基百科读一遍 定义看完, 看一遍gif ②BFS (广度优先搜索) 维基百科读一遍 gif看一遍 2. 算法实现 二叉 ...

  9. 数据结构与算法Java(二)——字符串、矩阵压缩、递归、动态规划

    不定期补充.修正.更新:欢迎大家讨论和指正 本文以数据结构(C语言版)第三版 李云清 杨庆红编著为主要参考资料,用Java来实现 数据结构与算法Java(一)--线性表 数据结构与算法Java(二)- ...

最新文章

  1. POJ_2001_Shortest Prefixes
  2. 2017 清北济南考前刷题Day 2 afternoon
  3. Python 中文分词(结巴分词)
  4. zcmu 1128 (数据处理)
  5. 【第四周作业】参加项目开发之后的一些体会
  6. python数据分析方法和命令_《利用Python进行数据分析》 —— (1)
  7. 文字描边_如何在网页里实现文字描边效果
  8. 爬动的蠕虫(C++)
  9. 使用Phantom omni力反馈设备控制机器人
  10. MFC开发IM--MFC非模态对话框的创建及显示
  11. 向数据库插入中文乱码
  12. react native 问题点
  13. 3. Javascript 对象
  14. APP端上通用安全体系建设
  15. arduino eeg脑电模块_手把手教你EEG脑电数据预处理-原理篇
  16. 王家林 构建spark集群
  17. java 使用7z进行解压_java调用7zip解压压缩包的实例
  18. getch()和getche()
  19. quickAction
  20. 自动化测试——QQ邮箱登陆

热门文章

  1. 【转】LayoutInflater介绍
  2. 日期格式化之moment()和moment().format()的区别
  3. 分析B站《送你一朵小红花》弹幕评论
  4. 给IDEA更换精致的主题
  5. SAP WM层面的盘点流程里并无偷懒技巧之设计?
  6. log4j java web_javaWeb配置log4j
  7. 【音视频开发】为什么无损音频会有44.1Khz这样的奇葩采样率?
  8. foxmail创建qq邮箱
  9. JS实现鼠标移上去图片停止滚动移开恢复滚动效果
  10. 有哪些快速翻译英文的软件推荐