b樹(shù)和b+樹(shù)的區(qū)別

一,b樹(shù)

b樹(shù)(balance tree)和b+樹(shù)應(yīng)用在數(shù)據(jù)庫(kù)索引,可以認(rèn)為是m叉的多路平衡查找樹(shù),但是從理論上講,二叉樹(shù)查找速度和比較次數(shù)都是最小的,為什么不用二叉樹(shù)呢?

因?yàn)槲覀円紤]磁盤IO的影響,它相對(duì)于內(nèi)存來(lái)說(shuō)是很慢的。數(shù)據(jù)庫(kù)索引是存儲(chǔ)在磁盤上的,當(dāng)數(shù)據(jù)量大時(shí),就不能把整個(gè)索引全部加載到內(nèi)存了,只能逐一加載每一個(gè)磁盤頁(yè)(對(duì)應(yīng)索引樹(shù)的節(jié)點(diǎn))。所以我們要減少IO次數(shù),對(duì)于樹(shù)來(lái)說(shuō),IO次數(shù)就是樹(shù)的高度,而“矮胖”就是b樹(shù)的特征之一,它的每個(gè)節(jié)點(diǎn)最多包含m個(gè)孩子,m稱為b樹(shù)的階,m的大小取決于磁盤頁(yè)的大小。

█一個(gè)M階的b樹(shù)具有如下幾個(gè)特征:

定義任意非葉子結(jié)點(diǎn)最多只有M個(gè)兒子,且M>2;

根結(jié)點(diǎn)的兒子數(shù)為[2, M];

除根結(jié)點(diǎn)以外的非葉子結(jié)點(diǎn)的兒子數(shù)為[M/2, M],向上取整;

非葉子結(jié)點(diǎn)的關(guān)鍵字個(gè)數(shù)=兒子數(shù)-1;

所有葉子結(jié)點(diǎn)位于同一層;

k個(gè)關(guān)鍵字把節(jié)點(diǎn)拆成k+1段,分別指向k+1個(gè)兒子,同時(shí)滿足查找樹(shù)的大小關(guān)系。

█有關(guān)b樹(shù)的一些特性,注意與后面的b+樹(shù)區(qū)分:

關(guān)鍵字集合分布在整顆樹(shù)中;

任何一個(gè)關(guān)鍵字出現(xiàn)且只出現(xiàn)在一個(gè)結(jié)點(diǎn)中;

搜索有可能在非葉子結(jié)點(diǎn)結(jié)束;

其搜索性能等價(jià)于在關(guān)鍵字全集內(nèi)做一次二分查找;

█如圖是一個(gè)3階b樹(shù),順便講一下查詢?cè)?的過(guò)程:


1,第一次磁盤IO,把9所在節(jié)點(diǎn)讀到內(nèi)存,把目標(biāo)數(shù)5和9比較,小,找小于9對(duì)應(yīng)的節(jié)點(diǎn);


2,第二次磁盤IO,還是讀節(jié)點(diǎn)到內(nèi)存,在內(nèi)存中把5依次和2、6比較,定位到2、6中間區(qū)域?qū)?yīng)的節(jié)點(diǎn);

3,第三次磁盤IO就不上圖了,跟第二步一樣,然后就找到了目標(biāo)5。

可以看到,b樹(shù)在查詢時(shí)的比較次數(shù)并不比二叉樹(shù)少,尤其是節(jié)點(diǎn)中的數(shù)非常多時(shí),但是內(nèi)存的比較速度非???,耗時(shí)可以忽略,所以只要樹(shù)的高度低,IO少,就可以提高查詢性能,這是b樹(shù)的優(yōu)勢(shì)之一。

█b樹(shù)的插入刪除元素操作:

比如我們要在下圖中插入元素4:


1,首先自頂向下查詢找到4應(yīng)該在的位置,即3、5之間;

2,但是3階b樹(shù)的節(jié)點(diǎn)最多只能有2個(gè)元素,所以把3、4、5里面的中間元素4上移(中間元素上移是插入操作的關(guān)鍵);

3,上一層節(jié)點(diǎn)加入4之后也超載了,繼續(xù)中間元素上移的操作,現(xiàn)在根節(jié)點(diǎn)變成了4、9;

4,還要滿足查找樹(shù)的性質(zhì),所以對(duì)元素進(jìn)行調(diào)整以滿足大小關(guān)系,始終維持多路平衡也是b樹(shù)的優(yōu)勢(shì),最后變成這樣:


再比如我們要?jiǎng)h除元素11:

1,自頂向下查詢到11,刪掉它;

2,然后不滿足b樹(shù)的條件了,因?yàn)樵?2所在的節(jié)點(diǎn)只有一個(gè)孩子了,所以我們要“左旋”,元素12下來(lái),元素13上去:


這時(shí)如果再刪除15呢?很簡(jiǎn)單,當(dāng)元素個(gè)數(shù)太少以至于不能再旋轉(zhuǎn)時(shí),12直接上去就行了。

二,b+樹(shù)

b+樹(shù),是b樹(shù)的一種變體,查詢性能更好。m階的b+樹(shù)的特征:

1、有n棵子樹(shù)的非葉子結(jié)點(diǎn)中含有n個(gè)關(guān)鍵字(b樹(shù)是n-1個(gè)),這些關(guān)鍵字不保存數(shù)據(jù),只用來(lái)索引,所有數(shù)據(jù)都保存在葉子節(jié)點(diǎn)(b樹(shù)是每個(gè)關(guān)鍵字都保存數(shù)據(jù))。

2、所有的葉子結(jié)點(diǎn)中包含了全部關(guān)鍵字的信息,及指向含這些關(guān)鍵字記錄的指針,且葉子結(jié)點(diǎn)本身依關(guān)鍵字的大小自小而大順序鏈接。

3、所有的非葉子結(jié)點(diǎn)可以看成是索引部分,結(jié)點(diǎn)中僅含其子樹(shù)中的最大(或最?。╆P(guān)鍵字。

4、通常在b+樹(shù)上有兩個(gè)頭指針,一個(gè)指向根結(jié)點(diǎn),一個(gè)指向關(guān)鍵字最小的葉子結(jié)點(diǎn)。

5、同一個(gè)數(shù)字會(huì)在不同節(jié)點(diǎn)中重復(fù)出現(xiàn),根節(jié)點(diǎn)的最大元素就是b+樹(shù)的最大元素。


█b+樹(shù)相比于b樹(shù)的查詢優(yōu)勢(shì):

1、b+樹(shù)的中間節(jié)點(diǎn)不保存數(shù)據(jù),所以磁盤頁(yè)能容納更多節(jié)點(diǎn)元素,更“矮胖”;

2、b+樹(shù)查詢必須查找到葉子節(jié)點(diǎn),b樹(shù)只要匹配到即可不用管元素位置,因此b+樹(shù)查找更穩(wěn)定(并不慢);

3、對(duì)于范圍查找來(lái)說(shuō),b+樹(shù)只需遍歷葉子節(jié)點(diǎn)鏈表即可,b樹(shù)卻需要重復(fù)地中序遍歷,如下兩圖:


原文參考:

---------------------

作者:login_sonata

來(lái)源:CSDN

原文:https://blog.csdn.net/login_sonata/article/details/75268075

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文鏈接 B樹(shù) 1.前言: 動(dòng)態(tài)查找樹(shù)主要有:二叉查找樹(shù)(Binary Search Tree),平衡二叉查找樹(shù)(...
    非典型程序員閱讀 1,258評(píng)論 0 3
  • B樹(shù) 1.前言: 動(dòng)態(tài)查找樹(shù)主要有:二叉查找樹(shù)(Binary Search Tree),平衡二叉查找樹(shù)(Balan...
    鐵甲依然在_978f閱讀 1,527評(píng)論 0 4
  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系,并對(duì)這種結(jié)構(gòu)定義相應(yīng)的運(yùn)算,而且確保經(jīng)過(guò)這...
    Winterfell_Z閱讀 6,601評(píng)論 0 13
  • 參考:B樹(shù)和B+樹(shù)的總結(jié)B樹(shù)、B-樹(shù)、B+樹(shù)、B*樹(shù)都是什么 總結(jié) 利用平衡樹(shù)的優(yōu)勢(shì)加快查詢的穩(wěn)定性和速度;B+樹(shù)...
    小小少年Boy閱讀 58,843評(píng)論 8 77
  • 多少風(fēng)起云,淡泊似人生; 田間鄉(xiāng)村道,遍灑愛(ài)歡騰。 夫唱婦來(lái)隨,情愛(ài)共結(jié)晶; 孩兒多歡笑,鄉(xiāng)野播春情。
    花蔓情緣閱讀 577評(píng)論 0 3

友情鏈接更多精彩內(nèi)容