1.先来看一下最优二叉树:

2.举个例子:




平局比较次数:

计算比较的平均次数:

3.其中最主要的推导公式:



其中:C[i][j]表示二叉查找树T(i,j)的平均比较次数;R[i][j]表示二叉查找树T(i,j)中作为根节点的元素在序列S中的位置;q[i]存储虚节点e0,e1,e2…en;p[i]表示存储序列S中的相应元素的查找概率;每次在计算C(i,j)时都计算Wij的值,把计算的的值存储在W[i][j]中。

1.未优化代码

方法一:这是未优化的代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=105;
const int inf=0x3f3f3f3f;
double p[maxn];
double q[maxn];
double C[maxn][maxn];
int R[maxn][maxn];
int n;
void OptimalBinarySearchTree(){double w[maxn][maxn];for(int i=1;i<=n+1;i++){C[i][i-1]=q[i-1];w[i][i-1]=q[i-1];}for(int t=1;t<=n;t++){//循环计算各个子问题的最优解for(int i=1;i<=n-t+1;i++){int j=t+i-1;w[i][j]=w[i][j-1]+p[j]+q[j];C[i][j]=inf;R[i][j]=i;for(int k=i;k<=j;k++){double t=C[i][k-1]+C[k+1][j];if(t<C[i][j]){C[i][j]=C[i][k-1]+C[k+1][j];R[i][j]=k;}}C[i][j]+=w[i][j];}}
}
//构造最优解
void BestSolution(int r[maxn][maxn],int i,int j){if(i<=j){BestSolution(r,i,r[i][j]-1);BestSolution(r,r[i][j]+1,j);cout<<"s"<<i<<":s"<<j<<"的根为: "<<r[i][j]<<endl;}
}
int main(){while(scanf("%d",&n)!=EOF){if(n==0)break;p[0]=-1;for(int i=1;i<=n;i++){scanf("%lf",&p[i]);}for(int i=0;i<=n;i++){scanf("%lf",&q[i]);}OptimalBinarySearchTree();BestSolution(R,1,5);}return 0;
}
/*
5
0.15 0.1 0.05 0.1 0.2
0.05 0.1 0.05 0.05 0.05 0.1
*/

2.优化代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=105;
const int inf=0x3f3f3f3f;
double p[maxn];
double q[maxn];
double C[maxn][maxn];
int R[maxn][maxn];
int n;
void OptimalBinarySearchTree(){double w[maxn][maxn];for(int i=1;i<=n+1;i++){C[i][i-1]=0;w[i][i-1]=0;R[i][i-1]=0;}int temp1,temp2;for(int t=1;t<=n;t++){for(int i=1;i<=n-t+1;i++){int j=t+i-1;temp1=R[i][j-1]>i?R[i][j-1]:i;temp2=R[i+1][j]>j?R[i+1][j]:j;w[i][j]=w[i][j-1]+p[j]+q[j];C[i][j]=inf;R[i][j]=temp1;for(int k=temp1;k<=temp2;k++){double t=C[i][k-1]+C[k+1][j];if(t<C[i][j]){C[i][j]=C[i][k-1]+C[k+1][j];R[i][j]=k;}}C[i][j]+=w[i][j];}}
}
void BestSolution(int r[maxn][maxn],int i,int j){if(i<=j){BestSolution(r,i,r[i][j]-1);BestSolution(r,r[i][j]+1,j);cout<<"s"<<i<<":s"<<j<<"的根为: "<<r[i][j]<<endl;}
}
int main(){while(scanf("%d",&n)!=EOF){if(n==0)break;p[0]=-1;for(int i=1;i<=n;i++){scanf("%lf",&p[i]);}for(int i=0;i<=n;i++){scanf("%lf",&q[i]);}OptimalBinarySearchTree();BestSolution(R,1,5);}return 0;
}
/*
5
0.15 0.1 0.05 0.1 0.2
0.05 0.1 0.05 0.05 0.05 0.1
*/

输出结果:

动态规划-最优二叉查找树相关推荐

  1. DP之最优二叉查找树

    前面说过动态规划最典型的就是解决最优化问题的(具有最优子结构的最优化问题),最优二叉查找树就是一个典型的最优化问题. 问题描述: 给定一个n元素的中序序列,它可以有卡特兰数个不同形状的二叉排序树.(卡 ...

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

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

  3. 最优二叉查找树—动态规划C++

    最优二叉查找树 一.问题描述 二.动态规划算法解题思路 三.解题思路图形化 四.思考:为什么输入概率相同(无序),输出结果不一样 流程图 实例 示例代码 一.问题描述 1.问题描述: 基于统计先验知识 ...

  4. 【算法学习】最优二叉查找树(动态规划)

    一.什么是最优二叉查找树 最优二叉查找树: 给定n个互异的关键字组成的序列K=<k1,k2,...,kn>,且关键字有序(k1<k2<...<kn),我们想从这些关键字中 ...

  5. 最优二叉查找树(动态规划)——详解

    最优二叉查找树 (1)二叉查找树(二分检索树)二叉搜索树 T是一棵二元树,它或者为空,或者其每个结点含有一个可以比较大小的数据元素,且有: T的左子树的所有元素比根结点中的元素小: T的右子树的所有元 ...

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

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

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

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

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

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

  9. 最优二叉查找树 次优二叉查找树 最优二叉树

    未完成.. 在数据结构课本中,查找,作为倒数的章节介绍,不是因为它不重要,而是它本身作为一种数据结构比较简单.但实用用性较强. 按照查找的引出的先后顺序介绍: 1. 静态查找(树)表 以下介绍的是有序 ...

最新文章

  1. mysql的innodb数据库引擎详解
  2. matlab能修图吗,相机上这个“功能”,不打开会影响修图效果,别等拍完照片才知道...
  3. 印章WinForm自定义控件封装,提供源码下载
  4. asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”...
  5. STATISTICS TIME ON
  6. SAP CRM呼叫中心和Hybris Backoffice的轮询设计
  7. c++面向对象高级编程 学习六 虚函数
  8. linux 32位平台,文件大小受限于2G的解决方法
  9. Library Monkey Pro for Mac(专业的音频控制整理工具)
  10. hapi.js入门系列(二)——路由
  11. 处理WIN7任务栏通知区域图标异常问题
  12. couldn't create PTY
  13. STM32——理解中断与中断配置
  14. 百度api使用:文字识别(OCR)、长图文字识别、姓名识别
  15. 我的世界服务器地图名称修改,《我的世界》修改地图名称颜色教程
  16. 软考软件设计师考试经验与体会
  17. css漂亮的侧导航栏,CSS3实现的可缩进的侧栏导航菜单
  18. 什么是专利查新检索报告?
  19. 数字电路-【百科总结】
  20. Overview PPT 类型 PPT 制作流程

热门文章

  1. ACMNO.20 C语言-插入队列 已有一个已排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。 输入 第一行,原始数列。 第二行,需要插入的数字。
  2. PyTorch 系列教程之空间变换器网络
  3. 你见过最差的算法工程师都有哪些表现?
  4. 目标跟踪初探(DeepSORT)
  5. 从数据集到2D和3D方法,一文概览目标检测领域进展
  6. djongo:Django和MongoDB连接器
  7. 医疗信息安全再添新保障
  8. Chapter 9:Noise-Estimation Algorithms
  9. Visual Studio 2017新版发布,极大提高开发效率丨附下载
  10. shell 监控局域网的主机是否up(转)