hash表,radix_tree,红黑树,B+树比较

如题,这几种数据结构都是我们平时常用的数据结构。

 

hash链表: 本质上就是 数组 + 链表

hash树: 本质上就是 数组 + 树。这个树可以是红黑树,B+树,radix_tree等

 

因为每种数据结构都有自己的优点,缺点。hash链表的各种性能介于 数组和链表之间,hash树的各种性能介于 数组和链表之间。

 

先看一个摘自网上的图: 

hash表,radix_tree,红黑树,B+树比较_第1张图片

首先,它们的程序在不同程度上比数组和链表的复杂;其次哈希表要求预先知道要存储多少数据,数据对存储空间的利用率也不是非常高。普通的二叉树对顺序的数据来说,会变成缓慢的O(N)级操作;而平衡树编起来显然较为困难。(来自http://hi.baidu.com/haifengjava/blog/item/2e4fc624d974cc0b4d088d13.html)

 

 

 

在取hash数组的id的过程中,利用商,或者余数得到id。利用哪个主要是看是否可以减少对同一个hash链的并发操作,减少锁的竞争,比如你的数据全部都是顺序来的,这时最好用商,因为用余数得到hash的id,会引起更多的并发。

 

 

内核的list_head,rb_node 都可以被嵌入到相应的数据结构中。 

注意: 如果你想让该结构挂在2个不同的链表中(树),你应该在你的数据结构中应该有2个list_head(rb_node)。

 

在linux中,管理page_cache是利用radix_tree实现的。 radix_tree因为分叉比较多,所以树比较矮,因此查找很快。

 

在linux中,它的非叶节点是一种radix_tree_node结构,叶节点是一个page结构。radix_tree_node包含一个64长度的数组,用来存放叶节点或者非叶节点。每个被插入的page,都有一个index,用来标识这个page应该被插入的位置。比如当这棵树只有一层的时候,根据index的值,将page插入64数组的index位置就可以了(这时index要小于64)。在某个时刻,这棵树可以接受的最大index为pow(2,6*height)。page 的index在树中是这样解释的,index的二进制表示的最高6个有效位,标明在第一层数组中位置。接下来的6个有效位标明下一层的数组位置,以此下去。在linux中标明第一层的是最高有效位的前2位,因为现在是32位的地址。(来自http://longxj.javaeye.com/blog/570535)

 

 

Linux内核用到的Radix Tree:

原文:  http://wurong81.spaces.live.com/blog/cns!5EB4A630986C6ECC!393.entry

 

B树,B+树,B-树,B*树原理

原文: http://gongstring.javaeye.com/blog/768316

 

在实际使用(11叉)B+树的过程中,发现B+树占据的内存竟然比在其中挂的数据的内存都要多。很是不解,不知道其它人使用b+树,统计过非数据节点占用的内存没有?

 

红黑树。

它是内核中使用的比较广发的一种树。目前知道它和链表一起管理mm_struct中的vm_area_struct。

因为rb_node是嵌入到我们的数据结构中的。即: 每个数据对应一个rb_node。所以当你的数据占用内存比rb_node 占的内存多时,可以使用rb_node。

 

红黑树的原理可以参看 百度。。。。http://baike.baidu.com/view/133754.htm

你可能感兴趣的:(数据结构,linux,list,struct,tree,linux内核)