笔者先介绍一下动态规划法最优二叉查找树以及填表公式(本质是想吐槽其繁琐)。

设T(i, j)是由记录{ri, …, rj}(1≤i≤j≤n)构成的二叉查找树,C(i, j)是这棵二叉查找树的平均比较次数。虽然最后的结果是C(1, n),但遵循动态规划法的求解方法,需要求出所有较小子问题C(i, j)的值,考虑从{ri, …, rj}中选择一个记录rk作为二叉查找树的根结点,可以得到如下关系:

设一个二维表C[n+1][n+1],其中C[i][j]表示二叉查找树T(i, j)的平均比较次数。二维表R[n+1][n+1],其下标范围与二维表C相同,R[i][j]表示二叉查找树T(i, j)的根结点的序号。

想要得到两个二维表的值,需要按照公式去计算每个C[i][j],这对于笔者这样讨厌繁琐的人来说是致命的,所以笔者尝试去寻找表中的规律,幻想不用公式,却能快速求出准确的值。事实证明规律是存在的。

求C[i][j]时,设以C[i][i-1],C[j+1][j],C[i][j]三个点形成的直角三角形的斜边上的值累加和为S(斜),直角边上对应两点的和为S(直),显然S[直]有j-i+1个,则C[i][j]=S[斜]+min{S[直]}。下面举个例子求C[1][3]的值,如图所示:

S(斜)=0.1+0.2+0.4=0.7,S(直)=min{S1(直),S2(直),S3(直)}=min{0+0.8,0.1+0.4,0.4+0}=0.4,则C[1][3]=0.7+0.4=1.1。同理,求C[2][4],如下图所示,C[2][4]=1.4:

其实本质没有发生改变,只是把数学公式图形化,方便填表。最优二叉查找树代码如下:

void OptimalBST(double a[],double b[],int n,double **R,int **mink,double **C)
{//初始化for(int i=0; i<=n; i++){C[i+1][i] = a[i];R[i+1][i] = 0;}for(int d=0; d<n; d++) for(int i=1; i<=n-d; i++) //对角线逐条计算{ C[i][j]=C[i][j-1]+a[j]+b[j];R[i][j]=R[i+1][j];mink[i][j]=i;for(int k=i+1; k<=j; k++)if(R[i][k-1]+R[k+1][j]<R[i][j]){R[i][j]= R[i][k-1]+R[k+1][j];mink[i][j]=k; }R[i][j]+=C[i][j];}
}

最优二叉查找树,动态规划法,二维表,填表优化,代码相关推荐

  1. Excel用自动填表快速实现一维表到二维表的转换

    如下图的一维数据表,我们看到学生的高考成绩已经出来了,现在我们需要将其转为二维打印格式的交叉表,如何操作呢,首先来看动图演示 (方方格子插件) 1.分解步骤第一步要选择方方格子按钮 2.第二步选择查找 ...

  2. Excel如何快速填写二维表

    如下图左侧是某公司一维销售表,现在想要将数据从提取到右侧这种二维表中. 点击下图选项(Excel插件,具体的下载安装方法百度即可,本文不作详细叙述) 选择[查找定位] 点击[自动填表] 点击[源数据条 ...

  3. mysql第三章关系模型_一个MySQL关系模型只有三个关系(二维表)组成。_学小易找答案...

    [判断题]DELETE语句功能是对表中所有记录或满足条件的记录进行批量删除. [填空题]The computer's entire ____ was on a single board. [单选题]下 ...

  4. java父子表_数据库二维表转父子关系,java,stream,list

    需求描述:把数据库中的省市二维表,查询到内存中后,转换为父子层级关系.通过jdk8中的stream方式实现. 数据关系: 320004    福建省    320507    南平市 430000   ...

  5. python二维表转一维表_Excel、Power BI及Python系列:使用Power BI转化一维表与二维表...

    上篇文章,老海分享了如何使用Excel完成一维表与二维表之间的转化 本篇老家继续分享使用Power BI来完成一维表与二维表的转化操作. 可能很多小伙伴,不太了解Power BI Power BI是什 ...

  6. Python语言学习之pandas:DataFrame二维表的简介、常用函数、常用案例之详细攻略

    Python语言学习之pandas:DataFrame二维表的简介.常用函数.常用案例之详细攻略 目录 DataFrame的简介 DataFrame的常用案例 1.写入和读取excel表格文件

  7. 两个listmap合并去重_Excel 二维表,相同行标题的多个值各占一行,如何合并为一行?...

    员工考勤表,本不复杂,如果用一维表输入原始数据,需要提交给领导看的时候再转换成容易识别的二维表,这是最推荐的做法. 如果要直接做二维表,也可以,但是就要做成标准的二维表,比如,每天的员工姓名都应该是唯 ...

  8. java 导出excel二维表,如何轻松将EXCEL二维统计表转为数据清单?

    Excel二维统计表转为数据清单的方法主要有多重数据透视法和Power Query逆透视法两种,其中多重数据透视法比较繁琐,而且数据源发生变化时,得重新操作,而使用Excel的新功能Power Que ...

  9. 一维转二维_Excel – 一维表和二维表相互转换,只要一个“=”搞定

    关于一维表和二维表的互相转化方法,我真的写过很多种了.且不说在各种案例中顺带提到的技巧,单独开篇讲的,就有以下这些: (头条号功能维护中,暂时无法添加超链接,有兴趣的读者请关注我,查看下历史记录吧) ...

  10. python二维表转一维表_【习题】一维表转二维表

    今天来看看梁总出的练习题哈 转换成下面的二维表效果图(要求:必须要跟效果表一致) 方法1: 小子大神Python: import xlrd import xlwt s = set() d = {} a ...

最新文章

  1. HDFS NameNode进程挂了并且数据也丢失了,如何进行恢复?
  2. elk 搜索 语法_ELK学习笔记7| Lucence 的搜索语法
  3. “快准顺”而不是“信达雅”
  4. 无盘服务器pnp,无盘系统PNP方法详细说明
  5. 1085. Perfect Sequence (25)-PAT甲级真题
  6. epoll编程实例客户端_网络编程:epoll
  7. 贪吃蛇C语言代码(window版本)
  8. python爬虫爬取网站视频_python3爬虫爬取视频(一)
  9. 十款代码表白特效,一个比一个浪漫
  10. 互联网大佬“打脸”简史:马云/雷军/罗永浩/刘强东...
  11. PTA-链表学习-----奇数值结点链表
  12. C语言:实验11-1-2 输出月份英文名.2021-08-06
  13. 【Android】应用拍摄视频功能
  14. 价值4500的国际版多语言点赞抖音分享点赞任务平台源码(十二种语言)
  15. 变形金刚图片----汽车人
  16. 18复旦计算机考研炸,18计算机考研双飞复旦经验贴
  17. MySQL之启动选项
  18. 产品开发中的经验教训
  19. 每日一句英语,看我能够坚持多久
  20. 更改 IE 代理服务器的设置

热门文章

  1. 玩转Redis-生产环境如何导入、导出及删除大量数据
  2. 【饭谈】为什么有的技术博文你看不懂?
  3. [《不敢说爱的年纪》小个子的小说集]2012年8月28日
  4. Mac上如何完美的转换epub至mobi供kindle观看
  5. python汇率转换
  6. 哈佛幸福课-幸福笔记
  7. 网络性能衡量的指标有哪些?
  8. TensorFlow 核心流程剖析 -- 2 神经网络模型的构建、分割和优化
  9. Mac本换ssd注意事项
  10. 搜狗浏览器安装第三方插件(crx和zip)