算法之美:二叉树演进之AVL平衡二叉树底层原理

        在之前的文章中,我们初步了解了二叉查找树(又称二叉排序树),这使我们意识到使用特定策略的查询可以显著提高查找效率。本文将进一步探讨二叉树的演进。由于树相关算法较多且相对复杂,因为我后续将拆解讲述,细嚼慢咽。

二叉排序树

二叉排序树的特点如下:

        1)在树中的任意节点,其左子树中的每个节点的值都小于该节点的值,而右子树的值都大于该节点的值。

        2)二叉查找树的查找、插入和删除操作的平均时间复杂度都是O(log n),其中n为树中的节点数,因此它是一种非常高效的查找数据结构。

        3)由于其特殊的结构,二叉排序树能够支持快速的查找、插入和删除操作。

线性查找和二叉查找树的效率对比:Binary and Linear Search Visualization

缺点:

        在数据分布不佳的情况下,二叉查找树可能会出现左右子树极度不平衡的情况,导致树的退化成为链表,这时查找操作的时间复杂度就会变为O(n),相当于执行了全表扫描。而在最理想的情况下,当二叉查找树是一棵完全二叉树或者满二叉树时,查找、插入和删除操作的时间复杂度与树的高度成正比,即O(高度)。完全二叉树的高度小于等于log2n(其中n为节点个数),因此在最理想情况下,二叉查找树的时间复杂度为O(logn)。

        二叉查找树左右子树极度不平衡,退化成为链表时候,相当于全表扫描,时间复杂度就变为了O(n),插入速度没影响,但是查询速度变慢,比单链表都慢,每次都要判断左右子树是否为空,需要保证二叉查找树一直保持平衡,就需要用到平衡二叉树。

平衡二叉树

        AVL树,全称Adelson-Velskii和Landis树,是一种被称为平衡二叉查找树的特殊数据结构。在AVL树中,每个节点的左右子树高度差不超过1,这种平衡性保证了树的结构是稳定的。当插入或删除数据导致AVL树失去平衡时,会通过调整节点来重新平衡树结构。

由于平衡二叉树的插入和删除操作时间复杂度均为O(logn),因此它具有高效的查找性能,远远快于非平衡的二叉查找树。

其实现平衡二叉树的方式,有红黑树、Treap和伸展树等。

核心思想

在插入或删除节点时,如果发现子树不平衡,则对子树进行旋转操作,使其重新达到平衡。

旋转操作有三种,根据哪边的高度较低就进行相应的旋转,以提升树的高度:

- 左旋LL旋转
- 右旋RR旋转
- 左右LR双旋和右左RL双旋

 动画效果演示:AVL Tree Visualzation

以上图为例,通过平衡二叉树实现时,其分布如下:

        二叉搜索树的时间复杂度介于O(log2N)到O(n)之间,如果退化成单链表,时间复杂度就是顺序查找,为O(n),以上情况如果是平衡二叉树,查找效率会提高到O(log2N)。

缺点:

        1)平衡二叉树的高度等于每次查询数据时磁盘IO操作的次数。假设磁盘每次寻道时间为10毫秒,在处理大量数据时,查询性能会变差。

        对于100万条数据,log2(N)约为20次磁盘IO操作,总时间为20*10=0.2秒。这里,log2(N)表示需要将2提升多少次方才能得到N。例如,log2(8)等于3,所以2的20次方等于1048576,因此需要进行20次磁盘IO操作。

        2)平衡二叉树不支持高效的范围查询。在进行范围查询时,需要多次从根节点遍历,导致查询效率较低。

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

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

相关文章

SUSE 15 SP5 一键安装 Oracle 19C(19.22)单机版

前言 Oracle 一键安装脚本,演示 SUSE 15 SP5 一键安装 Oracle 19C(19.22)单机版过程(全程无需人工干预):(脚本包括 ORALCE PSU/OJVM 等补丁自动安装) ⭐️ 脚本下载地址&#xff1…

集成ES分组查询统计求平均值

前言 之前其实写过ES查询数据,进行分组聚合统计: 复杂聚合分组统计实现 一、目标场景 机房机柜的物联网设备上传环境数据,会存储到ES存到ES的温湿度数据需要查询,进行分组后,再聚合统计求平均值 二、使用步骤 1.引入…

【Linux系统】进程概念创建进程进程标示符

什么是进程? 操作系统中, 进程可以同时存在非常多的。根据我们之前谈的操作系统具有“管理”的特性, 那么就有,既然要管理,就要 --- 先描述,在组织!!! 由冯诺依曼体系结…

AIGC,ChatGPT,Prompt 万能提示词

AIGC ChatGPT 职场案例 AI 绘画 与 短视频制作 PowerBI 商业智能 68集 Mysql 8.0 54集 Oracle 21C 142集 Office 2021实战应用 Python 数据分析实战, ETL Informatica 数据仓库案例实战 51集 Excel 2021实操 100集, Excel 2021函数大全 80集 Excel 2021…

进入消息传递的魔法之门:ActiveMQ原理与使用详解

嗨,亲爱的童鞋们!欢迎来到这个充满魔法的世界,今天我们将一同揭开消息中间件ActiveMQ的神秘面纱。如果你是一个对编程稍有兴趣,但又对消息中间件一知半解的小白,不要害怕,我将用最简单、最友好的语言为你呈…

Linux——命名管道

Linux——命名管道 命名管道命名管道和匿名管道的区别 创建命名管道利用命名管道实现简单通信 我们之前学习了匿名管道,这种管道有一个缺点就是只有两个有血缘关系的进程才能够使用匿名管道,这个非常不方便。所以我们又在匿名管道的基础之上引入了命名管…

Flask python :logging日志功能使用

logging日志的使用 一、了解flask日志1.1、Loggers记录器1.2、Handlers 处理器1.3、Formatters 格式化器 二、使用日志2.1、官网上的一个简单的示例2.2、基本配置2.3、具体使用示例2.4、运行 三、写在最后 一、了解flask日志 日志是一种非常重要的工具,可以帮助开发…

系列学习前端之第 7 章:一文掌握 AJAX

1、AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML(中文名:阿贾克斯),就是异步的 JS 和 XML。AJAX 不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。AJAX 可以在浏览器中向服务器发送异步请求…

flutter 弹窗之系列一

自定义不受Navigator影响的弹窗 class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;overrideState<MyHomePage> createState() > _MyHomePageState(); }class _MyHomePageState extends State<MyH…

rabbitmq-c 程序实现客户端服务端

安装mq https://blog.csdn.net/zl_momomo/article/details/82986368 需要安裝rabbitmq-server 开启rabbitmq服务 systemctl start rabbitmq-server systemctl enable rabbitmq-server. 客户端 amqp_sendstring.c include <stdint.h> #include <stdio.h> #incl…

访问二维数组本质

先从一维数组讲起 int main() {int arr[5] { 1,2,3,4,5 };for (int i 0; i < 5; i) {printf("%d",arr[i]); //对数组进行访问}return 0; } 其实 arr [ i ] * (arr i) 这两个是完全相等的&#xff0c;在c语言指针&#xff08;1&#xff09;8.数组名与 …

STM32F103 CubeMX 使用USB生成键盘设备

STM32F103 CubeMX 使用USB生成键盘设备 基础信息HID8个数组各自的功能 生成代码代码编写添加申明信息main 函数编写HID 修改1. 修改报文描述符2 修改 "usbd_hid.h" 中的申明文件 基础信息 软件版本&#xff1a; stm32cubmx&#xff1a;6.2 keil 5 硬件&#xff1a;…

Redis中的事件(三)

时间事件 事件的调度与执行 因为服务器中同时存在文件事件和时间事件两种事件类型&#xff0c;所以服务器必须对这两种事件进行调度&#xff0c;决定何时应该处理文件事件&#xff0c;何时有应该处理时间事件&#xff0c;以及花多少事件来处理它们等等。事件的调度和执行由ae…

uniApp中使用小程序XR-Frame创建3D场景(2)加载模型

上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用&#xff0c;只完成了简单的环境搭建&#xff0c;这篇文章讲解如何加载3D模型。 1 加入模型加载标签 在XR-Frame框架中&#xff0c;加载资源都是在wxml文件的标签中实现的。下面是wxml中完整的代码 index.wxml &l…

(二)Eureka服务搭建,服务注册,服务发现

1.Eureka注册中心 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 存在几个问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址和端口&#xff1f;有多个user-service实例地址&#xff0c;…

手机和键盘的数字键盘排序为什么是不同的?

不知道你有没有注意有一个问题。我们的手机输入法中的数字键盘&#xff0c;电脑上通用的数字键盘&#xff0c;计算器上的数字键盘等排序是不同的&#xff0c;从观察者角度看&#xff0c;0-9的数字排列有从上到下的排列&#xff0c;还有从下到上的排列。为什么会出现不同的排列方…

HWOD:句子逆序

一、题目 描述 将一个英文语句以单词为单位逆序排放。例如I am a boy逆序排放后为boy a am I。所有单词之间用一个空格隔开。语句中除了英文字母外&#xff0c;不再包含其他字符。 数据范围 输入的字符串长度满足 1<n<1000 输入 输入一个英文语句&#xff0c;每个…

【电力监控保护】AM5SE-IS防孤岛保护装置/35kV、10kV、380V分布式光伏并网供电/什么是孤岛效应/孤岛效应的危害

什么是孤岛效应&#xff01;&#xff01;&#xff01; 安科瑞薛瑶瑶18701709087 在电力系统中&#xff0c;孤岛效应指的是当电网突然断电时&#xff0c;并网光伏发电系统仍然保持对电网中部分线路的供电状态。这种情况下&#xff0c;这些线路与其他电网断开&#xff0c;形成了…

HarmonyOS页面布局方式

Column&Row组件的使用 1 概述 一个丰富的页面需要很多组件组成&#xff0c;那么&#xff0c;我们如何才能让这些组件有条不紊地在页面上布局呢&#xff1f;这就需要借助容器组件来实现。 容器组件是一种比较特殊的组件&#xff0c;它可以包含其他的组件&#xff0c;而且…

亚马逊美国站CPC认证婴儿门栏和围栏安全标准cpsc办理

美国ASTM F1004-19认证属于婴幼儿门栏和围栏安全标准 ASTM F1004-19婴幼儿门栏和围栏安全标准 2020年7月6日&#xff0c;美国消费品安全委员会发布了最终法规16 CFR 1239&#xff0c;为婴幼儿门栏和围栏建立了安全标准。该法规合并及修订了最新版本的ASTM F1004-19《婴幼儿扩展…