基于c/c++的数据结构-红黑树

红黑树的起源、原理及应用

01 红黑树的起源

搜索与数据结构
1、线性表
1.1从第0个位置开始遍历,查找的平均时间复杂度:O(n)
1.2问题:耗费的时间太长了
在这里插入图片描述
2、二分搜索
2.1先从小到大排个序,是有序数组,查找的时间复杂度为O(logn)
2.2问题:虽然查找快,但是插入删除慢,时间复杂度为O(n)
eg:插入一个元素的时候,仍然要保证有序,先查找位置,然后将它后面的元素依次向后移。二分查找是O(log2n),插入操作需要将插入位置后的元素全部后移一位,需要O(n),所以总的时间复杂度是O(n)
在这里插入图片描述
3、二叉查找/排序树(binary search tree :BST):
3.1定义:一棵空树,或者是具有下列性质的二叉树:
(1)若左/右子树不空,则左/右子树上所有结点的值均小于或等于/大于或等于它的根结点的值;
(2)左、右子树也分别为二叉排序树;
3.2特点:和有序序列上的二分查找有可能是一样的效率,查找的时间复杂度与树的高度有关,为O(h),而插入删除不用移动大量元素。
3.3问题h的大小,在极端情况下,树的高度可能等于节点个数,使ASL=(n+1)/2在这里插入图片描述
4平衡二叉查找树:简称平衡二叉树(由Adelse-Velskil 和 Landis提出,所以称为 AVL):
4.1定义:一棵空树,或者是具有下列性质的二叉树:
(1)左右子树的高度相差不超过 1
(2)左、右子树也分别为平衡二叉树;
4.2 h:
在这里插入图片描述
4.3查找时间复杂度不超过O(logn),
4.4问题:平衡性要求很高,左右子树高度差不能超过1,一超过1,会马上调整。插入删除时,可能会失去平衡,不断调整,很耗时间。
4.5注:平衡二叉树是基于二叉排序树之上的,平衡的目的是为了方便查询
5.红黑树(Red Black Tree : RBT)
要求树基本上是平衡的,
要求没有平衡二叉树那么严格

02 红黑树的原理

1、定义与性质
(1)每个结点是红色或是黑色的
(2)根属性:根节点必须是黑色的
(3)红属性:一个节点是红色,则它的子节点必须是黑色
(4)黑属性:任何一个节点从节点本身到它的所有叶子节点,都包含相同个数的黑色节点
(5)红黑树把空指针(NULL)作为叶节点,叶节点都是黑色的
在这里插入图片描述
2、黑色高度bh(x)
从某个结点x出发(不包含该结点)到达一个叶子结点的任意一条路径上,黑色结点的个数。
3、性质
(1)在任何一个节点作为根的时候,至少有在这里插入图片描述
个内部节点

(2)任何一个节点的高度在这里插入图片描述
性质1证明:数学归纳法
在这里插入图片描述
在这里插入图片描述
4、时间复杂度计算
上限:由前两条性质可知
在这里插入图片描述
下限:
红黑树是一种特殊的二叉树,对于有n个节点的二叉树而言,当其为满二叉树时,树的高度最小
在这里插入图片描述
综上:在这里插入图片描述
5、插入( 插入,删除的时间复杂度O(logn) )
(1)空树的时候,标记为黑色插入,退出
(2)不是空树,则标记为红色
如果它的父节点是黑色,就完成了;否则:
Case1:父节点是红色,检查父节点的兄弟也是红色的,就都变成黑色的。再看其父亲的父亲,是根节点就完成,否则重新着色。把黑色变成红色,重复这一过程。
Case2:父节点是红色,检查父节点的兄弟是黑色或者没有,就旋转或重新着色。

03 红黑树的应用

使用的时候有两种使用方式
(1)每个节点是key-value键值对,通过key快速找到对应的value。
(2)RBT 是中序遍历有序的。
利用顺序,可以快速查找范围
1、进程调度与红黑树
(1)一个进程,就是红黑树上的一个节点
(2)把所有进程串成一个红黑树
(3)每个进程在CPU中运行,哪个先运行?答:有很多种调度算法
(4)就绪进程如何被调度:调度的过程是把进程对应的上下文加载到CPU里面,退出则是把CPU的值都保存下来。
eg:Key是对应运行时间,调度时,一个进程就是一个节点,根据它的时间选择调度对象,如在8:40运行,8:41运行,8:42运行…假如有一个定时器在8:43的时候开始调用,则之前的都超时了,进入了就绪状态。
2、虚拟内存
(1)虚拟存储区域的组织方式有两种,一种是采用双循环链表(虚拟内存区较少),还有一种是采用树的结构(虚拟内存区较多)
(2)创建一个进程时,操作系统会为该进程分配一个 4G大小(32位系统)的虚拟进程地址空间
(3)这4G的内存是通过mm_struct这个结构体组织起来的
内存块通过红黑树组织
(4)malloc(memory allocate),分配heap中的一个内存块
在这里插入图片描述
很多内存块用红黑树处理:
(1)开始地址作为key
(2)整个内存块作为value
查找地址时,当前地址小于key对应的结束地址,就从左子树找,反之从右子树找
3、文件系统目录应用
4、其他一些应用

  • nginx中,用红黑树管理timer
  • 网络协议栈
  • C++的STL中:如map和set都是用红黑树实现的
  • Java hashmap中链表转红黑树:在链表长度大于8的时候,将后面的数据存在红黑树中,以加快检索速度
  • Java的TreeMap
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值