1. 程式人生 > >hash表,radix_tree,紅黑樹,B+樹比較

hash表,radix_tree,紅黑樹,B+樹比較

如題,這幾種資料結構都是我們平時常用的資料結構。

hash連結串列: 本質上就是 陣列 + 連結串列

hash樹: 本質上就是 陣列 + 樹。這個樹可以是紅黑樹,B+樹,radix_tree等

因為每種資料結構都有自己的優點,缺點。hash連結串列的各種效能介於 陣列和連結串列之間,hash樹的各種效能介於 陣列和連結串列之間。

先看一個摘自網上的圖: 

陣列,連結串列,樹的比較

首先,它們的程式在不同程度上比陣列和連結串列的複雜;其次雜湊表要求預先知道要儲存多少資料,資料對儲存空間的利用率也不是非常高。普通的二叉樹對順序的資料來說,會變成緩慢的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:

B樹,B+樹,B-樹,B*樹原理

在實際使用(11叉)B+樹的過程中,發現B+樹佔據的記憶體竟然比在其中掛的資料的記憶體都要多。很是不解,不知道其它人使用b+樹,統計過非資料節點佔用的記憶體沒有?

紅黑樹。

它是核心中使用的比較廣發的一種樹。目前知道它和連結串列一起管理mm_struct中的vm_area_struct。

因為rb_node是嵌入到我們的資料結構中的。即: 每個資料對應一個rb_node。所以當你的資料佔用記憶體比rb_node 佔的記憶體多時,可以使用rb_node。