红黑树的性质以及时间复杂度证明
很久就想写一篇红黑树的博客,一直没有倒出时间,今天想稍微的总结下红黑树,但是并不想介绍如何的进行插入删除,以及怎么进行旋转,变色,本编文章主要讲解红黑树的时间复杂度的证明,要想证明红黑树的时间复杂度,我们先得说说两件事,红黑树的性质和数学归纳法:
1.红黑树的性质有哪些,有了这些性质,我们才能后面进行证明
先来一张红黑树的图片,便于后期进行对红黑树进行分析:
先说下红黑树的性质:
- Every node is either red or black.
- The root is black.
- Every leaf (null) is black.
- If a node is red, then both its children are black.
- For each node, all simple paths from the node to descendant leaves contain the same number of black nodes.
中文意思是:
- 每个节点要么是红色,要么是黑色;
- 根节点永远是黑色的;
- 所有的叶节点都是是黑色的(注意这里说叶子节点其实是上图中的 null 节点,而我们真正写代码的时候,是不会特意建立一个空结点的,而是将指针设置为空就ok 了);
- 每个红色节点的两个子节点一定都是黑色;(红色结点要不没有黑色孩子,要么就有两个黑色孩子,这里的孩子不包括null叶子结点)
- 从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点;
这里稍微解释下,只要是满足这5个要求的就是,红黑树,所以理论上红黑树,可以全是黑色,
那么如果全是黑色,就应该是一个满二叉树,如下图所示:
这里再强调下性质4和性质5的作用:
性质4:每个红色节点的两个子节点一定都是黑色
“不能连续出现红节点”规定了,红色节点数量至多是(黑色节点数量-1),如果不考虑叶子节点,那么任一路径上红色节点数量至多等于黑色节点数量。
性质5:从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点,(一般我们直接说成是跟根结点,因为根结点都相同了,那么任意一个结点肯定也相同了)规定了,单看黑色节点这个树是平衡的。
结合性质4和5:我们得出这样的结论:
红黑树中任一节点的左右子树的高差最多两倍关系。
如下图,我画了一颗红黑树,根结点的左子树是右子树高度的两倍(根的左子树高度为4,右子树高度为2,这里高度没有计算null结点或者这里叫叶子结点)。
图中为了看着方便,没有画出叶子结点:
2.数学归纳法,说说数学归纳法的证明思路,后面要用到。
数学归纳法的过程分为两部分:
(1)先证明n=1时命题成立,在实际操作中,把n=1代进去就行了,就像要你证明“当n=1时1+n=2成立”
(2)假设n=k时命题成立,证明n=k+1时命题成立
你可以这样理解:第一部分证明n=1成立。绝大部分命题,n取任意非零自然数都成立,既然这样,先证最基本的n=1吧。
第二部分,既然当n=k成立时,n=k+1成立,那么,n=1已经证明成立了,n=1+1,也就是n=2时也会成立。n=2成立,按照惯例n=2+1,也就是n=3成立。按照惯例,n=3+1,n=4+1……都会成立,所以所有的自然数都能使命题成立。
你可以把第一部分当作一个坚实的基础,既然n取任意自然数成立(大部分命题是如此),那么n=1成立是理所当然的。第二部分是一个骨牌的过程,1证明2,2证明3,3证明4……证明所有非0自然数。
两部分我们都说完了,那么我们就言归正传,开始证明红黑树的时间复杂度:
证明红黑树的概念的时候,需要用到一些名词:
1、空结点,即值为NULL的结点,
2、内部结点,除了叶子结点的所有结点。
3、亲子结点,跟某一根结点,直接相连接的两个结点,称作亲子结点。
4、h(x),即树的高度
5、bh(x) , 全称是Black Height(x) ,是指结点x所在的位置的黑树的高度。听起来,有点抽象,让我们来看一张图片。以结点10为例, x = 10时, BH(x) = BH(10) = 2。这个2是怎么来的呢?从结点10开始数起(不包含起始结点),到空结点为止。5是黑色结点,NIL也是黑色结点。所以,BH(10) = 2。同理,我们再举一个例子,结点9,当 x = 9时,BH(x) = BH(9) = 1(不包含起始结点),NIL是黑色结点,所以,BH(9) = 1。现在,你应该清楚的了解了什么是BH(即黑树的高度)。
首先我们要知道O(logn)中的n是指红黑树节点个数。
已知一条关于红黑树的定理:一棵有n个内部节点的红黑树高度h至多为2log(n+1)。(h <= 2log(n+1))
(这个就和二叉树性质4类似的道理:具有n个结点的完全二叉树的的高度h 为 [logn]+1)
只要证明这条定理成立,时间复杂度也就成立的(因为红黑树查询的时间复杂度其实就是从根节点开始往下查询,最大查询时间也就是到叶节点终止,即为树的高度),接下来就来证明这条定理。
h <= 2log(n+1)可推出n >= 2^(h/2)-1。得出定理的逆否命题是 "高度为h的红黑树,它包含的节点个数至少为 2^(h/2)-1个"。我们只需证明逆否命题为真,即证明了原命题为真。
从某个节点x出发(不包括该节点)到达一个叶节点的任意一条路径上,黑色节点的个数称为该节点的黑高度(x's black height),记为bh(x)。
根据性质五可知,从节点x出发到达所有的叶节点都具有相同数目的黑节点。这也就意味着,bh(x)的值是唯一的!
根据性质四可知,从节点x出发到达叶节点"所经历的黑节点数目">= "所经历的红节点的数目"(画个红黑树数数就理解了)。假设x是根节点,则可以得出结论"h/2 <= bh(x) < h" (h=黑高度+红高度)。
因此接下来只需证明"高度为h的红黑树,它包含的节点个数至少为 2^bh(x)-1个"。(n >= 2^bh(x)-1)
下面通过"数学归纳法"论证n >= 2^bh(x)-1:
当bh(x)=0时,节点数n(b) = 2^(0)-1 = 0,原命题成立;
当bh(x)=k时,假设该树至少有2^bh(x)-1 = 2^k-1个节点;
当bh(x)=k+1时,根节点的两棵子树的黑高度最小为bh(x)-1也就是也就是k+1-1=k,原因如下:
那么,结点x的左右子树两边的黑高,要么是bh(x),要么是bh(x)-1。这取决于,结点x的亲子结点的颜色。如果亲子结点是红色,就是bh(x)。如果是黑色,即是bh(x)-1。因为如果是亲子结点是红色的,不计入黑高.
则两棵子树上的节点个数和至少为2*(2^bh(x)-1) = 2^(k+1)-2,那么该树共有2^(k+1)-2+1(加上根节点) = 2^(k+1)-1个节点,与右式相等,原命题成立。
所以数学归纳法证明结束:
本文参考的链接:
红黑树的时间复杂度为: O(lgn) - rcpalc - 博客园
红黑树时间复杂度为什么是O(logn)?_”PANDA的博客-CSDN博客_红黑树时间复杂度
红黑树的时间复杂度分析_岳锋的博客-CSDN博客_红黑树的时间复杂度
面试旧敌之红黑树(直白介绍深入理解) - 掘金
红黑树的性质以及时间复杂度证明相关推荐
- 红黑树-介绍/性质/定理/基本操作/特点
一.什么是红黑树 红黑树就是一种平衡的二叉查找树,说他平衡的意思是他不会变成"瘸子",左腿特别长或者右腿特别长. 二.红黑树的性质 除了符合二叉查找树的特性之外,还具体下列的特性: ...
- python 红黑树_python学习笔记|红黑树(性质与插入)
定义 一种含有红黑节点并能自平衡的二叉查找树(BST) 性质 1.每个节点有红/黑标记位 2.根节点是黑色(硬性规定) 3.每个叶子节点(NIL)都是黑色的虚节点(由此引出性质5) 叶子节点 colo ...
- 红黑树相关定理及其证明
红黑树有一条性质要求:如果一个节点为红色的,则它的两个子节点都是黑色.这保证了:从根到叶节点(不包括根节点)的任何一条路径上都至少有一半的节点是黑色的.(红黑树的性质还要求:对每一个节点,从该节点到其 ...
- 红黑树高度上限(2lg(n+1)证明.
UTF8gbsn 红黑树介绍 红黑树是一颗二叉树,并满足以下属性. 每一个节点要么红色要么黑色. 根节点是黑色. 所有叶子节点NIL是黑色. 红色节点的左右孩子必定是黑色节点. 从任何一个节点出发,并 ...
- 太极定二仪,清浊始以形:红黑树的实现和性质
我们在前面的章节中讲述了平衡二叉查找树,也就是叶节点高度差的绝对值不超过 1,并且左右两个子树都是一颗平衡树.最早被发明的是平衡二叉查找树是 AVL 树,后面红黑树才被发明. AVL 树在每次的插入和 ...
- 红黑树的创建+线索化+性质检验+笔画输入法
本文红黑树的实现参考<算法导论>第二版.写此算法之前,发现网络上很多版本均存在这样那样的错误,于是就自己实现了一个,用于做中文输入法. <导论>2的算法描述省略了很多情况,故不 ...
- 红黑树,看不懂你找我
文章目录 一:什么是红黑树 二:关于红黑树的一般操作 1.查找操作 2. 插入操作 2.1 新节点:我是红色的,我爹是红色的,我叔叔是黑色的 2.2 新节点:我是红色的,我爹是红色的,我叔叔也是红色的 ...
- 红黑树的删除_红黑树
红黑树是许多"平衡的"查找树中的一种,它能保证在最坏的情况下,基本的动态集合操作(插入和删除)的时间为O(lgh).我们先简单叙述二叉查找树的性质. 1.1 二叉查找树 二叉查找树 ...
- 17张图带你解析红黑树的原理!保证你能看懂!
二叉查找树 由于红黑树本质上就是一棵二叉查找树,所以在了解红黑树之前,咱们先来看下二叉查找树. 二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tre ...
最新文章
- Nature撤稿!为销毁造假证据丢弃电脑,“划时代”成果翻车了,副校长鞠躬道歉...
- python垃圾分类图像识别算法_Python 实现一个简单的垃圾分类小游戏(已获校级二等奖)...
- 搭建简单的SpringBoot开发环境
- php 7.2.5_CentOS7下PHP5.5.38升级PHP7.2.2
- KITTI数据集下载
- 从NPU-SLAM-EDA技术分析
- 架构方案(9) 如何构建一套高可用的 APP 消息推送平台
- 电脑小米手机,小米手机怎么连接电脑?
- 3.	Zigbee应用程序框架开发指南 - 应用程序框架目录结构
- cydia服务器未响应,完美解决cydia 软件源空白问题
- 内存泄露(memery leak)避免方法
- Javascript复习必记知识点
- Dynamic Programming(1)
- BaseFx实习小记(三)
- 利用计算机程序快速得到9*9大小数独的解法
- UE4新手引导之下载和安装虚幻4游戏引擎
- 这33篇区块链必读论文, 读过5篇以上的竟不到1%
- GameFramework篇:Network模块案例解读(一:准备工作)
- Yapi环境搭建(史上最详细步骤)
- 吴孟达版《高等工程数学》第四章+matlab实践
热门文章
- PyQt5——显示图片
- 微信开发一服务器地址(URL)、令牌(Token)配置
- 中软面试:飞机加油飞地球一圈的问题
- 【例10.1】从键盘输入一些字符,并逐个把它们送到磁盘上去,直到用户输入一个“#”为止。从键盘输入一些字符,并逐个把它们送到磁盘上去,直到用户输入一个“#”为止。
- Python进行假设检验
- Spring boot、Spring cloud深度技术集锦
- 煮酒论开源语音工具包
- 张海宁:首个 CNCF 中国开源项目 Harbor 的修炼之道
- “麒麟计划”携手Wish助力卖家人、货、运全面升级!
- python中向字典循环加入键值对