01 最优二叉搜索树概念

设S={x1,x2,…,xn.}是有序集,且x1<x2<…<xn, 表示有序集S的二叉搜索树利用二叉树的结点来存储有序集中的元素。它具有下述性质:存储于每个结点中的元素x大于其左子树中任一结点所存储的元素,小于其右子树中任一结点所存储的元素。二叉 搜索树的叶结点是形如(xn,xi+1)的开区间。在表示S的二叉搜索树中搜索一个元素 x,返回的结果有两种情形:①在二叉搜索树的内结点中找到x=xi; ②在二叉搜索树的叶结点中确定x∈(xi,xi+1)。

设在第①种情形中找到元素x=xi的概率为bi;在第②种情形中确定x∈(xi, xi+1)的概率为ai。其中约定x0=-∞, xn+1=+∞。 显然,有ai≥0 (0≤i≤n),bj≥0(1≤j≤n),

则(a0,b1,a1,…, bn, an)称为集合S的存取概率分布。

最优二叉搜索树问题是对于有序集S及其存取概率分布(a0, b1,a1, .. bn,an),在所有表示有序集S的二叉搜索树中找出一棵具有最小平均路长的二叉搜索树。

02  最优子结构性质

二叉搜索树T的一棵含有结点ki,...,kj和叶结点(ki-1,ki),...,(kj,kj+1)的子树可以看做有序集{ki,...,kj}关于全集合{ki-1,...kj+1}的一棵二叉搜索树,设Tij是有序集{xi,...,xj}关于存取概率的一棵最优二叉搜索树,其平均路长为pij。Tij的根节点存储元素xm。其左右子树Ti和Tr的平均路长分别为pl和pr。由于Tl和Tr中结点深度是它们在Tij中结点深度减1,则 wi,j pi,j=wi,j+wi,m-1pl+wm+1,jpr。

由于T是关于集合{xi,…,xm-1}的一棵二叉搜索树,故Pl≥Pi,m-1。若pl>Pi,m-1,则用Ti,m-1替换Tl可得到平均路长比Tij更小的二叉搜索树。这与Tij是最优二又搜索树矛盾,故Tl是一棵最优二叉搜索树。同理可证,T,也是一 棵最优二叉搜索树。因此,最优二叉搜索树问题具有最优子结构性质。

设计出解最优二叉搜索树问题的动态规划算法如下:

void OptimalBinarySearchTree(int a,int b,int n,int **m,int **s,int **w){

for (int i=0;i<=n;i++){

w[i+1][i]=a[i];

m[i+1][i]=0;

}

for (int r0;r<n;r++){

for (int i=1;i<=n-r;i++){

int j=i+r;

w[i][j]=w[i][j-1]+a[j]+b[j];

m[i][j]=m[i+1][j];

s[i][j]=i;

for (int k=i+1;k<=j;k++){

int 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];

}

}

}

}

03  构造最优解

算法中用s[i][j]保存最优子树T(i,j)的根结点中元素,当s[i][n]=k时,Xk为所求二叉树根结点元素,其左子树为T(1,k-1)。因此,i=s[1][k-1]表示T(1,k-1)的根结点元素为xi,以此类推,容易右s保存的信息在O(n)时间内构造出所求的最优二叉搜索树。

04 计算复杂性

对于固定的r,它需要计算时间O(j-i+1)=O(r+1).因此,耗费的总时间为

void OBST(int a,int b,int n,int  **m,int **s,int **w){

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++){

for(int i=1;i<=n-r;i++){

int j=i+r,i1=s[i][j-1]>i?s[i][j-1]:i,j1=s[i+1][j]>i?s[i+1][j]:j;

w[i][j]=w[i][j-1]+a[j]+b[j];

m[i][j]=m[i][i1-1]+m[m1+1][j];

s[i][j]=i1;

for (int k=i1+1;k<=j1;k++){

int 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];

}

}

最优二叉搜索树相关内容相关推荐

  1. 算法导论 — 15.5 最优二叉搜索树

    ###笔记 二叉搜索树满足如下性质:假设xxx是二叉搜索树中的一个结点.如果lll是xxx的左子树的一个结点,那么l.key≤x.keyl.key ≤ x.keyl.key≤x.key.如果rrr是x ...

  2. 第十五章 动态规划(最优二叉搜索树)

    第15章动态规划(最优二叉搜索树) 15.5 最优二叉搜索树 15.5 练习 15.5-1 15.5-2 15.5-3 15.5-4 说在前面的话: 为什么单独拿出来发? 1.由于排版篇幅问题,放一起 ...

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

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

  4. 最优二叉搜索树探究【C/C++】

    简述 什么是二叉树 下面的这棵树,就是二叉搜索树 相对于什么最优 这里考虑的是ASL(average search length)平均搜索长度.即根据概率来生成ASL最小的搜索树. 到这里,最优二叉搜 ...

  5. 动态规划法实现最优二叉搜索树

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

  6. 最优二叉搜索树(Optimal BST)-算法导论

    问题描述: 维基百科定义: https://en.wikipedia.org/wiki/Optimal_binary_search_tree In the static optimality prob ...

  7. pintia 7-25 最优二叉搜索树

    pintia 7-25 最优二叉搜索树 输出格式: 第一行输出最小 m ,保留两位小数. 第二行先序遍历输出二叉树,对于实结点输出其编号,对于虚结点输出.,每一个符号后有一个空格,若有多个满足要求的二 ...

  8. 算法:最优二叉搜索树

    算法设计第五次作业part2 1.纸面题:对最优二叉树和矩阵连乘两种算法验证四边形法则,如果符合四边形法则则举几个正例,如果不符合则举几个反例 四边形法则 i<i'j<j'w(i,j)+w ...

  9. 算法实验 最优二叉搜索树

    最优二叉搜索树 最优二叉搜索树 问题描述 问题分析 代码 问题描述 二叉搜索树我们都知道,左子树结点的值都小于根结点,右子树结点的值都大于根节点.如果某个结点没有左子树或右子树,那么在对应的位置上加一 ...

最新文章

  1. 若一个用户进程通过read系统调用读取一个磁盘文件中的数据,则下列关于此过程的叙述中,正确的是( )
  2. Python练习-迭代器-模拟cat|grep文件
  3. html边框为框,HTML 为元素设置边框
  4. IDEA 插件开发入门教程
  5. 前端学习(2817):全局page配置文件
  6. 《Python Cookbook 3rd》笔记(1.14):排序不支持原生比较的对象
  7. Java输出小明算对多少题目_2014年Java方向C组第十题
  8. 2821: 作诗(Poetize)
  9. html简单用户登录界面_简单实现 nginx 用户登录认证
  10. Vmware和Citrix各自发展史
  11. vs2015打开慢的解决方法
  12. 帆软报表重要Activator之DesignerInitActivator之四WestRegionContainerPane 设计器的左边部分文件列表以及数据集的部分
  13. 微信小程序-仿淘宝(附真机测试图)(持续更新中。。。)
  14. wordpress 资料管理系统_说一说库存管理系统。
  15. android6.0闪光灯源码,android手电筒+闪光灯基本源码_linux编程_linux公社-linux系统门户网站...
  16. 三星android rom开发者,三星s10刷机包安卓10(极光AuroraROM 13.0)
  17. 大神论坛 利用活跃变量分析来去掉vmp的大部分垃圾指令
  18. 12级软件测试课程博客汇总
  19. gpuz怎么看显存颗粒
  20. Wireshark对pop3抓包分析

热门文章

  1. 百望股份获阿里腾讯系5.17亿元A轮融资
  2. 【译】绘制一棵漂亮的树
  3. c算法题中各种输入和输出方法技巧详解!
  4. 电化学毫伏测量电路基本要求
  5. 大数据AI智能—物联网世界对职业发展的影响
  6. CSS3打造不断旋转的CD封面
  7. 安装anaconda遇到的问题
  8. Date日期类型转换
  9. delve应该安装到哪_使用 Delve 代替 Println 来调试 Go 程序 | Linux 中国
  10. Batocera(巴托塞拉)技巧记录集合