用户空间使用Linux数据结构系列之红黑树
本文通过对Linux内核中红黑树的源码分析,通过大量图示描述红黑树的原理,最后通过移植改造Linux内核红黑树代码,使用户空间也能使用Linux红黑树.
本着从群众中来,回到群众中去的原则,本文很多内容都是参考网上资料,但本身不影响大家阅读,因为我们的目的很明确,就是掌握原理,并在实践中应用。
红黑树由来:
他是在1972年 由Rudolf Bayer发明的,他称之为“对称二叉B树”,它现代的名字是Leo J. Guibas和 Robert Sedgewick 于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。
1. linux中如何实现红黑树
1.1 RB树的定义
red-black tree(RB树)
是一种平衡二叉树,它主要用于存储或者说索引可排序的键值对数据。RB树(红黑树)与radix树和hash表都不同。radix树是一种比较适合用于存储稀疏的数据集而且将用一个大整数进行插入,删除,查找的操作基础。而hash表并不是以某种排序顺序进行存储,而且必须指定大小和hash函数。RB树与AVL树很相似,但是比AVL树有更好的插入和删除最坏情况的时间复杂度,以及O(log n)的最坏查找时间复杂度。
RB树定义
1.每个结点要么是红色要么是黑色;
2.根结点必须是黑色;
3.每个叶节点,即空节点(NULL)是黑色的。
4.红结点如果有孩子,其孩子必须都是黑色(红节点周边3个节点都是黑色);
5.从根结点到叶子的每条路径必须包含相同数目的黑结点。
红黑树是满足一定特征的二叉树,其本质还是二叉树。红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。
通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。既然是二叉查找树,那么它必满足二叉查找树的一般 性质。下面,在具体介绍红黑树之前,先来了解下 二叉查找树的一般性质:
1.在一棵二叉查找树上,执行查找、插入、删除等操作的时间复杂度为O(log n)。因为,一棵由n个结点,随机构造的二叉查找树的高度为logn,所以顺理成章,一般操作的执行时间为O(log n)。至于n个结点的二叉树高度为O(log n)的证明,可参考算法导论 第12章 二叉查找树 第12.4节。
2.但若是一棵具有n个结点的线性链,则此些操作最坏情况运行时间为O(n)。而红黑树,能保证在最坏情况下,基本的动态几何操作的时间均为 O(log n)。
引用:
在Linux中有很多地方用到了RD树。anticipatory, deadline, 和CFQ I/O调度都使用的是RB树进行请求跟踪,还有CD/DVD驱动的包管理也是如此。高精度计时器(high-resolutiontimer)使用RB树组织定时请求。
EX