红黑树(rbtree)、以及epoll的实现原理

epoll的实现原理,查看此篇博客

先明确:
在红黑树中,叶子节点指的是,没有子节点的节点的两个空节点,或者只有一个子节点的节点的另外一个空儿子,如下图所示:

在这里插入图片描述

1、定义

任意一棵红黑树,都要满足下列5个条件:

  • ① 所有节点,要么是红色,要么是黑色
  • ② 根节点是黑色
  • ③ 所有叶子节点都是黑色(这其实算是一条定义,不过这5条描述的本来就是定义😂)
    本条换个说法:从任意叶子节点到根的所有路径上不能有两个连续的红色节点
  • ④ 每个红色结点的两个子节点都是黑色
  • ⑤ 从根到任意一个叶子节点的路径中,包含的黑色节点数都相同

2、性质

从根到叶子的最长的可能路径 不多于 最短的可能路径的两倍长。
在这里插入图片描述

3、红黑树的操作

3.1 插入

3.2 删除


4、优点

使用O(logN)的时间复杂度查找任意节点。 且可以随时添加节点。

使用中序遍历可以进行范围查询,能够查询到比某个节点小的所有节点。

5、红黑树在epoll中的应用

这是epoll的源码:
https://github.com/torvalds/linux/blob/master/fs/eventpoll.c

5.1

内核事件表里的每个文件描述符都对应红黑树中的一个节点,每个节点里都有一个epoll_event结构体成员。

当调用epoll_ctl()增加或删除文件描述符时,就是增加或删除红黑树的节点。

调用epoll_create时,内核除了帮我们在epoll文件系统里建了个file结点,还在内核cache里建了棵红黑树。

调用epoll_wait时,内核只把就绪的文件描述符存到一个链表里,并返回给应用程序。

5.2 epoll为什么不用hash(O(1)的查找),而用红黑树

epoll“管理”的文件描述符数量不确定

如果使用hash,不管是用拉链法,还是用开放寻址法,都需要提前创建一个数组,但由于无法确定epoll管理的文件描述符数量,所以不知道数组要创建多大,所以没办法使用hash

红黑树(Red-Black Tree)是一种自平衡的二叉查找树,具有良好的平衡性质。 红黑树在每个节点上增加了一个额外的属性来存储节点的颜色,可以是红色或黑色。红黑树必须满足以下五个性质: 1. 每个节点都有一个颜色,要么红色,要么黑色。 2. 根节点是黑色的。 3. 所有叶子节点(NIL节点)都是黑色的。 4. 如果一个节点是红色的,则它的两个子节点都是黑色的。 5. 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数量的黑色节点。 这些性质保证了红黑树的平衡性,并且使得最长路径不超过最短路径的两倍。 红黑树的基本操作包括插入、删除和查找。插入操作通过调整节点颜色以及旋转来保持树的平衡;删除操作通过调整节点颜色以及旋转来保持树的平衡,并且在删除节点后需要考虑如何保持红黑树的性质。查找操作沿着树进行比较,最终找到目标节点或者确定目标节点不存在于树中。 红黑树的时间复杂度为O(log n),其中n为树中节点的个数。因此,红黑树在需要频繁地插入、删除和查找元素的情况下,能够保持较好的性能。 红黑树广泛应用于操作系统中的进程调度、文件系统的数据存储等领域,在STL中也有着重要的应用。它是一种非常重要且高效的数据结构,在算法和数据结构领域具有重要的研究价值和应用前景。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值