【數據結構】對B-樹、B+樹與B*樹的簡單瞭解

一、【B-樹】
一棵M階(M>2)的B樹,是一棵平衡的M路平衡搜索樹,可以是空樹或者滿足以下性質:
1.根節點至少有兩個孩子。
2.每個非根節點至少有M/2(上取整)個孩子,至多有M個孩子。
3.每個非根節點至少有M/2-1(上取整)個關鍵字,至多有M-1個關鍵字,並且以升序排列。
4.key[i]和key[i+1]之間的孩子節點的值介於key[i]、key[i+1]之間。
5.所有的葉子節點都在同一層。
這裏寫圖片描述

二、【B+樹】
B+樹是B-樹的變體,也是一種多路搜索樹:
1.其定義基本與B-樹同,除了以下幾點:
2.非葉子節點的子樹指針與關鍵字個數相同;
3.非葉子節點的子樹指針p[i],指向關鍵字值屬於[K[i],K[i+1]]的子樹(B-樹是開區間);
4.爲所有葉子節點增加一個鏈指針;
5.所有關鍵字都在葉子節點出現;
這裏寫圖片描述

B+的搜索樹與B-樹也基本相同,區別是B+樹只有達到葉子節點才命中(B-數可以在非葉子節點命中),其性能也等價於在關鍵字全集做一次二分查找;

【B+的特性】:
1.所有關鍵字都出現在葉子節點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的。
2.不可能在非葉子節點命中。
3.非葉子節點相當於是葉子節點的索引(稀疏索引),葉子節點相當於是存儲(關鍵字)數據的數據層。
4.更適合文件索引系統。

三、【B*樹】
B*樹是B+樹的變體,在B+樹的非根和非葉子結點再增加指向兄弟的指針。
這裏寫圖片描述
1. B*樹定義了非葉子結點關鍵字個數至少爲(2/3) *M,即塊的最低使用率爲2/3(代替B+樹的1/2)。
2. B+樹的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的數據複製到新節點,最後在父親結點中增加新節點的指針;B+樹的分裂隻影響原結點和父節點,而不會影響兄弟結點,所以它不需要指向兄弟的指針。
3. B*樹的分裂:當一個節點滿時,如果它的下一個兄弟結點未滿,那麼將一部分數據移到兄弟節點中,再在原結點插入關鍵字,最後修改父節點中兄弟節點的關鍵字(因爲兄弟節點的關鍵字範圍改變了);如果兄弟也滿了,則在原結點與兄弟節點之間增加新節點,並各複製1/3的數據到新節點,最後在父節點增加新節點的指針;
4. 從上可知B*樹分配新節點的概率比B+樹要低,空間使用率更高。

【總結】
(1)B-樹:多路搜索樹,每個節點存儲M/2到M個關鍵字,非葉子結點存儲指向關鍵字範圍的子節點;所有關鍵字在整棵樹中出現,且只出現一次,非葉子結點可以命中;
(2)B+樹:在B-樹基礎上,爲葉子節點增加鏈表指針,所有關鍵字都在葉子節點中出現,非葉子結點作爲葉子節點的索引;B+樹總是到葉子節點才命中。
(3)B*樹:在B+樹基礎上,爲非葉子節點也增加鏈表指針,將節點的最低利用率從1/2提高到2/3;

【】爲什麼使用B-Tree:一般來說,索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲在磁盤上,這樣的話,索引查找過程中就要產生磁盤I/O消耗,相對於內存存取,I/O存取的消耗要高几個數量級,所以評價一個數據結構作爲索引的優劣最重要的指標就是在查找過程中磁盤I/O操作次數的漸進複雜度。換句話說,索引的結構組織要儘量減少查找過程中磁盤I/O的存取次數。下面先介紹內存和磁盤存取原理,然後再結合這些原理分析B-/+Tree作爲索引的效率。

發佈了70 篇原創文章 · 獲贊 92 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章