原文連接:面試官問你B樹和B+樹,就把這篇文章丟給他html
在介紹B+樹以前, 先簡單的介紹一下B樹,這兩種數據結構既有類似之處,也有他們的區別,最後,咱們也會對比一下這兩種數據結構的區別。面試
B樹也稱B-樹,它是一顆多路平衡查找樹。二叉樹我想你們都不陌生,其實,B樹和後面講到的B+樹也是從最簡單的二叉樹變換而來的,並無什麼神祕的地方,下面咱們來看看B樹的定義。數據庫
因此,根節點的關鍵字數量範圍:1 <= k="" <="m-1,非根節點的關鍵字數量範圍:
數據結構m/2 <= k="" <="m-1。
另外,咱們須要注意一個概念,描述一顆B樹時須要指定它的階數,階數表示了一個節點最多有多少個孩子節點,通常用字母m表示階數。性能
咱們再舉個例子來講明一下上面的概念,好比這裏有一個5階的B樹,根節點數量範圍:1 <= k="" <="4,非根節點數量範圍:2"> 3d
下面,咱們經過一個插入的例子,講解一下B樹的插入過程,接着,再講解一下刪除關鍵字的過程。指針
插入的時候,咱們須要記住一個規則:判斷當前結點key的個數是否小於等於m-1,若是知足,直接插入便可,若是不知足,將節點的中間的key將這個節點分爲左右兩部分,中間的節點放到父節點中便可。code
例子:在5階B樹中,結點最多有4個key,最少有2個key(注意:下面的節點統一用一個節點表示key和value)。cdn
插入22時,發現這個節點的關鍵字已經大於4了,因此須要進行分裂,分裂的規則在上面已經講了,分裂以後,以下。htm
分裂,獲得下面的。
更過的插入的過程就很少介紹了,相信有這個例子你已經知道怎麼進行插入操做了。
B樹的刪除操做相對於插入操做是相對複雜一些的,可是,你知道記住幾種狀況,同樣能夠很輕鬆的掌握的。
m/2
,這種狀況只要直接刪除便可。 此時發現26所在的節點只有一個元素,小於2個(m/2),這個節點不符合要求,這時候的規則(向兄弟節點借元素):若是刪除葉子節點,若是刪除元素後元素個數少於(m/2),而且它的兄弟節點的元素大於(m/2),也就是說兄弟節點的元素比最少值m/2還多,將先將父節點的元素移到該節點,而後將兄弟節點的元素再移動到父節點。這樣就知足要求了。
咱們看看操做過程就更加明白了。
移動以後,跟兄弟節點合併。
刪除就只有上面的幾種狀況,根據不一樣的狀況進行刪除便可。
上面的這些介紹,相信對於B樹已經有必定的瞭解了,接下來的一部分,咱們接着講解B+樹,我相信加上B+樹的對比,就更加清晰明瞭了。
B+樹其實和B樹是很是類似的,咱們首先看看相同點。
不一樣點。
下面咱們看一個B+樹的例子,感覺感覺它吧!
對於插入操做很簡單,只須要記住一個技巧便可:當節點元素數量大於m-1的時候,按中間元素分裂成左右兩部分,中間元素分裂到父節點當作索引存儲,可是,自己中間元素仍是分裂右邊這一部分的。
下面以一顆5階B+樹的插入過程爲例,5階B+樹的節點最少2個元素,最多4個元素。
有了這幾個例子,相信插入操做沒什麼問題了,下面接着看看刪除操做。
對於刪除操做是比B樹簡單一些的,由於葉子節點有指針的存在,向兄弟節點借元素時,不須要經過父節點了,而是能夠直接經過兄弟節移動便可(前提是兄弟節點的元素大於m/2),而後更新父節點的索引;若是兄弟節點的元素不大於m/2(兄弟節點也沒有多餘的元素),則將當前節點和兄弟節點合併,而且刪除父節點中的key,下面咱們看看具體的實例。
這樣,B+樹的刪除操做也就完成了,是否是看完以後,以爲很是簡單!
B+樹相對於B樹有一些本身的優點,能夠歸結爲下面幾點。