红黑树的topdown-remove

51、高级数据结构:红黑树、Treap树、后缀数组和后缀树 本文深入探讨了几种高级数据结构,包括红黑树、Treap树、后缀数组和后缀树。详细分析了它们的基本性质、实现方法以及适用场景。红黑树在插入和删除上具有较低的开销,Treap树实现简单,后缀数组和后缀树在文本模式匹配中表现出色。通过比较不同数据结构的特点,帮助读者在不同场景下选择合适的数据结构,并提供了实际应用案例和未来展望。 阅读详情

红黑树的bottomup-insert很容易实现, 而删除就不容易, 今天抄成功了Julienne Walker发在他网站上的算法, 为备忘, 总结一下。

首先, 删除red 节点, 不影响红黑树的有效性。利用这一点,我们寄希望于可以把其他情况都转化成删除红色节点。

其次, 跟在Binary search tree中一样, 删除一个节点K可以转化为

        1,先找到这个节点的inorder predecessor(中序前一个) $K

        2, 拷贝$K的内容到K,然后删除$K

Julienne Walker告诉我们,要转化成删除红色节点总是可以的。只要我们在向下搜索待删除key的时候,利用旋转,确保被删除的节点是红色, 并且不改变红黑树的性质(1,红色节点不能相连;2,每一个空节点到root的“black-height”都一样)

 

结合上面两点, 我们在搜索的过程中要把实际上“物理”删除的节点变成红色的, 具体变换如下:

假定刚刚比较过Q.data与data的大小, 知道该往Q的子节点T的方向继续搜索.(在找到Q.data == data后, 还继续搜索$Q,

为了让T的某个分支上满足设想, 即最后让$Q为红色, 我们希望将Q变成红色的, 如果它不是红的的话)

RBTreeRemove

void RedBlackTree::remove(int data)
{
	if (mRoot != NULL)
	{
		RBNode head = {0};
		//great-parent, parent, iterator,     ,founded node.
		RBNode *g,        *p,      *q,    *t,     *f = NULL;
		
		q = &head;
		g = p = NULL;
		q->r = mRoot;
		bool isRight = true;

		do
		{
			bool last = isRight;
			t = isRight ? q->r : q->l;
			g=p; p=q; q = t;
			isRight = q->data < data;
			t = isRight ? q->r : q->l;			
			
			if (q->data==data) f=q;

			if (!is_red(q) && !is_red(t))
			{//目标是使最后被删除的节点red, q或t是red都可以保证这一点
				RBNode* othLink = isRight ? q->l : q->r;
				if (is_red(othLink))
				{
					if (isRight) rotate_right(q);
					else rotate_left(q);
					if (last) p->l = q;
					else p->r = q;
				}
				else
				{
					RBNode* s = last ? p->l : p->r;
					if (s != NULL)
					{
						if (!is_red(s->l) && !is_red(s->r))
						{
							p->red = 0;
							q->red = s->red = 1;
						}
						else
						{
							bool isPLeft = g->l == p;
							RBNode *&tmp = isPLeft ? g->l : g->r;
							RBNode *ss = last ? s->l : s->r;
							if (is_red(ss))
							{
								if (last) rotate_right(tmp);
								else rotate_left(tmp);
							}
							else 
							{
								if (last) rotate_left_right(tmp);
								else rotate_right_left(tmp);
							}
							tmp->red = q->red = 1;
							tmp->l->red = tmp->r->red=0;
						}
					}
				}
			}
		}while (t != NULL);

		if (f != NULL)
		{
			f->data = q->data;
			RBNode* &tmp = p->l==q ? p->l : p->r;
			tmp=q->l == NULL ? q->r : q->l;
			delete q;
		}
		if (mRoot != NULL) mRoot->red = 0;
	}
}
5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

相关推荐

OpenVPN 新增 windows 客户端

虚拟私人网络(Virtual Private Network,简称VPN)是一种网络技术,它允许用户通过公共网络(如互联网)建立一个安全的连接通道。本文介绍如何添加 windows 客户端。

利昂的技术存档 3765

红黑树教程 by Julienne Walker

不是转载,是我自己翻译的红黑树教程,有错的地方欢迎指出。 作者: Julienne Walker 欢迎欢迎!如果这是你第一次看我的教程,那么准备好,好好享受乐趣吧。首先,为啥又要我学一篇红黑树的教程?任何人在google上搜索红黑树都会有大量的资源,包括各种教程、基本概念、java小程序、文档、库、ppt等等。这是挺好的,但还不够好。大多数资源都只有讲到了插入操作,懒死了。其他没有讲好

u010314872的专栏 1403

保姆级教程:用Python+OpenCV搞定Orbbec Gemini深度与彩色流对齐(附完整代码)

本文提供了一份详细的Orbbec Gemini深度与彩色流对齐教程,涵盖从环境配置到完整代码实现的每一步。通过解析深度流对齐原理,对比不同对齐模式,并提供工业级应用中的问题排查方法,帮助开发者快速掌握Orbbec Gemini相机的使用技巧。文章还包含进阶应用如点云生成与三维重建的实战代码。

weixin_29090917的博客 470

C++学习笔记——红黑树

在前面的基础上,来到最后一棵树,红黑树。 目录 概念 性质 结点的定义 树的结构与定义 红黑树的插入 概念 红黑树又可以叫双色树,只要有能够进行区分的两种颜色就行,通常是红色和黑色。它也是一种二叉搜索树,只是在每个结点上增加了颜色。通过颜色,来让这棵树达到平衡。 性质 以红黑两种颜色为例,可以看上面的图,来看下面的性质。 根节点都是黑色 如果一个结点是红色的,则它...

走过路过不要错过 637

大模型训练流程(四):PPO强化学习实战与调优指南

本文详细解析了大模型训练中PPO强化学习的实战应用与调优技巧,涵盖RLHF核心原理、PPO算法实现及显存优化策略。通过具体案例和代码示例,指导开发者有效提升模型回答质量与安全性,避免常见训练陷阱。

weixin_29051811的博客 437

Infinite-Canvas:一站式AI绘画工作流平台部署与实战指南

在 AI 绘画和内容创作领域,你是否经常遇到这样的困扰:灵感来了,却要在多个工具间来回切换——找素材、写提示词、调整参数、批量生成,整个过程繁琐且低效。创作一个系列作品时,管理不同版本的图片和提示词更是让人头疼。如果你渴望一个能整合所有流程,实现从素材管理、提示词工程到批量出图一站式完成的工作台,那么今天介绍的 Infinite-Canvas 正是为你量身打造的解决方案。 Infinite-Canvas 是一个开源的本地网页应用,它将 AI 绘画的完整工作流集成在一个界面中。无论你是想快速生成单张图片,还是

weixin_28707535的博客 338

c++自顶向下实现红黑树

红黑树自顶向下的详细实现 包括插入和删除操作 #include <iostream> #include <algorithm> #include <vector> #include <stack> #include <random> #include <ctime> #include <string> using namespace std; //自顶向下插入和删除算

naturerun的博客 1113

WOFOST作物模型(7):6.0.6版本的PCSE使用(多层水分平衡和SNOMIN碳氮模型的集成)

wofost81文件结构如上,其中所需的参数可从github上获取然后input下有两个需要调用的功能函数py文件,需要拖到自己的运行py文件同级目录下在使用土壤模块SNOMIN进行作物生长模型模拟时,需要为土壤剖面的不同层次提供多种输入变量。这些变量通常不随年份变化,因此会统一在土壤文件中定义。本节将说明如何将这些输入变量整合到一个字典中,进而生成SNOMIN能够读取的土壤文件。

所有专家都曾始于新手 638

红黑树

文章目录2-3-4树概念插入红黑树概念操作旋转操作插入删除(较插入更为复杂)总结 Java 中的 TreeMap,JDK 1.8 中的 HashMap、C++ STL 中的 map 均是基于红黑树结构实现的 红黑树是一种特殊的二叉搜索树,是自平衡的二叉搜索树(说法不是很准确) 红黑树是实现,自平衡的二叉搜索树是算法和逻辑 叶节点的层级差的绝对值不超过1,叶子表示nil值。 否则,需要旋转(插入时导致不平衡) 学习红黑树前,先学2-3-4树 2-3-4树 概念 在普通的二叉查找树上进行了拓展,它允许有多个键(

AC_872767407的博客 663

LDO 上电过冲的根因

LDO在上电瞬间常出现短时过冲电压(3.4V-3.5V),可能损坏敏感器件。其根本原因是:低

硬核科技 293

人形机器人电源系统硬件开发:从原理图设计到PCB布局的完整流程

人形机器人是“移动的智能终端”,其电源系统如同“心脏+血管”:既要为大脑(主控)、肌肉(电机)、感官(传感器)提供稳定能量,又要在有限体积内应对高动态负载(如跳跃时电机瞬间大电流)。本文聚焦“硬件开发”维度,覆盖从需求分析到PCB制板的完整流程,适合硬件工程师、机器人爱好者快速掌握工程实战方法。

AI天才研究院 2174

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 203

Python在振动信号处理中的应用(一):振动信号消除多项式趋势项

文章目录一、概述二、最小二乘法去除趋势项原理三、python模块介绍3.1 scikitlearn简介(1)转化器(Transformer)(2)估计器(Estimator)3.2 线性回归LinearRegression3.3 多项式PolynomialFeatures3.4 工作流Pipeline四、python代码实现4.1 构造模拟信号4.2 编写去除趋势项主代码4.3 展示算法效果五、TIPS 一、概述   在振动测试过程中,传感器或采集设备由于自身性能问题或受环境干扰(如温度、供电等影响),容易

白银时代的博客 8578

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 311

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 571

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 20

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 749

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 367

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 170

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 82

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 217

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 178

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 349

不同的二叉搜索树

互不相同的二叉搜索树的种数,以 j (1<=j<=i)为头节点,左子树是 j-1 个数,右子树就是 i - (j - 1) -1 = i - j个数。所以dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0]头1 = 左子树0节点 * 右子树2节点,二叉搜索树就是排序树,左子树<根节点<右子树,左右子树也满足左子树<根节点<右子树。头2 = 左子树1节点 * 右子树1节点。所以dp[i] += dp[j-1] * dp[i-j]个节点组成且节点值从。

qq_44721738的博客 152

考拉兹猜想 - 7

本文通过引入虚数单位重构Collatz猜想的迭代逻辑,指出偶数减半与奇数“乘3加1”的过程在虚数坐标下等价于归结操作。关键在于:乘3加1使奇数跃升至偶数,随后持续减半,而虚数单位代表“无限减1”,实现无限向有限的转化。无论初始值如何,减半始终主导,最终归结为4-2-1循环。该视角消解了正向思维中的速度竞争疑虑,证明归结是必然结果。

杨铸人的博客 42

SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对

申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。

谁呀!的博客 399
上一篇: 表达式求值
下一篇: poj 2411 动态规划
yllfever
博客等级 码龄19年 4粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值