深入理解B 樹與B 樹

2021-10-12 00:01:01 字數 2644 閱讀 3449

在看這篇文章之前,我們回顧一下前面的幾篇關於mysql的文章,應該對你讀下面的文章有所幫助。

在介紹b+樹之前, 先簡單的介紹一下b樹,這兩種資料結構既有相似之處,也有他們的區別,最後,我們也會對比一下這兩種資料結構的區別。

1.1 b樹概念

b樹也稱b-樹,它是一顆多路平衡查詢樹。二叉樹我想大家都不陌生,其實,b樹和後面講到的b+樹也是從最簡單的二叉樹變換而來的,並沒有什麼神秘的地方,下面我們來看看b樹的定義。

所以,根節點的關鍵字數量範圍:1 <= k <= m-1,非根節點的關鍵字數量範圍:m/2 <= k <= m-1

另外,我們需要注意乙個概念,描述一顆b樹時需要指定它的階數,階數表示了乙個節點最多有多少個孩子節點,一般用字母m表示階數。

我們再舉個例子來說明一下上面的概念,比如這裡有乙個5階的b樹,根節點數量範圍:1 <= k <= 4,非根節點數量範圍:2 <= k <= 4。

下面,我們通過乙個插入的例子,講解一下b樹的插入過程,接著,再講解一下刪除關鍵字的過程。

1.2 b樹插入

插入的時候,我們需要記住乙個規則:判斷當前結點key的個數是否小於等於m-1,如果滿足,直接插入即可,如果不滿足,將節點的中間的key將這個節點分為左右兩部分,中間的節點放到父節點中即可。

例子:在5階b樹中,結點最多有4個key,最少有2個key(注意:下面的節點統一用乙個節點表示key和value)。

插入22時,發現這個節點的關鍵字已經大於4了,所以需要進行**,**的規則在上面已經講了,**之後,如下。

**,得到下面的。

更過的插入的過程就不多介紹了,相信有這個例子你已經知道怎麼進行插入操作了。

1.3 b樹的刪除操作

b樹的刪除操作相對於插入操作是相對複雜一些的,但是,你知道記住幾種情況,一樣可以很輕鬆的掌握的。

此時發現26所在的節點只有乙個元素,小於2個(m/2),這個節點不符合要求,這時候的規則(向兄弟節點借元素):如果刪除葉子節點,如果刪除元素後元素個數少於(m/2),並且它的兄弟節點的元素大於(m/2),也就是說兄弟節點的元素比最少值m/2還多,將先將父節點的元素移到該節點,然後將兄弟節點的元素再移動到父節點。這樣就滿足要求了。

我們看看操作過程就更加明白了。

移動之後,跟兄弟節點合併。

刪除就只有上面的幾種情況,根據不同的情況進行刪除即可。

上面的這些介紹,相信對於b樹已經有一定的了解了,接下來的一部分,我們接著講解b+樹,我相信加上b+樹的對比,就更加清晰明了了。

2.1 b+樹概述

b+樹其實和b樹是非常相似的,我們首先看看相同點

不同點

下面我們看乙個b+樹的例子,感受感受它吧!

2.2 插入操作

對於插入操作很簡單,只需要記住乙個技巧即可:當節點元素數量大於m-1的時候,按中間元素**成左右兩部分,中間元素**到父節點當做索引儲存,但是,本身中間元素還是**右邊這一部分的

下面以一顆5階b+樹的插入過程為例,5階b+樹的節點最少2個元素,最多4個元素。

有了這幾個例子,相信插入操作沒什麼問題了,下面接著看看刪除操作。

2.3 刪除操作

對於刪除操作是比b樹簡單一些的,因為葉子節點有指標的存在,向兄弟節點借元素時,不需要通過父節點了,而是可以直接通過兄弟節移動即可(前提是兄弟節點的元素大於m/2),然後更新父節點的索引;如果兄弟節點的元素不大於m/2(兄弟節點也沒有多餘的元素),則將當前節點和兄弟節點合併,並且刪除父節點中的key,下面我們看看具體的例項。

這樣,b+樹的刪除操作也就完成了,是不是看完之後,覺得非常簡單!

b+樹相對於b樹有一些自己的優勢,可以歸結為下面幾點。

深入理解B樹和B 樹 二 B 樹的優點

有了b樹,為什麼還需要b 樹呢?那就要先說下b樹的缺點了,人類對於效能的追求是無止境的,b樹相比二叉樹雖好,但還是存在以下問題 1.每個節點中既要存索引資訊,又要存其對應的資料,如果資料很大,那麼當樹的體量很大時,每次讀到記憶體中的樹的資訊就會不太夠。2.b樹遍歷整個樹的過程和二叉樹本質上是一樣的,...

紅黑樹,B樹,B 樹,B 樹 理解

紅黑樹rbtree 二叉排序樹 map 就是採用紅黑樹儲存的,紅黑樹 rb tree 是平衡二叉樹,其優點就是樹到葉子節點深度一致,查詢的效率也就一樣,為logn.在實行查詢,插入,刪除的效率都一致,而當是全部靜態資料時,沒有太多優勢,可能採用hash表各合適。hash map是乙個hash tab...

b樹與b 樹原理解析

b樹 balance tree 和b 樹應用在資料庫索引,可以認為是m叉的多路平衡查詢樹,但是從理論上講,二叉樹查詢速度和比較次數都是最小的,為什麼不用二叉樹呢?因為我們要考慮磁碟io的影響,它相對於記憶體來說是很慢的。資料庫索引是儲存在磁碟上的,當資料量大時,就不能把整個索引全部載入到記憶體了,只...