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

一、摘要

二叉树,作为一种数据结构,在实际开发中,有着非常广泛的应用,尤其是以平衡二叉树、红黑树为代表,在前几篇文章中,我们详细的介绍了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 等技术知识。需要的小伙伴可以点击如下链接获取,资源地址:技术资料笔记。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx目录枚举修复手册

nginx目录枚举修复手册 漏洞背景 修复方式: ssh zujian2 sudo vi /data/apps/nginx/conf/conf.d/default.conf server {

免费的GPT4终于要来了!OpenAI直播发布会详细解读!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

简单易懂的HashMap使用指南:从入门到精通

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

Wifi——Wifi断连问题分析

一、iperf测试wifi断连 1.信号强度差 -36表示非常强&#xff1b;但网络质量依然非常差。 可以分析出四个原因&#xff1a; 2.与throughput相关 为什么同一个网络的信号强度估算会有一定差异&#xff1f;&#xff01; 下图是上述log的一些信息&#xff1a;

DTC 2024回顾丨zData X 多元数据库一体机:开创多元数据库时代部署新范式

导语 在2024“数据技术嘉年华”上&#xff0c;云和恩墨数据库一体机产品总经理刘宇在“数据库极致特性”专题论坛发表了题为《打造多元数据库部署新范式&#xff0c;引领一体化资源池创新之路》的演讲。他深入分析了国产数据库面临的挑战&#xff0c;并详细介绍了云和恩墨如何利…

F5G-A万兆光网商用启航,挥动FTTR F50星光之翼,北京联通助力首都家庭飞向全光智慧时代...

2001年&#xff0c;王菲在发行的新歌《光之翼》中唱道&#xff1a;静静地按下电源开关/屏幕的色彩越来越亮/在虚拟的城市/找一个让心灵休息的地方/张开透明翅膀/朝着月亮飞翔/搜寻最美一个现世的天堂…… 将时间拨回千禧年&#xff0c;“看不见的城市”“伊托邦”“网络之城”&…

享元模式详解

享元模式 1 概述 定义&#xff1a; ​ 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销&#xff0c;从而提高系统资源的利用率。 2 结构 享元&#xff08;Flyweight &#xff09;模式中存…

问题解决记录 | kettle中出现中文乱码

spoon.bat的启动文件中进行修改 if "%PENTAHO_DI_JAVA_OPTIONS%""" set PENTAHO_DI_JAVA_OPTIONS"-Xms1024m" "-Xmx2048m" "-Dfile.encodingUTF-8"

2.数据类型与变量(java篇)

目录 数据类型与变量 数据类型 变量 整型变量 长整型变量 短整型变量 字节型变量 浮点型变量 双精度浮点型 单精度浮点型 字符型变量 布尔型变量&#xff08;boolean&#xff09; 类型转换 自动类型转换(隐式) 强制类型转换(显式) 类型提升 字符串类型 数据类…

独立游戏《星尘异变》UE5 C++程序开发日志3——实现一个存存组件

本篇日志中&#xff0c;我将会介绍如何实现一个有格子&#xff0c;每个格子有容量的物品库存&#xff0c;如下图&#xff1a; 一.库存容器 1.储存数据的容器 库存容器最重要的目的就是存储每一种类的物品拥有的数量&#xff0c;这里我用的是哈希表&#xff1a; std::unordere…

“圣诞树图案的打印~C语言”

圣诞树图案的打印~C语言 题目原文&#xff1a;[圣诞树](https://www.nowcoder.com/practice/9a03096ed8ab449e9b10b0466de29eb2?tpId107&rp1&ru/ta/beginner-programmers&qru/ta/beginner-programmers/question-ranking&difficulty&judgeStatus&tags&…

机器学习中的聚类

目录 认识聚类算法 聚类算法API的使用 聚类算法实现流程 聚类算法模型评估 认识聚类算法 聚类算法是一种无监督的机器学习算法。 它将一组数据分成若干个不同的群组&#xff0c;使得每个群组内部的数据点相似度高&#xff0c;而不同群组之间的数据点相似度低。常用的相似…

Linux0.11 中全局描述符表(GDT)

在Linux内核中&#xff0c;全局描述符表&#xff08;Global Descriptor Table&#xff0c;简称GDT&#xff09;是一个关键的数据结构&#xff0c;主要用于管理处理器的内存段和相关的权限与属性。它属于x86架构中的保护模式特性&#xff0c;允许操作系统对内存访问进行更精细的…

HFSS学习-day5-边界条件

边界条件 概述边界条件类型1、理想导体边界条件&#xff08;Perfect E&#xff09;2、理想磁边界条件&#xff08;Perfect H&#xff09;3、有限导体边界条件&#xff08;Finite Conductivity&#xff09;4、辐射边界条件&#xff08;Radiation&#xff09;5、对称边界条件&…

微信小程序开发题库

一. 单选题&#xff08;共12题&#xff0c;60分&#xff09; 1. (单选题) 有如下HTML代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Document</title> <style> ul,li{ margin:0; p…

企业为什么需要HTTPS

一.什么是HTTPS HTTPS &#xff08;全称&#xff1a;Hyper Text Transfer Protocol over SecureSocket Layer&#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL&a…

算法day05

第一题 1004. 最大连续1的个数 III 题目如下所示&#xff1a; 如上题所示&#xff1a; 题目本意是在一个数组中只有1和0&#xff0c;给定一个k值&#xff0c;将小于k个0翻转成1&#xff0c;然后返回最终得到最长的1的个数&#xff1b; 我们将这到题的意思转化为另外一种意思&…

C++ | Leetcode C++题解之第88题合并两个有序数组

题目&#xff1a; 题解&#xff1a; class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int p1 m - 1, p2 n - 1;int tail m n - 1;int cur;while (p1 > 0 || p2 > 0) {if (p1 -1) {cur nums2[p2-…

Gitee添加仓库成员

1.进入你的项目 2.点击管理 3.左侧有个仓库管理 4.要加哪个加哪个&#xff0c;有三个方式~ 可以直接添加之前仓库合作过的开发者

STM32有什么高速接口吗?

STM32 有一些高速接口&#xff0c;比如 USART、SPI、I2C 等&#xff0c;这些接口可以用于与外部设备进行高速数据传输。我这里有一套stm32入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习stm32&#xff0c;不妨点个关注&#xff0c;给个评论…