最优二叉搜索树问题的问题提出是,设S={x1, x2, …, xn}是一个由n个关键字组成的线性有序集,(a0, b1, a1, …, bn, an) 为集合S的存取概率分布,表示有序集S的二叉搜索树利用二叉树的节点存储有序集中的元素。在二叉搜索树中搜索一个元素x。在二叉搜索树的内部结点中找到x的概率为bj;在二叉搜索树的叶结点中确定x的概率为ai。最优二叉搜索树问题要求找出搜索成本最低的二叉搜索树。设n=4,b(1:4)=(3, 3, 1, 1),a(1:5)=(2, 3, 1, 1, 1)。
1)写出最优二叉搜索树问题最优值递归定义。

2)采用动态规划算法求该最优二叉搜索树,将算法编程实现。

package test;public class today {static int n = 4;//内部结点个数static float[] a = {2, 3, 1, 1, 1} , b = {3, 3, 1, 1};static float[][] m = new float[a.length+1][b.length+1] ,//记录最短平均路长w = new float[a.length+1][b.length+1];//记录w[i][j],涉及所有a和b相加static int[][] s = new int[a.length+1][b.length+1];//记录根的最优解public static void main(String[] args) {optimalBinarySearchTree(a , b , m , s , w);System.out.println("m:");show(m);System.out.println("s:");show(s);System.out.println("w:");show(w);}
//  最优二叉搜索树public static void optimalBinarySearchTree(float[] a , float[] b ,float[][] m/*记录最短平均路长*/ , int[][] s/*记录根的最优解*/ , float[][] w/*记录w[i][j],涉及所有a和b相加*/) {for(int i = 0;i <= n;++i)//n指传入有序序列长度{w[i+1][i] = a[i];//w[i+1][i]保存a0到ai的值m[i+1][i] = 0;//全规定为0,图像为对角线}for(int r = 0;r < n;++r)//n个内部结点,n = a.length{for(int i = 1;i <= n-r;++i){int j = i+r;//终值下标,n>=j>=iw[i][j] = w[i][j-1] + a[j] + b[j-1];m[i][j] = m[i][i-1] + m[i+1][j];s[i][j] = i;for(int k = i+1;k <=j;++k)//计算其他子树,然后找到最小那个{float t = m[i][k-1] + m[k+1][j];if(t < m[i][j]){m[i][j] = t;s[i][j] = k;}}m[i][j] += w[i][j];}}}//   展示int型二维数组public static void show(int[][] a){for(int i = 1;i < a.length;++i){for(int j = 0;j < a[i].length;++j){System.out.print(a[i][j]+" ");}System.out.println();}}// 展示float型二维数组public static void show(float[][] a){for(int i = 1;i < a.length;++i){for(int j = 0;j < a[i].length;++j){System.out.print(a[i][j]+" ");}System.out.println();}}
}

运行结果截图:
3)分析算法的时间复杂性。

来自课本《算法基础与实验》

【算法设计与分析】动态规划:最优二叉搜索树相关推荐

  1. 动态规划最优二叉搜索树C语言,【算法导论】动态规划之“最优二叉搜索树”...

    详解动态规划之"最优二叉搜索树" 之前两篇分别讲了动态规划的"钢管切割"和"矩阵链乘法",感觉到了这一篇,也可以算是收官之作了.其实根据前两 ...

  2. 动态规划最优二叉搜索树C语言,算法 – 动态规划:最优二叉搜索树

    好吧,我希望有人可以向我解释一下.我正在攻读决赛,我无法解决问题. 问题是动态编程;构造最优二叉搜索树(OBST).我理解一般的动态编程和特别是这个问题的概念,但我不明白这个问题的递归形式. 我得到的 ...

  3. 动态规划——最优二叉搜索树

     (二叉搜索树即二叉排序树,该题并不是问如何构造最优二叉树,而是如何在二叉搜索树中达成最优搜索效率) 简而言之,这个最优二叉搜索树的每个根节点都大于左子树的任一元素,小于其右子树的任意元素,相当于用根 ...

  4. 《算法导论》15.5 最优二叉搜索树(含C++代码)

    一.问题背景和描述 给定一个n个不同关键字的已排序的序列K=<k1,k2, - kn>(因此k1<k2<-<kn),我们希望用这 些关键字构造一棵二叉搜索树.对每个关键字 ...

  5. 最优二叉搜索树java_动态规划-最优二叉搜索树

    算法思想:动态规划 实际问题:最优二叉搜索树 编写语言:Java 问题描述 二叉搜索树的定义: 满足以下任意两个条件的一个,就可称这棵树为二叉搜索树: 它是一棵空树 该树是一颗二叉树,非空,且满足下列 ...

  6. 第十五章 动态规划——最优二叉搜索树

    1.前言: 接着学习动态规划方法,最优二叉查找树问题.二叉查找树参考http://www.cnblogs.com/Anker/archive/2013/01/28/2880581.html.如果在二叉 ...

  7. c语言动态规划最优二叉搜索树,最优二叉搜索树(动态规划)

    #include #include #include #include #include enum:int { MAXVALUE=999 }; template class BestTree{ pri ...

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

    原图链接:(!!!) 转载于:https://www.cnblogs.com/zpfbuaa/p/5099680.html

  9. 算法设计与分析--最优二叉搜索树(Python)

    最优二叉搜索树: 给定一个n个不同关键字的已排序的序列K=<k1,k2,-,kn>(因此k1<k2<-<kn)我们希望用这些关键字构造一棵二叉树.对每个关键字ki,都有一 ...

最新文章

  1. mongoDB设置用户名密码的一个要点
  2. C语言//注释使下一行代码失效
  3. POJ 1330 LCA最近公共祖先 离线tarjan算法
  4. Objective-C 2.0 with Cocoa Foundation--- 7,对象的初始化以及实例变量的作用域
  5. Eclipse StartExplorer插件
  6. java web乱码问题_Java Web中文乱码问题解决
  7. 你想过同时为两家以上的企业工作吗?
  8. matlab画图不显示中文_[过时] [LaTeX 使用] 升级 macOS 10.15 后 ctex 文档不显示中文的临时方案...
  9. java使用itext合并pdf文件
  10. Less 颜色操作函数Mix的计算方法
  11. 免费ftp空间的文件传输
  12. DFS.01-寻路问题
  13. 【转】Boost和loki智能指针
  14. 微信小程序 宠物社区源码
  15. kong/kongA docker部署+汉化
  16. H3C交换机常用命令汇总
  17. 5个炫酷登录页面,拿去就能用(附源码)
  18. KML、GML、GeoRSS、SVG (转)
  19. EduCoder-程序设计技术R-循环结构程序设计2-(第1关:C循环-求平均成绩)(第2关:C循环-求各位数字)(第3关:C循环-求阶乘之和)(第4关:C循环-水仙花数)(第5关:C循环
  20. 利用python制作几个简单的游戏

热门文章

  1. 用EasyBoot制作光盘启动菜单
  2. PKIX path building failed问题记录
  3. 新版火狐浏览器标签页覆盖原页面解决方案
  4. 速卖通适合新卖家吗?速卖通平台有哪些优势
  5. 使用phpMyAdmin管理WordPress数据库入门指南
  6. android 动态切换主题,android动态主题切换(RRO 技术)
  7. mi5s plus android 8.0,小米5s Plus获安卓8.0系统更新:续航能力、速度和安全极大提升...
  8. 记录学习前端知识的旅程【4】
  9. ADAMS人体行走与跌倒仿真实验【附源文件】
  10. 万字长文干货,面试官角度看招聘