算法实战:亲自写红黑树之四 插入insert的平衡
本文承接自:
算法实战:亲自写红黑树之一-CSDN博客
算法实战:亲自写红黑树之二 完整代码-CSDN博客
算法实战:亲自写红黑树之三 算法详解-CSDN博客
目录
一、入口
二、普通二叉树插入
三、插入后的平衡
四、算法解惑
一、入口
入口点仿照stl:
//如果second为false则已经存在,发生了覆盖,用GetOldValue获得被覆盖的值pair<iterator, bool> insert(T_DATA const& data){T_COMP comp;return insert(data, comp);}pair<iterator, bool> insert(T_DATA const& data, T_COMP& comp){m_OldValueSeted = false;//清除被覆盖对象的有效标志pair<iterator, bool> ret;ret.first = end();ret.second = false;if (tree_head->free_head < 0 && m_array.Capacity() <= m_array.Size()){thelog << "超出容量限制" << ende;return ret;}try{ret = _insert(data, comp);}catch (exception& e){thelog << e.what() << ende;}//thelog<<"insert ret "<<ret.first.handle<<" "<<ret.second<<endi;return ret;}//返回被覆盖的值,如果最近的操作没有发生覆盖则falsebool GetOldValue(T_DATA& ret)const{if (m_OldValueSeted){ret = m_OldValue;return true;}else{return false;}}
入口点首先处理了需要扩展容量的情形,这个扩展指的是树的删除链表为空,需要从底层数组申请空间的情形。
我的实际应用场景更复杂些,如果底层数组也满了,就会再申请一块共享内存,由于两块共享内存地址地址无法连续,我用了一个地址映射表,从索引到数据要经过查表转换,这就是为什么我必须把底层操作抽象出来的原因。
根据实际需要增加了GetOldValue函数,用来返回被覆盖掉的值。这个功能到底应不应该存在,见仁见智。
T_COMP不理解就无视它,知道默认就是用“<”就可以了。
二、普通二叉树插入
普通插入很简单,由一组“_insert()”函数实现,前导“_”数量不同,表示不同的调用级别。
普通插入后由_RB_insert_Balance(position)函数完成平衡。如果忽略这一句就是普通插入。
如果是覆盖,则只替换数据,树结构不变,不需要平衡。
三、插入后的平衡
代码是比较简单的:
void _RB_insert_Balance(T_SHM_SIZE x){T_SHM_SIZE p = TREE_NODE::at(x).hParent;if (!_isRed(p))return;//连续红,需要调整bool isLeft = (x == TREE_NODE::at(p).hLeft);T_SHM_SIZE g = TREE_NODE::at(p).hParent;bool isL = (p == TREE_NODE::at(g).hLeft);T_SHM_SIZE u = (isL ? TREE_NODE::at(g).hRight : TREE_NODE::at(g).hLeft);if (_isRed(u)){//u为红只需要染色,然后递归TREE_NODE::at(p).bColorRed = false;TREE_NODE::at(u).bColorRed = false;TREE_NODE::at(g).bColorRed = true;_RB_insert_Balance(g);}else{if (isL){if (isLeft){//LL_RRotate(g);_exchage_color(p, g);}else{//LR_LRotate(p);_RRotate(g);_exchage_color(x, g);}}else{if (isLeft){//RL_RRotate(p);_LRotate(g);_exchage_color(x, g);}else{//RR_LRotate(g);_exchage_color(p, g);}}}}
x 插入的新节点
p x的父节点
u x的叔叔,也就是p的兄弟
g x的祖父,也就是p和u的父节点
_isRed(h) 判断节点是不是红色
_LRotate(h) 左旋,只改变父子关系,颜色和数据不变
_RRotate(h) 右旋,只改变父子关系,颜色和数据不变
_exchage_color(h1,h2) 交换两个节点的颜色
四、算法解惑
这个算法的原则其实很简单,不是双红不用处理,是双红则:
- 如果上一层两个都是红,则g必然是黑(红黑树规则),于是就将上一层两个都变成黑、g变成红,于是下面符合规则了,但是g变成了红,可能造成新的双红,于是再对g做平衡。这个过程可能一直递归到顶。
- u是黑,挪一个红过去。具体挪法分四种情形。听起来也不简单?
其实吧,所谓“u是黑”,意思是u是空啊,u不是空的话g左右两边深度就不一样了,违反红黑树规则。所以双红其实就是g下面只有一个红节点,新的节点有挂在了这个红节点下面,也就是“g-红-红”,只需要重新布局,改成g下面一边一个就行了。
而第一种情形的“u是红”呢,就是g下面两个都是红,新的节点又挂在其中一个下面,也就是“g-红红-红”,不可能再有别的黑色数据节点(不是空)存在。
是不是豁然开朗?
(这里是结束)
相关文章:
算法实战:亲自写红黑树之四 插入insert的平衡
本文承接自: 算法实战:亲自写红黑树之一-CSDN博客 算法实战:亲自写红黑树之二 完整代码-CSDN博客 算法实战:亲自写红黑树之三 算法详解-CSDN博客 目录 一、入口 二、普通二叉树插入 三、插入后的平衡 四、算法解惑 一、入口 入…...
JWT 技术
一、介绍 JWT全称:JSON Web Token 官网:https://jwt.io/ 定义了一种简洁的、自包含的格式,用于在通信双方以 json 数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的 在生成 JWT 令牌时,会对 JSON 格式的数…...
003.文件描述符、重定向
1、文件描述符 文件描述符是与输入和输出流相关联的整数。最广为人知的文件描述符是stdin、stdout和stderr。我们可以将某个文件描述符的内容重定向到另一个文件描述符中。 在编写脚本的时候会频繁用到标准输入(stdin)、标准输出(stdout&am…...
图论| 827. 最大人工岛 127. 单词接龙
827. 最大人工岛 题目:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。返回执行此操作后,grid 中最大的岛屿面积是多少? 岛屿 由一组上、下、左、右四个方向相连的 1 形成。 题目链接:[827. 最大人工岛](ht…...
2023年中国恒温蜡疗仪发展趋势分析:应用前景存有很大发展与探索空间[图]
恒温电蜡疗仪可将蜡熔化,利用蜡自身特点,能阻止热的传导、散热慢、气体和水分不易消失,保温性能优越。利用蜡能紧密贴于体表的可塑性,可加入其他药物协同进行治疗,也可将中药与蜡疗有机地结合在一起,产生柔…...
认识“协议”
文章目录: 什么是协议结构化的数据传输序列化和反序列化网络版本计算器 什么是协议 在计算机网络中,协议是指在网络中进行通信和数据交换时,双方遵循的规则和约定集合。它定义了数据的传输格式、顺序、错误处理、认证和安全性等方面的规范。 …...
GO语言的由来与发展历程
Go语言,也称为Golang,是由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明,并于2009年正式对外发布的开源编程语言。 三名初始人的目标是设计一种适应网络和多核时代的C语言,Go语言从C继承了…...
MPN – 制造零件号
S/4 1610 中的 MPN – 基于 NAST 的输出管理 我试图查找有关 MPN 设置的信息,但找不到详细的配置步骤。在浏览了一些信息和 help.sap 链接后,我能够在 S/4 1610 系统中配置 MPN 设置,这与使用旧输出类型(Nast 和输出类型 NEU&…...
Redis企业级问题及解决方案
1.1 缓存预热 场景:“宕机” 服务器启动后迅速宕机 问题排查: 1.请求数量较高,大量的请求过来之后都需要去从缓存中获取数据,但是缓存中又没有,此时从数据库中查找数据然后将数据再存入缓存,造成了短期…...
【2021集创赛】基于arm Cortex-M3处理器与深度学习加速器的实时人脸口罩检测 SoC
团队介绍 参赛单位:深圳大学 队伍名称:光之巨人队 指导老师:钟世达、袁涛 参赛队员:冯昊港、潘家豪、慕镐泽 图1 团队风采 1. 项目简介 新冠疫情席卷全球,有效佩戴口罩可以极大程度地减小病毒感染的风险。本项目开发…...
B码的相关知识点笔记
B码(B-Code)通常是指中国北斗卫星导航系统的坐标编码方式。北斗卫星导航系统使用的坐标系是WGS-84,而B码是针对WGS-84坐标系进行编码的一种方式。 B码的格式通常为18位或24位,其中包含以下信息: 前两位为国家码&…...
java“贪吃蛇”小游戏
基于java实现贪吃蛇小游戏,主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。 我是在javaSwing项目下创建了一个包 名字叫做:Snakes包 包下有一个启动类和一个设置代码的主界面两个类 代码主界面: 代码主界面主要讲解的是 …...
【面试经典150 | 位运算】数字范围按位与
文章目录 Tag题目来源题目解读解题思路方法一:公共前缀方法二:n & (n-1) 写在最后 Tag 【位运算】 题目来源 201. 数字范围按位与 题目解读 计算给定区间内所有整数的按位与的结果。 解题思路 本题朴素的方法是直接将区间内的所有整数按位与&…...
推介会如何做好媒体宣传
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 推介会是一种专为企业、社会组织和团体、政府等提供的展示自身特点、产品和政策的活动形式,旨在促进交流活动,形成合作,从而带来共同利益。推介会的本…...
【ROS导航Navigation】五 | 导航相关的消息 | 地图 | 里程计 | 坐标变换 | 定位 | 目标点和路径规划 | 激光雷达 | 相机
致谢:ROS赵虚左老师 Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 参考赵虚左老师的实战教程 一、地图 nav_msgs/MapMetaData 地图元数据,包括地图的宽度、高度、分辨率等。 nav_msgs/OccupancyGrid 地图栅格数据&#…...
什么是脏读、不可重复读、幻读讲解
数据库隔离级别是数据库管理系统中一个重要的概念,它定义了事务之间的可见性和影响。在多用户并发访问数据库时,隔离级别能够确保事务之间的相互独立性,避免数据不一致的问题。本文将深入探讨三种常见的并发问题:脏读、不可重复读…...
2018年五一杯数学建模C题江苏省本科教育质量综合评价解题全过程文档及程序
2019年五一杯数学建模 C题 江苏省本科教育质量综合评价 原题再现 随着中国的改革开放,国家的综合实力不断增强,中国高等教育发展整体已进入世界中上水平。作为一个教育大省,江苏省的本科教育发展在全国名列前茅,而江苏省13个地级…...
第四代智能井盖传感器:万宾科技助力城市安全
在繁华喧嚣的城市里人来人往,井盖作为基础设施的一个组成部分在路面上分布范围广。然而这些看似普通的井盖却存在着位移、水浸的风险,可能给我们的生活带来诸多不便,更会威胁到我们的人身安全。如何有效监测和管理井盖的状态,成为…...
[Jenkins] Docker 安装Jenkins及迁移流程
系统要求 最低推荐配置: 256MB可用内存1GB可用磁盘空间(作为一个Docker容器运行jenkins的话推荐10GB) 为小团队推荐的硬件配置: 1GB可用内存50 GB 可用磁盘空间 软件配置: Java 8—无论是Java运行时环境(JRE)还是Java开发工具包(JDKÿ…...
第七篇 基于JSP 技术的网上购书系统——新品上架、推荐产品、在线留言、搜索功能实现(网上商城、仿淘宝、当当、亚马逊)
目录 1.新品上架 1.1功能说明 1.2界面设计 1.3处理流程 1.4数据来源和算法 1.4.1数据来源 1.4.2查询条件 1.4.3表间关系 1.4.4相关sql实例 2.推荐产品 2.1功能说明 2.2界面设计 2.3处理流程 2.4数据来源和算法 2.4.1数据来源 2.4.2查询条件 2.4.3表间关…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
