b树与b+树的区别_一文详解 B-树,B+树,B*树
B-樹
B-樹是一種多路搜索樹(并不一定是二叉的)
1970年,R.Bayer和E.mccreight提出了一種適用于外查找的樹,它是一種平衡的多叉樹,稱為B樹(或B-樹、B_樹)。
一棵m階B樹(balanced tree of order m)是一棵平衡的m路搜索樹。它或者是空樹,或者是滿足下列性質的樹:
1、根結點至少有兩個子女;
2、每個非根節點所包含的關鍵字個數 j 滿足:┌m/2┐ - 1 <= j <= m - 1;
3、除根結點以外的所有結點(不包括葉子結點)的度數正好是關鍵字總數加1,故內部子樹個數 k 滿足:┌m/2┐ <= k <= m ;
4、所有的葉子結點都位于同一層。
特點:
是一種多路搜索樹(并不是二叉的):
1.定義任意非葉子結點最多只有M個兒子;且M>2;
2.根結點的兒子數為[2, M];
3.除根結點以外的非葉子結點的兒子數為[M/2, M];
4.每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)
5.非葉子結點的關鍵字個數=指向兒子的指針個數-1;
6.非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
7.非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小于K[1]的
子樹,P[M]指向關鍵字大于K[M-1]的子樹,其它P[i]指向關鍵字屬于(K[i-1], K[i])的子樹;
8.所有葉子結點位于同一層;
如:(M=3)
B-樹的搜索,從根結點開始,對結點內的關鍵字(有序)序列進行二分查找,如果
命中則結束,否則進入查詢關鍵字所屬范圍的兒子結點;重復,直到所對應的兒子指針為
空,或已經是葉子結點;
B-樹的特性:
1.關鍵字集合分布在整顆樹中;
2.任何一個關鍵字出現且只出現在一個結點中;
3.搜索有可能在非葉子結點結束;
4.其搜索性能等價于在關鍵字全集內做一次二分查找;
5.自動層次控制;
B+樹
B+ 樹是一種樹數據結構,是一個n叉樹,每個節點通常有多個孩子,一棵B+樹包含根節點、內部節點和葉子節點。根節點可能是一個葉子節點,也可能是一個包含兩個或兩個以上孩子節點的節點。
用途:
B+ 樹通常用于數據庫和操作系統的文件系統中。NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等文件系統都在使用B+樹作為元數據索引。B+ 樹的特點是能夠保持數據穩定有序,其插入與修改擁有較穩定的對數時間復雜度。B+ 樹元素自底向上插入。
B+樹的定義
B+樹是應文件系統所需而出的一種B-樹的變型樹。一棵m階的B+樹和m階的B-樹的差異在于:
1.有n棵子樹的結點中含有n個關鍵字,每個關鍵字不保存數據,只用來索引,所有數據都保存在葉子節點。
2.所有的葉子結點中包含了全部關鍵字的信息,及指向含這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序鏈接。
3.所有的非終端結點可以看成是索引部分,結點中僅含其子樹(根結點)中的最大(或最小)關鍵字。
通常在B+樹上有兩個頭指針,一個指向根結點,一個指向關鍵字最小的葉子結點。
B+樹是B-樹的變體,也是一種多路搜索樹:
1.其定義基本與B-樹同,除了:
2.非葉子結點的子樹指針與關鍵字個數相同;
3.非葉子結點的子樹指針P[i],指向關鍵字值屬于[K[i], K[i+1])的子樹
(B-樹是開區間);
5.為所有葉子結點增加一個鏈指針;
6.所有關鍵字都在葉子結點出現;
如:(M=3)
B+的搜索與B-樹也基本相同,區別是B+樹只有達到葉子結點才命中(B-樹可以在
非葉子結點命中),其性能也等價于在關鍵字全集做一次二分查找;
B+的特性:
1.所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好
是有序的;
2.不可能在非葉子結點命中;
3.非葉子結點相當于是葉子結點的索引(稀疏索引),葉子結點相當于是存儲
(關鍵字)數據的數據層;
4.更適合文件索引系統;
B*樹:
是B+樹的變體,在B+樹的非根和非葉子結點再增加指向兄弟的指針;
B*樹定義了非葉子結點關鍵字個數至少為(2/3)*M,即塊的最低使用率為2/3
(代替B+樹的1/2);
B+樹的分裂:當一個結點滿時,分配一個新的結點,并將原結點中1/2的數據
復制到新結點,最后在父結點中增加新結點的指針;B+樹的分裂只影響原結點和父
結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針;
B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那么將一部分
數據移到兄弟結點中,再在原結點插入關鍵字,最后修改父結點中兄弟結點的關鍵字
(因為兄弟結點的關鍵字范圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之
間增加新結點,并各復制1/3的數據到新結點,最后在父結點增加新結點的指針;
所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高;
小結:
B-樹:
多路搜索樹,每個結點存儲M/2到M個關鍵字,非葉子結點存儲指向關鍵
字范圍的子結點;
所有關鍵字在整顆樹中出現,且只出現一次,非葉子結點可以命中;
B+樹:
在B-樹基礎上,為葉子結點增加鏈表指針,所有關鍵字都在葉子結點
中出現,非葉子結點作為葉子結點的索引;B+樹總是到葉子結點才命中;
B*樹:
在B+樹基礎上,為非葉子結點也增加鏈表指針,將結點的最低利用率
從1/2提高到2/3;
B-樹,B+樹,B*樹 總結對比
首先注意:B樹就是B-樹,"-"是個連字符號,不是減號。
B-樹是一種平衡的多路查找(又稱排序)樹,在文件系統中有所應用。主要用作文件的索引。其中的B就表示平衡(Balance) B+樹有一個最大的好處,方便掃庫,B樹必須用中序遍歷的方法按序掃庫,而B+樹直接從葉子結點挨個掃一遍就完了。 B+樹支持range-query(區間查詢)非常方便,而B樹不支持。這是數據庫選用B+樹的最主要原因。
比如要查 5-10之間的,B+樹一把到5這個標記,再一把到10,然后串起來就行了,B樹就非常麻煩。B樹的好處,就是成功查詢特別有利,因為樹的高度總體要比B+樹矮。不成功的情況下,B樹也比B+樹稍稍占一點點便宜。
B樹的優勢是當你要查找的值恰好處在一個非葉子節點時,查找到該節點就會成功并結束查詢,而B+樹由于非葉節點只是索引部分,這些節點中只含有其子樹中的最大(或最小)關鍵字,當非終端節點上的關鍵字等于給點值時,查找并不終止,而是繼續向下直到葉子節點。因此在B+樹中,無論查找成功與否,都是走了一條從根到葉子節點的路徑。
有很多基于頻率的搜索是選用B樹,越頻繁query的結點越往根上走,前提是需要對query做統計,而且要對key做一些變化。
另外B樹也好B+樹也好,根或者上面幾層因為被反復query,所以這幾塊基本都在內存中,不會出現讀磁盤IO,一般已啟動的時候,就會主動換入內存。 mysql底層存儲是用B+樹實現的,因為內存中B+樹是沒有優勢的,但是一到磁盤,B+樹的威力就出來了。 B*樹
是B+樹的變體,在B+樹的非根和非葉子結點再增加指向兄弟的指針;B*樹定義了非葉子結點關鍵字個數至少為(2/3)*M,即塊的最低使用率為2/3(代替B+樹的1/2);
B+樹的分裂:當一個結點滿時,分配一個新的結點,并將原結點中1/2的數據復制到新結點,最后在父結點中增加新結點的指針;B+樹的分裂只影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針;
B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那么將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最后修改父結點中兄弟結點的關鍵字(因為兄弟結點的關鍵字范圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,并各復制1/3的數據到新結點,最后在父結點增加新結點的指針; 所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高;
總結
以上是生活随笔為你收集整理的b树与b+树的区别_一文详解 B-树,B+树,B*树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pygame下载
- 下一篇: c语言占用cpu的程序,Windows下