集合系列(二十五) -二叉树、平衡二叉树、红黑树性能总结

一、摘要

二叉树,作为一种数据结构,在实际开发中,有着非常广泛的应用,尤其是以平衡二叉树、红黑树为代表,在前几篇文章中,我们详细的介绍了BST、AVL、RBT的算法以及代码实践,下面简要概括描述一下这三种树,以及它们之间的优劣。

二、BST

二叉查找树(英文全称:Binary Search Tree,简称:BST)是计算机科学中最早投入实际使用的一种树形结构,特性定义比较粗放(一个节点,最多2个分支),因此在树形形态结构上,有着多样,例如下图:

很明显,不同的形状,所需查找的次数是不一样的!

BST 的操作过程:

  • 查找操作:任何一个数据的查找过程都需要从根结点出发,沿某一个路径朝叶子结点前进,因此查找中数据比较次数与树的形态密切相关。

当树中每个结点左、右子树高度大致相同时,树高为logN,则平均查找长度与logN成正比,查找的平均时间复杂度在O(logN)数量级上。

当树形结构为一个单子树时,此时树高n,则平均查找长度为(n+1)/2,查找的平均时间复杂度在O(N)数量级上。

  • 插入操作:先通过查找方法找到合适的位置,然后将新结点插入到树的叶子上,完全不需要改变树中原有结点的组织结构。

插入一个节点的时间与查找一个插入合适的位置的时间完全相同。

  • 删除代价:当删除一个节点A,首先需要定位到这个节点A,这个过程需要一个查找的时间。然后根据树的形态分析,如果被删除结点的左、右子树只有一个存在,则改变形态的代价仅为O(1)。如果被删除结点的左、右子树均存在,只需要将A节点的左孩子的最末端的右子树或者A节点的右孩子的最末端的左子树结点与A互换,最后删除该节点即可。

删除操作的时间复杂度最大不会超过O(logN)。

BST效率总结:

  • 查找最好时间复杂度O(logN),最坏时间复杂度O(N)。
  • 插入、删除操作算法简单,时间复杂度与查找差不多。

三、AVL

二叉查找树在最差情况下和顺序查找效率相当,这点是无法忍受的。

平衡二叉查找树的出现,主要是为了解决当二叉树查找树形态结构变成一个链条结构的时候,查找效率变低的问题,算法由Adel'son-Vel'skiiLandis两位大神发明,同时也俗称AVL树,特性如下:

  • 它的左子树和右子树都是平衡二叉树;
  • 且它的左子树和右子树的深度之差的绝对值(平衡因子 ) 不超过1;

简单的说,就是为了保证平衡,当前节点的左子树、右子树的高度差不超过1!

当树的左、右子树高度超过差超过1时,核心就是通过左旋转、右旋转实现树再次高度平衡。

AVL 的操作过程:

  • 查找操作:AVL是严格平衡的BST(平衡因子不超过1)。查找过程与BST一样,只是AVL不会出现最差情况的BST(单支树)。因此查找效率最好,最坏情况都是O(logN)数量级的。

  • 插入操作:AVL插入与BST思路一样,不同的是AVL必须要保证严格平衡(height<=1),每一次插入数据使得AVL中某些结点的平衡因子超过1就必须进行旋转操作。事实上,AVL的每一次插入结点操作最多只需要旋转1次(单旋转或双旋转)。因此,总体上插入操作的代价仍然在O(logN)级别上(插入结点需要首先查找插入的位置)。

  • 删除操作:AVL删除结点的算法与BST思路一样,但是删除之后必须检查从删除结点开始到根结点路径上的所有结点的平衡因子。因此删除的代价稍微要大一些。每一次删除操作最多需要O(logN)次旋转。因此,删除操作的时间复杂度为O(logN)+O(logN)=O(2logN)。

AVL 效率总结:

  • 查找的时间复杂度维持在O(logN),不会出现最差情况。
  • AVL树在执行每个插入操作时最多需要1次旋转(单旋转或双旋转),其时间复杂度在O(logN)左右。
  • AVL树在执行删除时代价稍大,执行每个删除操作的时间复杂度需要O(2logN)。

四、RBT

平衡二叉查找树通过严格平衡策略以牺牲建立查找结构的代价,换来了稳定的查找时间复杂度。但是相对来说,在删除方面,时间复杂度稍大。

于是就出现了平衡二叉B树,后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树。

红黑树(英文全称:red-black-tree,简称:RBT),特性如下:

  • 1.每个节点要么是黑色要么是红色;
  • 2.根节点是黑色;
  • 3.每个叶子节点是黑色;(注意:这里叶子节点,是指为空的叶子节点)
  • 4.如果一个节点是红色的,则它的子节点必须是黑色的;(说明父子节点之间不能出现两个连续的红节点)
  • 5.从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点;

特性5确保没有一条路径会比其他路径长出俩倍,因而,红黑树是相对的接近平衡的二叉树,但是相比平衡二叉树而言,尤其是删除的时间复杂度,有所降低。

RBT 的操作过程:

  • 查找操作:由于红黑树的性质(最长路径长度不超过最短路径长度的2倍),可以说明红黑树虽然不像AVL一样是严格平衡的,但平衡性能还是要比BST要好。其查找代价基本维持在O(logN)左右,但在最差情况下(最长路径是最短路径的2倍少1),比AVL要略逊色一点。

  • 插入操作:RBT插入结点时,需要旋转操作和变色操作。但由于只需要保证RBT基本平衡就可以了。因此插入结点最多只需要2次旋转,这一点和AVL的插入操作一样。虽然变色操作需要O(logN),但是变色操作十分简单,代价很小。

  • 删除代价:RBT的删除操作代价要比AVL要好的多,删除一个结点最多只需要3次旋转操作。

RBT 效率总结:

  • 查找效率最好情况下时间复杂度为O(logN),但在最坏情况下比AVL要差一些,但也远远好于BST。
  • 插入和删除操作改变树的平衡性的概率要远远小于AVL(RBT不是高度平衡的)。因此需要的旋转操作的可能性要小,而且一旦需要旋转,插入一个结点最多只需要旋转2次,删除最多只需要旋转3次(小于AVL的删除操作所需要的旋转次数)。虽然变色操作的时间复杂度在O(logN),但是实际上,这种操作由于简单所需要的代价很小。

五、总结

平衡二叉查找树、红黑树,在查询、插入、删除操作方面都是基于二叉查找树的算法思路,不同点是:插入、删除之后的调整过程,平衡二叉查找树主要是通过左旋转、右旋转实现树高度再次平衡,而红黑树因为引进了颜色,相比平衡二叉查找树,多了一个颜色转换操作。

三者整体比较,红黑树要优于平衡二叉查找树,远优于二叉查找树!

六、写到最后

最近无意间获得一份阿里大佬写的技术笔记,内容涵盖 Spring、Spring Boot/Cloud、Dubbo、JVM、集合、多线程、JPA、MyBatis、MySQL 等技术知识。需要的小伙伴可以点击如下链接获取,资源地址:技术资料笔记。

不会有人刷到这里还想白嫖吧?点赞对我真的非常重要!在线求赞。加个关注我会非常感激!

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

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

相关文章

deveco studio 打开官方案例,不显示运行按钮。

就拿官方的search举例好了 git 地址 https://gitee.com/harmonyos/samples/tree/master/ETSUI/Search 使用deveco studio打开Search项目&#xff0c;打开Tools->Device-Manager中的Local Emulator本地模拟器&#xff0c; 此时会发现&#xff0c;运行按钮是灰色的&#xff0…

水利行业工程设计资质如何去申请

申请水利行业工程设计资质通常需要按照以下步骤进行&#xff1a; 事前准备&#xff1a; 制定材料清单&#xff0c;罗列出所需准备的文件。下载相关的申请表和模板。准备企业资料和人员资料等附件材料。人员要求&#xff1a; 确保企业拥有符合水利行业工程设计资质标准要求的注…

源码 axios 的创建过程模拟实现

1、在实例对象上添加两个属性&#xff1a;default(默认配置) 与 interscptors // //构造函数function Axios(config) {//初始化this.defaults config;//为了创建 default 默认属性this.interceptors {request: {},response: {}}} 2、在原型对象上添加方法 //原型添加相关的…

从零学算法994

994. 腐烂的橘子 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b; 值 1 代表新鲜橘子&#xff1b; 值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直…

微信小程序中的数据可视化组件封装艺术【附代码】

微信小程序中的数据可视化组件封装艺术 一、数据可视化的魅力与重要性数据可视化简述为什么要在小程序中封装数据可视化组件 二、微信小程序数据可视化基础小程序中的绘图工具&#xff1a;Canvas 三、实战&#xff1a;封装一个简易折线图组件设计思路组件结构&#xff08;line-…

java mybatis配置

MyBatis是一种支持自定义SQL、存储过程和高级映射的持久层框架。下面是一个简单的Java MyBatis配置示例&#xff1a; 首先&#xff0c;需要添加MyBatis的依赖到项目的pom.xml文件中&#xff1a; <dependency><groupId>org.mybatis</groupId><artifactId…

Python3 笔记:顺序结构

三种程序执行结构&#xff1a;顺序结构、选择结构和循环结构。 这三种结构对应的是&#xff1a;顺序执行所有的语句、选择执行部分语句和循环执行部分语句。 顺序结构是程序最基本的结构。就是程序按照语句顺序&#xff0c;从上到下依次执行各条语句。 例如&#xff1a; nu…

【运维实践项目|003】:Nginx集群化运维升级项目

项目名称 项目简称或代号&#xff1a;SUN项目&#xff08;这个可以自己随便编一个&#xff0c;每个公司的每个项目简称或代号都是内部任意起名的&#xff0c;显得专业一点&#xff0c;一般是项目关键词的首拼&#xff0c;比如这个CSUN是&#xff1a;ScaleUp Nginx&#xff09;…

一道dp错题

dis(a,b)就是两点之间的距离公式 那么这道题该怎么解呢,.先看数据范围x,y<1e4,so,18个点两点之间距离最大18*1e4*sqrt(2)<2^18,所以如果跳过的点大于18个点,那么显然一个区间内最多不会跳跃超过17个点 现在我们想知道前i个点跳跃几次在哪跳跃能够达到最小花费,不妨设跳…

【OceanBase诊断调优】—— 转储错误(错误代码 4138/ORA-01555)

当读事务很长时&#xff0c;租户进行转储会报 4138/ORA-01555 错误。本文介绍该错误的处理方法。 适用版本 OceanBase 数据库 V2.X 及以后的版本 问题现象 当读事务很长&#xff0c;租户进行转储时会出现以下错误。 Oracle 租户&#xff1a; ORA-01555&#xff1a;snapsho…

Keil调用跟踪

调试时程序卡在一个位置&#xff0c;恰巧这个函数被很多地方调用&#xff0c;需要知道上一步在哪。 程序暂停后&#xff0c; 查看调用堆栈&#xff0c;点击Keil菜单栏中的“View”&#xff0c;然后选择“Call Stack”&#xff08;调用堆栈&#xff09;选项。这将显示当前的调用…

市场活动系统搭建

精细差异化运营在今天的企业越来越普遍&#xff0c;运营驱动占据了业务经营的主导地位。各种营销活动&#xff0c;帮助我们差异化运营、激发潜在客户、带动连带消费、增加销售额度、提升用户增长、实现品牌宣传。 天猫、京东上有各种各样的促销活动。如&#xff1a;满减、满返、…

算法day04

第一题 &#xff1a; 209. 长度最小的子数组 有上题可知&#xff0c;我们会采用双指针和单调性的思路来解决 我们本题采用左右双指针从数组的0位置同向前进&#xff0c;所以将此类模型称为滑块&#xff1b; 步骤思路如下&#xff1a; 步骤一&#xff1a; 定义所有双指针都指向…

Prompt提示词的技巧

Prompt提示词的技巧 要让GPT类模型产生最符合我们需求的输出&#xff0c;我们需要精心设计和调整输入的提示词&#xff08;Prompt&#xff09;。 1、明确性&#xff1a; 确保你的提示词清晰、具体。GPT类模型会根据你给出的信息来生成文本&#xff0c;因此&#xff0c;提供详…

【实践】使用vscode来debug go程序的尝鲜

配置 首先&#xff0c;当然得配置好vscode 的go环境&#xff0c; 装个go插件就基本满足了 配置 launch.json, 可以配置多个环境的程序启动参数&#xff08;很友好&#xff09; {"version": "0.2.0","configurations": [{"name": &…

ArrayList与LinkedList的区别

一、背景与现状 在Java编程中&#xff0c;ArrayList和LinkedList都是实现List接口的重要类&#xff0c;用于存储和操作动态大小的元素集合。两者在Java集合框架中占据了核心地位&#xff0c;并被广泛应用于各种软件项目中。然而&#xff0c;尽管它们都提供了类似的功能&#x…

海外客户开发渠道有哪些

海外客户开发是一个多元化的过程&#xff0c;涉及线上与线下多个渠道。以下是一些有效的海外客户开发渠道&#xff1a; 平台电商&#xff1a; 利用国际B2B电商平台&#xff0c;如阿里巴巴国际站、 Globalsources、Made-in-China等&#xff0c;这些平台拥有庞大的国际买家流量&a…

STM32学习和实践笔记(27):USART串口通信实验程序

本实验所要实现的功能是&#xff1a;STM32F1通过USART1实现与PC机对话&#xff0c;STM32F1的USART1收到PC机发来的数据后原封不动的返回给PC机显示。同时使用D1指示灯不断闪烁提示系统正常运行。程序框架如下&#xff1a; &#xff08;1&#xff09;初始化USART1&#xff0c;并…

linux 开发常用命令

一、查看 相关服务 1.查看 数据库 相关服务 这里以mysql 和 redis 为例 &#xff08;1&#xff09;使用 ps 命令 执行命令会列出&#xff0c;“mysql”、“redis”名称的进程 ps aux | grep redis 示例&#xff1a; rootspray:~# ps aux | grep mysql mysql 1609816 0.…

Flutter 中的 FilterChip 小部件:全面指南

Flutter 中的 FilterChip 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;FilterChip 是一种特殊类型的 Chip&#xff0c;用于呈现过滤选项。用户可以通过点击 FilterChip 来应用相应的过滤条件&#xff0c;这在需要对列表或集合进行筛选的场景中非常有用&#xff0c;如…