概述:

     本文介绍关于一种多叉树的画法 ,并优化了其算法的时间复杂度

要求:

1.    同一层的节点的纵坐标一样,不同层的节点的纵坐标的差成比例

2.    同一层相邻的节点的横坐标距离要大于某个值

3.    父亲的x轴位置是最左儿子和最右儿子的中间

4.    整幅图的宽度要尽量小

图1-多叉树

做法:

1.    对于每个节点来说,都要确定其横坐标和纵坐标,然后对应画圆画方和画线

2.    求纵坐标相对简单,每一层的纵坐标呈等差数列即可,亦即是只需要确定每个节点的深度,这里使用了广度搜索,复杂度是O(n)

3.    求横坐标的过程相对复杂,考虑每个点都需要求出一个偏移量,偏移量的定义是这个节点相对于父亲的x坐标.我们采用后序遍历的方式求解,并且每个节点的偏移量是由父亲求出而不是自己.

4.    对每个节点的操作是,首先访问所有子树,然后求出所有儿子的偏移量.我们先让第一个儿子的偏移量为0,然后我们只需要计算出每对相邻的儿子的距离

5.    一对相邻儿子(Ai,Ai+1) 的距离,是由子孙决定的.具体来说,我们要求出Ai+1 左边的所有兄弟的所有子孙中在每一层最右边的子孙相对于当前节点的偏移量,和Ai+1 的所有子孙中在每一层最左边的子孙相对于Ai+1 的偏移量.并且同一层的最右减去最左,得到一个距离.这些距离的最大值,即为(Ai,Ai+1) 的距离

6.    求完所有距离之后,我们也就是知道了所有儿子的偏移量,由于当前节点是要处于所有儿子的中心,这时候只要所有儿子的偏移量减去总距离的一半即可

7.    显然要求的距离有O(n) 个,而每次求距离最坏情况下要遍历整棵树,因此画图操作的复杂度是O(n2)

图2-算法图解

优化:

1.    事实上,我们可以把算法的复杂度优化成O(n) ,关键在于求距离这里.

2.    之前说过,求距离实际上是求出每层的最右子孙和最左子孙,然后将其总偏移量相减得到距离,再取最大的距离.我们不妨把每层的最右子孙和最左子孙称为一对关键子孙.显然,只有是同一层并且相邻的节点对才可能是关键子孙.

3.    那么,我们可以知道,我们要求的距离,实际上只需要询问所有关键子孙产生的距离即可.同时,我们发现,一对关键子孙只可能影响某一对节点的距离,我们称这对节点是目标兄弟.并且,容易发现目标兄弟的父亲就是关键子孙的最近公共祖先.

 

图3-概念图解

4.    我们可以用广度搜索,把所有节点按层次排成一个邻接表.然后每对相邻的节点可以作为关键子孙,求出它的最近公共祖先,来确定它们的目标兄弟.这里要求出O(n) 对节点的最近公共祖先,我们可以采用离线查询的方法,用tarjan 算法+并查集+路径压缩维护,在O(n) 的时间求出所有的最近公共祖先,并把这些关键子孙储存到目标兄弟里.

5.    对于每对要求距离的节点,我们只需求出关键子孙的总偏移量作为距离,再取最大距离即可得到这对节点的距离.但是,求出关键子孙的总偏移量意味着我们要从关键子孙开始往上走,走到当前目标兄弟这层为止.当这棵树的高度比较大的时候,这个步骤的时间复杂度会退化.

6.    我们可以用带权值的并查集去处理这个问题,点的权值就是当前的总偏移量.就像最近公共祖先维护并查集一样,只要加上路径压缩,那么获取某个节点的总偏移量的时间就能降低到平均摊分O(1)

7. 关键子孙的总个数是O(n)个,而求关键子孙的总偏移量是O(1),一共要求O(n)个距离,因此总的复杂度是O(n).这是一个非常优秀的线性算法

关于树状图画法的分析相关推荐

  1. 画出计算机系统构成的树状图,如何绘制树状层次结构的树状思维导图?

    树状图,(又为树形图)因其外观像倒过来的树的样子,所以命名树状图.树形图是数据树的图形表示形式,以父子层次结构来组织对象.是枚举法的一种表达方式.初中学生学习概率时通常会要画的树状图.学会分析一件事物 ...

  2. 利用python决策树分析iris数据及树状图绘制

    利用python决策树分析iris数据及树状图绘制 数据说明 数据划分 模型训练及评估 模型训练代码 模型大致评估 树状图绘制 Graphviz安装配置及入门 代码汇总 基地部门公众号 数据说明 数据 ...

  3. echart关系树状图_干货 | 25个常用Matplotlib图的Python代码

    50个Matplotlib图的汇编,在数据分析和可视化中最有用.此列表允许您使用Python的Matplotlib和Seaborn库选择要显示的可视化对象. 1.关联 散点图 带边界的气泡图 带线性回 ...

  4. 聚类树状图_聚集聚类和树状图-解释

    聚类树状图 Agglomerative Clustering is a type of hierarchical clustering algorithm. It is an unsupervised ...

  5. json树状图可视化_12个流行的Python数据可视化库总结

    总结了10个不同领域的 Python 数据可视化库,有常用的,也有比较小众的. 1. matplotlib matplotlib是Python数据可视化库的OG.尽管它已有十多年的历史,但仍然是Pyt ...

  6. 如何在 LaTeX 中画一个树状图(使用tikz和tikz-qtree包中的宏绘制树、森林、二叉树)

    简单介绍 在计算机相关的文章中,树状图是最常见的几种图之一.树状图经常被用来用来演示结构.层次.算法等内容.而二叉树是最基础的树状图之一,掌握二叉树的画法就可以用图像展示一些算法或者数据结构了. 在 ...

  7. 聚类分析树状图的初探

    参考官方文档:https://docs.scipy.org/doc/scipy/reference/index.html 此次使用聚类分析是因为文章需要,然后参考官方文档简单制作满足分析要求的树状图. ...

  8. Plotly.js使用详细介绍(折线图、饼状图、点图、水平条形图、桑基图、树状图、等值线图)

    目录 0 写在前面 1 HTML代码 2 折线图 2.1 基本折线图 2.2 复杂折线图 2.2.1 轨迹 2.2.2 布局 3 饼状图 3.1 基本饼状图 3.2 饼图子图 3.3 甜甜圈图 4 点 ...

  9. python中plotly绘制树地图_聚类分析python画树状图--Plotly(dendrogram)用法解析 - 人人都是架构师...

    1.前言 聚类分析是机器学习和数据分析中非常常见的分类方法, 当我们用到层次聚类(系统聚类)时,最常用的分析方法就是绘制树状图, 比较常见的统计软件像SPSS.SAS.R等都可以直接绘制树状图,比较简 ...

最新文章

  1. Linux环境程序栈溢出原理
  2. 记一次知乎维权过程——严肃批评某非法引流商
  3. 大数据揭秘:北京每天这些道路“最红”
  4. Transformer变体为何无法应用于多种任务?谷歌:这些架构更改不能有效迁移
  5. 二叉树的前序、中序、后序遍历与创建
  6. java 静态代码块_关于Java你不知道的那些事之代码块
  7. 亚太地区数学建模优秀论文_数学建模美赛强势来袭!
  8. BootStrap笔记-文字排版
  9. 【C语言笔记初级篇】第四章:数组入门
  10. android Listview2 笔记
  11. 【java】强悍!Java 9 中的9个新特性
  12. 【Linux学习笔记】Linux-CentOS下安装Redis
  13. Mac os 10.5.8, 驱动声卡成功
  14. 基础篇:源码 Linux+Apache+PHP+MySQL环境配置方法-08CMS网站
  15. java整理快捷鍵_常用Eclipse快捷键整理,提高效率
  16. oracle自动建立分区interval,使用Oracle 11g创建Interval分区表(转)
  17. 如何使用 Firebase 建立短網址?
  18. python爬取58同城租房信息
  19. python数据可视化创建_【Python数据可视化】创建3D可视化图表
  20. python一行输出多个数据_python 如何将一系列数字十个一行输出

热门文章

  1. 降低网络运维管理成本技巧分析
  2. shell习题-27
  3. 腾讯前端面试经验(一)
  4. 寒假代练——英雄联盟
  5. Oracle11g下载安装教程
  6. Debian 8.0桌面系统root用户登录和root用户自动登录
  7. Android 上的SSH软件 connectbot
  8. php缓存怎么清理,php怎么清除opcache缓存
  9. thinkphp 5.1 swoole扩展websocket使用教程
  10. 如何免费体验腾讯云虚拟主机(云服务器)