红黑树是一种自平衡的二叉查找树,是Linux主要的二叉树结构。红黑树有一个特殊的颜色属性,要么红色,要么黑色。红黑树通过强制以下条件来保证红黑树仍然是半平衡的。

  • 所有结点要是红色或黑色的。

  • 叶子结点是黑色的。

  • 叶子结点不包含数据。

  • 所有非叶子结点有两个孩子。

  • 如果一个结点是红色,那么它的两个孩子都为黑色。

  • 从某个结点出发,到达任何叶子结点的路径中包含的黑色结点相同。

上述属性表明,最深的叶子的深度不会超过最浅的叶子的深度的二倍。这样,该树总是半平衡的。

在Linux中,红黑树称为rbtree。分别声明和定义在<linux/rbtree.h>和lib/rbtree.c中。一个rbtree的根总是由结构rb_root来表示。为了创建一个新的红黑树,我们要分配一个新的rb_root并将其初始化为特殊值RB_ROOT:

struct rb_root root = RB_ROOT。

单个结点由结构rb_node来表示。由于C语言不支持泛型编程,所以rbtree并没有提供查找和插入程序,编程人员必须自行定义,不过可以使用rbtree已经提供的一些帮助函数。

红黑树查找程序实现的一个例子

struct page * rb_search_page_cache(struct inode *inode,

unsigned long offset)

{

struct rb_node *n = inode->i_rb_page_cache.rb_node;

while(n) {

struct page *page = rb_entry(n, struct page, rb_page_cache);

if(offset < page->offset)

n= n->rb_left;

else if (offset > page->offset)

n= n->rb_right;

else

return page;

}

return NULL;

}

红黑树插入程序实现的一个例子

structpage * rb_insert_page_cache(struct inode *inode,

unsignedlong offset,

structrb_node *node)

{

structrb_node **p = &inode->i_rb_page_cache.rb_node;

structrb_node *parent = NULL;

structpage *page;

while(*p) {

parent= *p;

page= rb_entry(parent, struct page, rb_page_cache);

if(offset < page->offset)

p= &(*p)->rb_left;

elseif (offset > page->offset)

p= &(*p)->rb_right;

else

returnpage;

}

rb_link_node(node,parent, p);

rb_insert_color(node,&inode->i_rb_page_cache);

returnNULL;

}

总结:何时,何地使用什么数据结构?

如果,主要的操作是迭代访问数据,使用链表。当性能不是很重要时,也可考虑使用链表。当数据项目总数相对较少时,或需要与其他内核代码进行交互时,使用链表。

如果代码符合生产者/消费者模式,使用队列,特别是你想要一个固定大小的缓冲区。

如果需要将一个UID映射到一个对象,使用映射。

如果需要存储大量的数据并要有效地查找数据,使用红黑树。但是如果这些操作不是对时间要求很高的,那么最好用链表。

转载于:https://my.oschina.net/fuyajun1983cn/blog/263837

内核数据结构之红黑树相关推荐

  1. Linux内核之于红黑树and AVL树

    为什么Linux早先使用AVL树而后来倾向于红黑树?        实际上这是由红黑树的实用主义特质导致的结果,本短文依然是形而上的观点.红黑树可以直接由2-3树导出,我们可以不再提红黑树,而只提2- ...

  2. java treeset 红黑树_【数据结构】红黑树与跳表-(SortSet)-(TreeMap)-(TreeSet)

    SortSet 有序的Set,其实在Java中TreeSet是SortSet的唯一实现类,内部通过TreeMap实现的:而TreeMap是通过红黑树实现的:而在Redis中是通过跳表实现的: Skip ...

  3. 数据结构 — 浅析红黑树原理以及实现

    浅析红黑树原理以及实现 我们在上一篇博客认识到了平衡二叉树(AVLTree),了解到平衡二叉树的性质,其实平衡二叉树最大的作用就是查找,AVL树的查找.插入 和删除在平均 和 最坏情况下都是O(log ...

  4. HashMap 数据结构之红黑树, 红黑树在什么时候左旋 右旋 如何旋转

    树结构是数据结构中最经典最常用的结构之一,也是面试中常问的面试题,最近学习了一下红黑树的知识,记录整理一下 文章目录 一.红黑树的特征 二.变色左旋和右旋 1.变色规则 2.左旋 3.右旋 总结 前言 ...

  5. 红黑树效率为甚恶魔是log_Linux内核-深入理解红黑树与B+树应用场景

    一.红黑树和B树应用场景有何不同? 2者都是有序数据结构,可用作数据容器.红黑树多用在内部排序,即全放在内存中的,微软STL的map和set的内部实现就是红黑树.B树多用在内存里放不下,大部分数据存储 ...

  6. 数据结构之红黑树(三)——删除操作

    删除一个节点相同有可能改变树的平衡性,并且,删除所造成的不平衡性比插入所造成的平衡性的修正更加复杂. 化繁为简是算法分析中一个经常使用的方法.以下我们将欲删除节点分为三大类:欲删除节点为叶子节点.欲删 ...

  7. JAVA数据结构之红-黑树

    本篇博客我会重点介绍对红-黑树的理解,重点介绍红-黑树的查找,这里我们将要讨论的算法称为自顶向下插入,也就是把沿着树向下查找插入点 Ⅰ.平衡树和非平衡树 平衡树和非平衡树:当插入一组数据关键字是按照升 ...

  8. 为什么java1.8 hashMap的数据结构是红黑树?

    众所周知,java1.7的时候hashMap结构还是[数组+链表],而在1.8版本结构变为了[数组+链表/红黑树],当链表长度达到8时,自动转换为红黑树结构. 那么为什么java1.8要对hashMa ...

  9. 【数据结构】红黑树前置知识——4阶B树

    学习目标: 学习4阶B树,使我们更好地理解为何红黑树进行平衡时的操作缘由,理清我们红黑树平衡时局部与整体的关系. 特别说明!!! 1 这里说的4阶B树是针对学习红黑树时对B树进行一定修改得到的4阶B树 ...

最新文章

  1. 如何把照片压缩到20k一下_如何将图像压缩10倍?阿里工程师有个大胆的想法!...
  2. 推荐 2 个用 VS Code 直接浏览 GitHub 代码!只需要 1s !
  3. VI3的VLAN配置:VST、EST和VGT标记
  4. HDU2049(错列排序)
  5. [html] 如何动态修改`<title>`的标题名称?
  6. 计算机管理 如何将c盘,教程:新买的电脑如何把C盘分区成多个盘?
  7. css3仿天气风车旋转
  8. java 虚拟内存 堆_jvm虚拟内存分布 与 GC算法
  9. 20180921 su与sudo命令、限制root用户通过ssh远程登录
  10. epoll模型与select模型的区别(宿管大妈的例子)
  11. 扇贝有道180907每日一句
  12. 《机器视觉算法与应用》第3章 机器视觉算法之图像分割——学习笔记
  13. 净初级生产力(NPP)空间分布数据汇总整理
  14. py-faster-rcnn标注FDDB人脸便于其在FDDB上进行测试
  15. libcurl官方手册
  16. 联想研究院裁员---血淋漓的教训:公司不是家(老文)
  17. [Hadoop培训笔记]05-HDFS详细分析(二)
  18. 分享几个写英文论文的网页和软件
  19. React 设置网页title
  20. 前端React下载文件到浏览器

热门文章

  1. 关于异常处理的解决方案
  2. Delphi下使用指针的简单总结
  3. null 与 undefined 的区别
  4. Spark在不同集群中的运行架构
  5. 里约奥运会开幕了,一起观看“VR直播”约么?
  6. SoapUI实践:自动化测试、压力测试、持续集成 1
  7. JPA入门到精通 - JPA入门
  8. C++ 播放音频流(PCM裸流)
  9. Nmcli 网络管理命令行工具基础
  10. iOS 利用JSPatch 添加热补丁功能