B+樹的幾點總結

本文主要以列表形式將B+樹的特點以及注意點等列出來,主要參考《算法導論》、維基百科、各大博客的內容,結合自己的理解寫的,如內容有不當之處,請各位雅正。 出處:http://blog.csdn.net/love_u_u12138 轉載請注明出處。

1.前言

B樹是為磁盤或其他直接存取的輔助存儲設備而設計的一種平衡搜索樹。B樹類似于紅黑樹,但它們在降低磁盤I/O操作數方面要更好一些?,F在許多數據庫系統使用B樹或者B樹的變種(B+樹和B*樹)來存儲信息。B樹用的比較普遍,許多書籍、博客都有詳細的介紹,對于B樹的嚴格定義也相對統一,在這里就不予贅述。 B+樹是B樹的一種變形,它把所有的衛星數據都存儲在葉節點中,內部節點只存放關鍵字和孩子指針,因此最大化了內部節點的分支因子,所以B+樹的遍歷也更加高效(B樹需要以中序的方式遍歷節點,而B+樹只需把所有葉子節點串成鏈表就可以從頭到尾遍歷)。

以下先放一張我所依據的B+樹的圖示(這張圖有所簡化,下面講完定義后會貼一張更加詳細的圖,兩圖本質并無差異):
B+樹的圖示

2.定義

B+樹的定義我沒有找到官方的定義(如果有找到的人望告知我),有些定義在論壇還有爭議,但是這些并沒有多大影響,只是一點小小的差異,下面的定義中有涉及爭議的部分我會提及。

B+樹的定義如下:

每個節點node有下面的屬性: n個關鍵字key[1],key[2], … ,key[n],以非降序存放,使得key[1]≤key[2]≤…≤key[n];
isRoot,一個布爾值,如果node是根節點,則為TRUE;否則為FALSE;
isLeaf,一個布爾值,如果node是葉子節點,則為TRUE;否則為FALSE;
Node*類型的parent指針,指向該節點的父節點

每個內部節點還包含n個
指向其孩子children[0],children[1], … , children[n],葉子節點沒有孩子。(注:此處有爭議,B+樹到底是與B 樹n-1個關鍵字有n棵子樹保持一致,還是B+樹n個關鍵字的結點中含有n棵子樹;兩種定義都可以,只要自己實現的時候統一用一種就行。如無特殊說明,以下的都是后者:即n個關鍵字對應n棵子樹);
內部節點的關鍵字對存儲在各子樹中的關鍵字范圍加以分割:如果key[i]為任意一個存儲在內部節點中的關鍵字,childNum[i]為該節點的對應下標的子樹指針指向的節點的任意一個關鍵字,那么 key[1] ≤ childNum[1] < key[2] ≤ childNum[2] < key[3] ≤ childNum[3] < … < key[n] ≤ childNum[n]
內部節點并不存儲真正的信息,而是保存其葉子節點的最小值作為索引。比如下圖,標注1和標注2都是內部節點,里面保存的并不是真正的信息,而是標注3所示的節點中的最小值。(注:此處有爭議以最大值作為索引,同樣也是不影響的爭議)

內部節點圖示

任何和關鍵字相聯系的**“衛星數據(satellite information)” **將與關鍵字一樣存放在葉子節點中,一般地,可能只是為每個關鍵字對應的”衛星數據”存放一個指針,指針指向存放實際數據的磁盤頁,匹配了某個葉子節點的關鍵字即可通過該指針找到其他對應數據。

每個葉子節點還有指向下一個節點的指針next,方便遍歷整棵B+樹。
每個葉子節點具有相同的深度,即樹的高度h。
每個節點所包含的關鍵字個數有上界和下界,用一個被B+樹的最小度數(minmum degree)的固定整數t≥2來表示這些界: 除了根節點以外的每個節點必須至少有t個關鍵字。因此,除了根節點以外的每個內部節點至少有t個孩子
每個節點至多有2t個關鍵字,因此,一個內部節點至多可有2t個孩子。當一個節點恰好有2t個關鍵字時,稱該節點是滿的。

結合以上的具體定義,下面這張圖更加詳細的描述了一棵具體的B+樹

B+樹圖示

3.注意點

在B+樹的學習與實現過程中,也遇到不少的疑惑之處,現記錄如下,持續更新:
內部節點并不存儲真正的信息,而是保存其葉子節點的最小值作為索引。每次插入刪除都進行更新(此時用到parent指針),保持最新狀態。
關于所有葉子節點都處于同一深度是如何實現的?這與B+樹具體的插入和刪除算法有關。簡單解釋一下插入時的情況,根據插入值的大小,逐步向下直到對應的葉子節點。如果葉子節點關鍵字個數小于2t,則直接插入值或者更新衛星數據;如果插入之前葉子節點已經滿了,則分裂該葉子節點成兩半,并把中間值提上到父節點的關鍵字中,如果這導致父節點滿了的話,則把該父節點分裂,如此遞歸向上。所以樹高是一層層的增加的,葉子節點永遠都在同一深度。下面是我實現的B+樹中的插入代碼的片段:

public void insert(Comparable key, Object obj, BPlusTree tree)
{
    // 葉子節點則插入
    if (isLeaf) {
        // 不需要分裂直接插入
        if (containsKeyword(key) || keywords.size() < tree.getDegree()) {
            insertInNotFull(key, obj);
            // 直接插入
            if (parent != null) {
                parent.updateAfterInsert(tree);     // 更新父節點的信息(將最小的值存到父節點的關鍵字中作為索引)
            }
        } else {    // 需要分裂成左右兩個節點
            splitNode(key, obj, tree);
        }
    } else {        // 如果不是葉子節點則繼續往下搜索
        Node leafNode = downToLeaf(key); // 逐步向下到對應的葉子節點
        leafNode.insert(key, obj, tree);
    }
}

4.結語

B+樹還有一個最大的好處,方便掃庫,B樹必須用中序遍歷的方法按序掃庫,而B+樹直接從葉子結點挨個掃一遍就完了,B+樹支持range-query非常方便,而B樹不支持。這是數據庫選用B+樹的最主要原因。

歡迎各位大牛批評指正。PS:我實現了一個小型B+樹系統,使用Java寫的,支持插入、搜索、遍歷B+樹,有需要的同學可以去下載。鏈接奉上:http://download.csdn.net/detail/love_u_u12138/9355677

參考文獻
[1].《算法導論》原書第3版中文版
[2].維基百科B+樹條目 https://zh.wikipedia.org/wiki/B%2B%E6%A0%91
[3].很詳細的一篇B樹、B+樹、R樹的博客 http://blog.csdn.net/v_july_v/article/details/6530142
[4].數據庫實現的扼要說明 http://www.ruanyifeng.com/blog/2014/07/database_implementation.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容

  • 本文主要以列表形式將B+樹的特點以及注意點等列出來,主要參考《算法導論》、維基百科、各大博客的內容,結合自己的理解...
    鐵甲依然在_978f閱讀 401評論 0 1
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結點至多有m個孩子。 除根結點和葉子結點外,其它每個結點至少有m...
    文檔隨手記閱讀 13,282評論 0 25
  • B樹 1.前言: 動態查找樹主要有:二叉查找樹(Binary Search Tree),平衡二叉查找樹(Balan...
    鐵甲依然在_978f閱讀 1,454評論 0 4
  • 原文鏈接 B樹 1.前言: 動態查找樹主要有:二叉查找樹(Binary Search Tree),平衡二叉查找樹(...
    非典型程序員閱讀 1,176評論 0 3
  • 感謝小蕓、呵呵·何的原畫支持
    點碩閱讀 777評論 0 10