数据结构-树的理解

news2024/11/29 12:31:33

目录

一:要解决的问题,出发点

1.演进

树的定义:

 树的深度(高度)

平衡二叉树(AVL树)

红黑树:

B树:


深夜有感,灵感乍现,忽然感觉对这个数据结构终于有了一个自己的理解,才感叹这些计算机先驱们的智慧,在此,记录个人对数据结构--树,的理解。按照事情发展的来龙去脉,从需求出发去一步一步演进理解,而不是像课本那样死板地给出定义和规则让人死记硬背,才能更好契合地理解。

这是计算机存储的技术,准确地说,应该是信息存储的技术,总的来说,目的都在于:怎么使用最少的数据量,存储最多的信息。 存储的大量信息,怎么以最少的访问次数,最快地找到想要的数据  前面的问题,比如编码,已经有了霍夫曼编码,其基本的思想是,对于出现次数最多的相同元素,使用最短的编码信息去表示。 这样总的编码用到的信息是最少的。

一:要解决的问题,出发点

后面的问题,对于一堆数据,怎么存储(这里指的是在内存中存储,运行时程序动态使用的数据,而不是存盘,存盘的话那就是数据库了),才能在查找访问的时候,最快呢?

最快访问,从数据的角度来看就是遍历的数据量最少。 我们围绕着这个问题,来逐一解析,红黑树这种东西是怎么发展出来的。

1.演进

首先,一堆数据,必须要有一个访问的入口,从实现的角度出发,最好是设计简单(后续也会围绕简单化这个思想考虑),最好的方式就是使用唯一的一个入口,考虑最简单的设计,就是把这些数据用一条线串联起来,这就是最简单的链式结构,链表。

但是这样的效率是不高的,他只有一条路径,要找到最后一个数据,就需要遍历访问前面所有的数据。 这样的时间复杂度 O(n).
如果从入口出发,设计多条路径呢:

一堆散数据:

 如果从中间的一个点出发,把所有数据连起来:

 
但是这里我们发现有个问题,如果一个数据节点有两个入线(被箭头指向)的话,像上图中的1,2,3 编号节点,有两条入线,就难免回发生像节点3这样,橙色的入线其实是在走逆向,从A节点到3号节点这个路径相当于往靠近根节点的方向在走回头路,我们希望从中间往外走路径越短越好,当然不希望走回头路,那样肯定是走了更多的距离。 

树的定义:

为了避免这样的问题,可以限制节点,只有一条入线。按照书本的定义就是有唯一前驱,而后继不唯一。(这其实就是图和树的区别,树是一对多(一个入线多个出),图是多对多(不限),树关注解决的是从根节点访问到某一个节点路径的长短,图关注解决的任意两个节点的连通性)

 拿掉所有类似上面的橙色线条,让所有节点只有唯一的入线(唯一前驱)
唯一前驱,这样倒推回去的话,每一个节点从根节点访问过来的路基都是唯一的只有一条,问题就变得更简化了,我们不需要考虑一个节点到底有几种访问路径,只有一条。所以只要知道这个节点的深度(所在的层次),就是这个节点访问时的路径长度。

 为了好看,把个别分支都转动到底部来,形成一种层次结构,开起来就是一颗树了:

 一颗树:

 还不够,进一步简化,从入口节点出来的有多个分支,其实只需要两个分支是最简单地,就好像计算机是二进制的,只需要两种状态经过多重的组合就可以表示更多的信息,这也是简化基础的设计。

所以再简化,因为基本是从上到下的层次,干脆把箭头也省略成简单的直线,从上到下就是指向,就是我们的 二叉树。

 树的深度(高度)

一颗二叉树,我们从入口(根节点)出发,访问到最远的节点(叶子节点),走过的节点的个数--路径长度 可以称为这个 时间复杂度,我们要求它越小越好,这个数据比较重要,我们用一个词来表述,深度,树的深度(或者高度),就是距离根节点最远的那个节点的路径长度,(描述性能,所以记录导致性能最差的这个边界值,用最长的那个作为这个树的深度

回到之前的问题,这些数据怎么组织存放,让查找数据的路径尽可能小。

可以换一个角度想,固定长度的一个路径(深度固定),怎么让存储的数据量最多。

现在以二叉树的方式存储,怎们在固定路径长度的情况下存储最多的数据,当然是尽可能把它填满,这就是满二叉树。  一颗深度为k的二叉树,最多(也就是填满的情况下), 可以存数据:等比数列求和,高中数学,a1(1-q^n)/(1-q)  => 也就是2^k-1个数据。

反过来,要在n个数构成的满二叉树中查找数据,时间复杂度(也就是访问的路径长度,最短访问长度0,最长访问长度及树的深度) log 以2为底n的对数,一般直接写着时间复杂度为log(n)  没有说明底数,其实就是二叉树就是底为2,三叉树底为3。平时用的多的,基本是二叉树。 这就是二叉树查找访问的时间复杂度的由来。

平衡二叉树(AVL树)

AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis

当然,数据个数不可能都是2^n-1个,填不满的,称为“  完全二叉树”。 而实际上的问题是,数据往往不能保证是一层一层地按照顺序往下填的,如下图:

这样访问 2号节点的路径长度为6,树的深度成了6.   换个角度看,就是深度为6的树,其实最大可以存储 2^6-1个节点的,而现在,只存储了15个数据,浪费了很多空间。 要避免这中存储情况的发生,应该尽量让二叉树是按照从上到下,填满上层再填下一层,而不希望出现一层没填满,就在下一层填,那样的话,整颗树看起来就像一边数据多,一边数据少,”不平衡“。 照这个逻辑,我们引入平衡二叉树:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。   反过来讲,如果子树的高度差操作了1,说明高度大的那颗子树的最后一层节点,是应该被放到上一层来填充,左右高度是不平衡的

最优二叉搜索树(也称霍夫曼树)。。。。。

红黑树:

所以数据尽量按照平衡二叉树来存储,不过呢,平衡二叉树其实是一个理想值,这属于理论,而实际应用起来,还需要考虑其他因素,(就像三体里面汪淼的应用物理和丁仪的理论物理)。  实际使用过程中,对于一个平衡二叉树,进行插入和删除操作,势必破坏树的平衡性质,要维护平衡,就需要再做额外的修改,这就是 左旋 右旋等等这些操作,通过修改部分节点的出入线路径来达到平衡。而这些操作带来的消耗也不少,结果是严格的平衡二叉树,查找性能是最优了,但是插入删除后维持平衡性质却带来了额外的操作开销导致总的操作开销还是上去了。 那么有没有办法来平衡查找和插入删除总的操作开销呢?

红黑树就是为了这个目的而来,它实际上属于半平衡的特性,并不是完全平衡,但是降低了插入删除操作带来的额外消耗,在总的性能中实现了一个折中,虽然它的查找操作不是最理想的平衡二叉树的性能,但是插入和删除操作的消耗降低了不少,综合性能上更加“平衡”。

关于平衡二叉树的插入删除后维护平衡到底带来了多少的额外开销?而红黑树又是如何降低这个开销的?有待进一步探讨.......??????????????????
红黑树性质:

性质1:每个节点要么是黑色,要么是红色。

性质2:根节点是黑色。

性质3:每个叶子节点(NIL)是黑色。

性质4:每个红色节点的两个子节点一定都是黑色。 不能有两个红色节点相连。

性质5:任意一节点到每个叶子节点的路径都包含数量相同的黑结点。

B树:

同样,考虑到实际使用过程中,数据量过大,并不能一次都读到内存中去,有可能在程序访问数据的时候需要和磁盘打交道,而磁盘的读写操作慢,应该尽量减少操作,B树就是专门为了应对这种情况而设计的特殊平衡树。 一般用于数据库。就是把关键信息存放在节点,这个节点放到内存中,它可以由多个子节点,所有这些子节点在磁盘中。 通常以一整页数的据作为这个节点的所有字节点,方便一次性以页为单位读写。 
算法导论18章B树拍图: 

这就是二叉树,平衡二叉树(AVL树),红黑树,发展进化的过程,个人理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity(二)--通过简单例子了解UGUI几个常用对象操作(Text,Image,Button)

目录 文本框等UI对象的添加Canvas 画布给Canvas添加脚本,绑定要操作的对象文本框Text的使用图像Image的使用更换图片Type:显示图片相关按钮Button的使用过渡导航事件绑定文本框等UI对象的添加 Canvas 画布 当创建一个UI元素的时候,如果没有Canvas 画布,就会自动创建一个画布…

学习资料|SSH隧道端口转发功能详解

概念ssh隧道大致可以分为3种,分别为本地端口转发,远程端口转发,动态端口转发,本文将让你彻底搞懂这3个转发的命令表达形式,让你能够灵活运用解决生活中的各种特殊场景。如果你正在使用mobaxterm、xshell、secureCRT、p…

怎样深度学习?主题碾压式学习法

怎样最深度的学习?【主题碾压式!】 对一个学习主题,大体量投入学习资源 进行对比和实践 会取得突破 限定在社会科学和社会应用范围 趣讲大白话:大力出奇迹 【趣讲信息科技:84期,下期预告:很少有…

C++条件变量唤醒问题 notify_one() 唤醒不及时问题

条件变量唤醒问题 & notify_one() 唤醒不及时问题 因为我对于 C中条件变量的等待唤醒部分、notify_all & notify_one 的区别方面有些疑点,因此就有了以下的同 chatgpt 的沟通,希望同样能够帮助到大家 感叹于 chatgpt的强大 问题? 我比…

(三十二)大白话MySQL一起来看看INSRET语句的undo log回滚日志长什么样?

昨天我们讲解了undo log回滚日志的作用,说白了,就是你执行事务的时候,里面很多INSERT、UPDATE和DELETE语句都在更新缓存页里的数据,但是万一事务回滚,你必须有每条SQL语句对应的undo log回滚日志,根据回滚日…

Docker 名词介绍

Docker核心名词镜像文件镜像:简单理解为就是一个安装包,里面包含容器所需要运行的的基础文件和配置信息,比如:redis镜像、mysql镜像等。镜像的来源方式:1. 自己做镜像 比如(自己开发微服务项目)2. 拉取别人…

python学习笔记——数据类型总结

1.基本数据类型  数据类型对应的内置函数:将其他类型,转换成自己的类型。 int()float()bool()str()list()tuple()set()dict() 2.数据类型对比  3.列表 w [a,b,c] #查 print(w[0]) print(w[0:3:2]) #增 w.appe…

css 属性和属性值的定义

文章目录css文本属性作业列表属性背景属性作业css文本属性 序号属性描述说明1font-size字体大小浏览器默认16px;2font-family字体当字体是中文字体,英文字体,中间有空格时候,要加双引号,多字体之间用逗号隔开 默认微软…

绿通科技在创业板开启申购:超额募资约19亿元,收入依赖贴牌

2月23日,广东绿通新能源电动车科技股份有限公司(下称“绿通科技”,SZ:301322)开启申购。据贝多财经了解,绿通科技本次上市的发行价为131.11元/股,发行数量为1749万股,市盈率73.75倍。 按发行价…

为什么数字孪生技术对工业物联网基础设施至关重要

随着工业物联网基础设施的不断建设和发展,数字孪生技术的重要性也变得越来越明显。由于数字孪生模型是工厂或其资产的虚拟版本,其高度精确和详细的特点使决策者获得了更高的可见性。下面让我们了解一下数字孪生技术给工业物联网基础设施带来的有效帮助。…

【Axure教程】自动生成页码的中继器表格

当表格数据较多时,我们经常会分页显示,这时我们就需要用到页码的元件了。所以作者今天就教大家如何在Axure中制作一个能自动根据中继器表格的数据以及分页情况,自动生成对应页码的原型模板。一、效果展示1、页码能根据表格数据和每页显示条数…

Apache Commons FileUpload Apache Tomcat拒绝服务漏洞解决方案

近日,安全狗应急响应中心关注到Apache官方发布安全公告,披露在Apache Commons FileUpload<1.5版本中存在一处拒绝服务漏洞(CVE-2023-24998)。Commons FileUpload是Apache组织提供的免费的上传组件。由于Apache Commons…

pyaudio声卡信息中hostApi是什么意思?

hostApi是声卡驱动协议,声卡驱动模式,有如下很多类。下面的类型是网上找的PortAudio的类,不不确定是不是python的。typedef enum PaHostApiTypeId{paInDevelopment0, /* use while developing support for a new host API */paDirectSound1,p…

EMC诊断技术

第一课 探讨EMC诊断技术-滤波篇EMC法规:CISPR16-1、GB/T 6113.1 GB/T 7343dBuV3dB是1.41倍6dB是2倍20dB是10倍差模噪声在电源/信号到地上走,差模噪声是电源/地/信号/到EGNDEMI滤波器的性能指标:滤波器插入损坏(共模插损、差模插损)

儿童全脑九大能力,3-6岁的家长都应该知道

什么是全脑? 人的大脑分左右两个半球,形态虽然相似,功能却各有不同。其中,左脑负责文字、数学、计算、分析、逻辑、顺序、事实和记忆,掌管右侧肢体的感觉和运动;右脑则负责颜色、音乐、想象、韵律、感觉、…

【原创】java+swing+mysql物业管理系统设计与实现

之前的文章里也讲过物业管理系统的开发,不过使用的是javaweb技术,bs架构,网页的形式。今天我们主要介绍使用javaswing技术同样去开发一套物业管理系统。以方便管理员进行物业信息的管理。 功能分析: 物业管理系统主要是为了方便…

买卖股票的最佳时机II-力扣122-java贪心策略

一、题目描述给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能获得的 最大 利润 。…

SAP PI PO JDBC接口培训视频

SAP PI PO JDBC接口培训视频XML Document Format for the Message Protocol XML SQL Format You can modify one or more database tables by means of a message. Depending on the content of the message, you can either insert (INSERT), update (UPDATE), or delete (DEL…

Java ”框架 = 注解 + 反射 + 设计模式“ 之 反射详解

Java ”框架 注解 反射 设计模式“ 之 反射详解 每博一文案 无论幸福还是苦难,无论光荣还是屈辱,你都要自己遭遇与承受。—————— 《平凡的世界》 孙少平多少美好的东西消失和毁灭了,世界还像什么事也没有发生,是的&#…

Head First设计模式---5.单例模式

2.2单例模式 单例模式运用的可能比其他几种简单,通俗点理解就是,我这个对象只能存在一个。 问题 保证一个类只有一个实例。 为什么会有人想要控制一个类所拥有的实例数量? 最常见的原因是控制某些共享资源 (例如数据库或文件&am…