最优二叉搜索树相关内容
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];
}
}
最优二叉搜索树相关内容相关推荐
- 算法导论 — 15.5 最优二叉搜索树
###笔记 二叉搜索树满足如下性质:假设xxx是二叉搜索树中的一个结点.如果lll是xxx的左子树的一个结点,那么l.key≤x.keyl.key ≤ x.keyl.key≤x.key.如果rrr是x ...
- 第十五章 动态规划(最优二叉搜索树)
第15章动态规划(最优二叉搜索树) 15.5 最优二叉搜索树 15.5 练习 15.5-1 15.5-2 15.5-3 15.5-4 说在前面的话: 为什么单独拿出来发? 1.由于排版篇幅问题,放一起 ...
- 动态规划最优二叉搜索树C语言,算法 – 动态规划:最优二叉搜索树
好吧,我希望有人可以向我解释一下.我正在攻读决赛,我无法解决问题. 问题是动态编程;构造最优二叉搜索树(OBST).我理解一般的动态编程和特别是这个问题的概念,但我不明白这个问题的递归形式. 我得到的 ...
- 最优二叉搜索树探究【C/C++】
简述 什么是二叉树 下面的这棵树,就是二叉搜索树 相对于什么最优 这里考虑的是ASL(average search length)平均搜索长度.即根据概率来生成ASL最小的搜索树. 到这里,最优二叉搜 ...
- 动态规划法实现最优二叉搜索树
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...
- 最优二叉搜索树(Optimal BST)-算法导论
问题描述: 维基百科定义: https://en.wikipedia.org/wiki/Optimal_binary_search_tree In the static optimality prob ...
- pintia 7-25 最优二叉搜索树
pintia 7-25 最优二叉搜索树 输出格式: 第一行输出最小 m ,保留两位小数. 第二行先序遍历输出二叉树,对于实结点输出其编号,对于虚结点输出.,每一个符号后有一个空格,若有多个满足要求的二 ...
- 算法:最优二叉搜索树
算法设计第五次作业part2 1.纸面题:对最优二叉树和矩阵连乘两种算法验证四边形法则,如果符合四边形法则则举几个正例,如果不符合则举几个反例 四边形法则 i<i'j<j'w(i,j)+w ...
- 算法实验 最优二叉搜索树
最优二叉搜索树 最优二叉搜索树 问题描述 问题分析 代码 问题描述 二叉搜索树我们都知道,左子树结点的值都小于根结点,右子树结点的值都大于根节点.如果某个结点没有左子树或右子树,那么在对应的位置上加一 ...
最新文章
- 若一个用户进程通过read系统调用读取一个磁盘文件中的数据,则下列关于此过程的叙述中,正确的是( )
- Python练习-迭代器-模拟cat|grep文件
- html边框为框,HTML 为元素设置边框
- IDEA 插件开发入门教程
- 前端学习(2817):全局page配置文件
- 《Python Cookbook 3rd》笔记(1.14):排序不支持原生比较的对象
- Java输出小明算对多少题目_2014年Java方向C组第十题
- 2821: 作诗(Poetize)
- html简单用户登录界面_简单实现 nginx 用户登录认证
- Vmware和Citrix各自发展史
- vs2015打开慢的解决方法
- 帆软报表重要Activator之DesignerInitActivator之四WestRegionContainerPane 设计器的左边部分文件列表以及数据集的部分
- 微信小程序-仿淘宝(附真机测试图)(持续更新中。。。)
- wordpress 资料管理系统_说一说库存管理系统。
- android6.0闪光灯源码,android手电筒+闪光灯基本源码_linux编程_linux公社-linux系统门户网站...
- 三星android rom开发者,三星s10刷机包安卓10(极光AuroraROM 13.0)
- 大神论坛 利用活跃变量分析来去掉vmp的大部分垃圾指令
- 12级软件测试课程博客汇总
- gpuz怎么看显存颗粒
- Wireshark对pop3抓包分析