内核数据结构之红黑树

原创 2012年03月30日 23:58:31

红黑树是一种自平衡的二叉查找树,是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映射到一个对象,使用映射。

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



相关文章推荐

真正理解红黑树,真正的(Linux内核里大量用到的数据结构,且常被二货问到)

作为一种数据结构,红黑树可谓不算朴素,因为各种宣传让它过于神秘,网上搜罗了一大堆的关于红黑树的文章,不外乎千篇一律,介绍概念,分析性能,贴上代码,然后给上罪恶的一句话,它最坏情况怎么怎么地...   ...
  • dog250
  • dog250
  • 2015年06月27日 23:45
  • 3091

linux内核分析--内核中的数据结构之红黑树(续)

#include #include #include "kn_common.h" MODULE_LICENSE("Dual BSD/GPL"); struct student { int ...

数据结构红黑树的实现代码

  • 2008年12月06日 22:34
  • 147KB
  • 下载

数据结构之超级简单的红黑树

这两天看了一下红黑树,自己总结了一点红黑树的性质和如何插入数据,写出来自己的理解分享给大家,有什么问题希望指出。          》什么是红黑树:红黑树是基于平衡树也就是它也需要符合平衡树的特性。其...

数据结构——红黑树

  • 2012年09月06日 22:52
  • 4KB
  • 下载

红黑树-数据结构

  • 2014年03月14日 12:17
  • 2KB
  • 下载

索引基础——B-Tree、B+Tree、红黑树、B*Tree数据结构

B树(B-Tree,并不是B“减”树,横杠为连接符,容易被误导)        是一种多路搜索树(并不是二叉的):        1.定义任意非叶子结点最多只有M个儿子;且M>2; ...

红黑树数据结构剖析

  • 2014年12月24日 18:53
  • 1.43MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内核数据结构之红黑树
举报原因:
原因补充:

(最多只允许输入30个字)