STL关联式容器之平衡二叉搜索树

 平衡二叉搜索树

        在STL关联式容器介绍-CSDN博客中对二叉搜索树做了简要的描述;但是因为没有对二叉搜索树对数的深度及插入后树的结构进行调整,二叉搜索树可能失去平衡,造成搜寻效率低落的情况。如下所示:

        所谓树形平衡与否,并没有一个绝对的测量标准。“平衡”的大致意义是:没有任何一个节点过深(深度过大)。不同的平衡条件,造就不同的效率表现,以及不同的实现复杂度。有数种特殊结构如AVL-tree、RB-tree、AA-tree,均可实现出平衡二叉搜索树,它们都比一般的(无法绝对维持平衡的)二叉搜索树复杂,因此,插入节点和删除节点的平均时间也比较长,但是它们可以避免极难应付的最坏(高度不平衡)的情况,而且由于它们总是保持某种程度的平衡,所以元素的访问(搜寻)时间平均而言也就比较少。

AVL tree(Adelson-Velskii-Landis tree)

        Adelson-Velskii-Landis树(AVL树)是由苏联数学家乔治·阿德尔森-维尔斯基(Georgy Adelson-Velskii)和叶夫根尼·兰迪斯(Evgenii Landis)于1962年提出的。它们首次在一篇论文《An algorithm for the organization of information》中介绍了这一数据结构,目的是为了提高二叉搜索树的效率。

        AVL tree是一个"加上了额外平衡条件"的二叉搜索树。其平衡条件的建立是为了确保整棵树的深度为O(logN)。直观上的最佳平衡条件是每个节点的左右子树有着相同的高度,但未免太过严苛,我们很难插入新元素而又保持这样的平衡条件。AVL tree于是退而求其次,要求任何节点的左右子树高度相差最多为1.这是一个较弱的条件,但仍能够保证“对数深度”平衡状态。

        下面来看一个满足AVL条件的二叉搜索树;

        该树的任意节点的左右子树的高度差都没超过1。

        不过此时如果插入节点11,如下图所示

插入节点11后,22节点对应左右子树的高度分别为4和2,18节点左右子树高度分别为2和1,所以该树已经不再满足AVL的特性;需要对其进行调整以满足AVL特性;

        前面说过,只要调整“插入节点到根节点”路径上,平衡状态被破坏之各节点中最深的那一个,便可使整棵树重新获得平衡。假设该最深节点为X;

        现在根据插入节点与不满足条件的X节点的位置关系不同分成四种情况,而后根据这四种情况采用不同的调整方法:

 1.插入点位于X的左子节点的左子树--左左

  2.插入点位于X的左子节点的右子树--左右

  3.插入点位于X的右子节点的左子树--右左

  4.插入点为于X的右子节点的右子树--右右

情况1,4彼此对称,称为外侧插入,可以采用单旋转操作调整解决。情况2,3彼此对称,可以采用双旋转操作调整解决。

下图为外侧示例:

下图为内侧示例:

单旋转

        在外侧状态下,如下图所示:

在外侧插入情况下,k2“插入前平衡,插入后不平衡”的唯一情况如上图所示。A子树成长了一层,致使它比C子树深度多2.B子树不可能和A子树位于同一层,否则k2在插入前就处于不平衡状态了。B子树也不可能和C子树位于同一层,否则第一个违反平衡条件的将是k1而不是k2.

        为了调整平衡状态,我们希望将A子树提高一层,并将C子树下降一层,调整后如下图所示:

这么做是因为,二叉所搜树的规则使我们知道,k2>k1,所以k2必须成为新树形k1的右子节点。二叉树的规则也告诉我们B子树的所有节点的键值是在k1和k2之间,所以新树形中的B子树必须落在k2的左侧。

        以上所有调整都只需要将指针稍作搬移,即可高效完成。完成后的新树形符合AVL的平衡条件,不需要再调整。

        对于右右的外侧插入,可以采用类似的方法完成。

双旋转

上图所示,左侧为内侧插入所造成的不平衡状态。单旋转无法解决这种情况。第一,我们不能再以k3为根节点,其次,我们不能将k3和k1做一次单旋转,因为旋转之后,还是不平衡。(以此方式旋转,k1,成为父节点,其左节点高度为1,右节点高度将是3)。唯一的可能是以k2为新的根节点。这使得k1,必须成为k2的左子节点,k3必须成为k2的右子节点。这么一来也就决定了四个子树的位置。新的树形满足AVL-tree的平衡条件,并且像单旋转的情况一样,恢复了节点插入之前的高度,因此保证不需要再做调整。

        其旋转过程经历了两次单旋转;如下所示;首先对k1,k2做一次单旋转得到如下所示树形:

而后针对k3,k2做一次单旋,其树形如下所示:

        RB-tree是另一个被广泛使用的平衡二叉树,也是SGI STL唯一实现的一种搜索树,作为关联式容器的底部机制使用。TB-tree的平衡条件不同于AVL-tree,但同样运用了单旋转和 双旋转的修正操作。下一节,我们将再对RB-tree进行学习。

参考文档《STL源码剖析--侯捷》

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

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

相关文章

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的,还可以存链表、数组等等复杂数据结构 而且数据是在内存上存…

微信小程序 最新获取用户头像以及用户名

一.在小程序改版为了安全起见 使用用户填写来获取头像以及用户名 二.代码实现 <view class"login_box"><!-- 头像 --><view class"avator_box"><button wx:if"{{ !userInfo.avatarUrl }}" class"avatorbtn" op…

视频智能分析软件LiteAIServer视频智能分析平台玩手机打电话检测算法

在当今这个数字化时代&#xff0c;智能手机已成为我们日常生活中不可或缺的一部分&#xff0c;它极大地便利了我们的沟通与学习。然而&#xff0c;当这份便利被不恰当地带入到如工厂生产线、仓库以及学校课堂等特定的工作和学习环境中时&#xff0c;其潜在的危害便逐渐显露出来…

【pytest】pytest注解使用指南

前言&#xff1a;在 pytest 测试框架中&#xff0c;注解&#xff08;通常称为装饰器&#xff09;用于为测试函数、类或方法提供额外的信息或元数据。这些装饰器可以影响测试的执行方式、报告方式以及测试的组织结构。pytest 提供了多种内置的装饰器&#xff0c;以及通过插件扩展…

gvim添加至右键、永久修改配置、放大缩小快捷键、ctrl + c ctrl +v 直接复制粘贴、右键和还原以前版本(V)冲突

一、将 vim 添加至右键 进入安装目录找到 vim91\install.exe 管理员权限执行 Install will do for you:1 Install .bat files to use Vim at the command line:2 Overwrite C:\Windows\vim.bat3 Overwrite C:\Windows\gvim.bat4 Overwrite C:\Windows\evim.bat…

一文快速掌握 AMD FPGA IO约束 常用电平标准

FPGA开发中IO约束是不可缺少的部分&#xff0c;正确的电平约束是确保电路稳定运行与兼容性的关键所在。 今天分享下IO约束中常用的电平标准&#xff0c;帮助大家快速理解和掌握。 一、 LVTTL系列 LVTTL全称为Low - Voltage Transistor - Transistor Logic&#xff0c;是一种…

没钱买KEGG怎么办?REACTOME开源通路更强大

之前搜集免费生物AI插图时简单提到了通路数据库Reactome&#xff08;https://reactome.org/&#xff09;&#xff0c; 那些精美的生物插图只能算是该数据库附赠的小礼品&#xff0c;他的主要功能还是作为一个开源的通路数据库&#xff0c;为相关领域的研究者提供直观的可视化生…

ubuntu显示管理器_显示导航栏

ubuntu文件管理器_显示导航栏 一、原始状态&#xff1a; 二、显示导航栏状态&#xff1a; 三、原始状态--->导航栏状态: 1、打开dconf编辑器&#xff0c;直接在搜索栏搜索 dconf-editor ------如果没有安装&#xff0c;直接按流程安装即可。 2、进入目录&#xff1a;org …

mysql的基本操作

各位小伙伴们&#xff0c;好久不见呀&#xff01;最近博主也因为个人原因&#xff0c;实在是太忙&#xff0c;才导致最近的文章一直没更新&#xff0c;当然本篇文章依旧还是会给大家带来知识点的学习&#xff0c;闲话少叙&#xff0c;我们直接进入正题。 目录 数据库的创建及使…

6.k8s:devops

目录 一、devOps整体流程 二、GitLab 1.GitLab安装 2.GitLab基础配置 (1)修改密码 (2)不启用头像 (3)关闭用户注册功能 (4)开启webhook外部访问 (5) 设置中文 3.配置secret 4.卸载gitlab 三、Harbor镜像仓库 1.安装好docker-compose 2.安装harbor 四、…

分布式IO模块:智慧楼宇的“智慧眼”与“智慧手”

在现代化的城市建设中&#xff0c;智慧楼宇作为一种集成了建筑、通信、计算机和控制等多方面技术的新型建筑&#xff0c;正逐渐成为城市发展的重要驱动力。智慧楼宇不仅提高了建筑设备的运行效率&#xff0c;降低了能源消耗&#xff0c;还提供了更加安全、舒适和便捷的生活办公…

【IOS】编译缓存错误Library/Caches/com.apple.mobile.installd.staging

项目场景&#xff1a; xcode ios 问题描述 Failed to load Info.plist from bundle at path /var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.FOrCHQ/extracted/xxxxModule_Example.app/Frameworks/Foundation.framework; Extra info about "/va…

ARM64环境部署EFK8.15.3收集K8S集群容器日志

环境规划 主机IP系统部署方式ES版本CPU架构用户名密码192.168.1.225Ubuntu 22.04.4 LTSdockerelasticsearch:8.15.3ARM64elasticllodyi4TMmZD ES集群部署 创建持久化目录(所有节点) mkdir -p /data/es/{data,certs,logs,plugins} mkdir -p /data/es/certs/{ca,es01}服务器…

【网络安全 | 漏洞挖掘】邮件HTML注入

文章目录 Email 中的 HTML 注入漏洞漏洞挖掘过程1. 初步信息收集2. 发现私信功能3. 功能测试与 HTML 注入测试测试步骤请求拦截与分析4. 绕过防护机制绕过方法附加威胁漏洞影响漏洞报告与奖励Email 中的 HTML 注入漏洞 HTML 注入是一种安全漏洞,攻击者通过将任意 HTML 标签注…

《自定义类型:结构体》

1. 结构体回顾 结构体的声明 结构体的初始化 2. 结构体的特殊声明 匿名结构体&#xff1a; 不需要给结构体名字&#xff0c;但是只能使用一次。 这里的使用一次具体是什么意思呢&#xff0c;刚开始学的时候我自己的理解是有误解的&#xff0c;下面给出一个示例; 注意&…

基于Java Springboot城市公交运营管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

【杂谈】无人机测绘技术知识

无人机测绘技术知识 随着科技技术的不断进步和低空经济的快速推进&#xff0c;无人机技术已经从最初的军事侦察、航拍娱乐&#xff0c;逐渐深入到各个行业领域&#xff0c;其中无人机测绘技术&#xff08;航空摄影测量&#xff09;更是凭借其高效、精准、灵活的特性&#xff0…

数据挖掘复习

一、绪论 分类 classify 上涨或跌 回归 regression 描述具体数值 分类模型评估 1.混淆&#xff08;误差&#xff09;矩阵 confusion matrix 2.ROC曲线 receiver operating characteristic curve 接收者操作特征曲线 3.AUC面积 area under curve ROC曲线下与坐标轴围成的面…

Springboot 整合 Java DL4J 构建股票预测系统

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

ZSTD 内存泄漏问题

优质博文&#xff1a;IT-BLOG-CN Zstandard&#xff08;简称zstd&#xff09;是一种无损压缩算法&#xff0c;由Facebook开发并开源。它旨在提供高压缩比和高解压速度的平衡&#xff0c;适用于多种数据压缩需求。 特点 【1】高压缩比&#xff1a; zstd能够在保持较高压缩比的…