B 樹 、B+樹學習記錄

這裏只討論B樹(不要念B減樹)和B+樹的概念,插入、查詢、刪除、實現起來有點困難,後續有時間再加內容吧。

學習參考來自:鏈接 博客

 

以下來自:鏈接

B樹

前戲

我們大家都知道動態查找樹能夠提高查找效率,比如:二叉查找樹,平衡二叉查找樹,紅黑樹。他們查找效率的時間複雜度O(log2n),跟樹的深度有關係,那麼怎麼樣才能提高效率呢?當然最快捷的方式就是減少樹的深度了。那麼怎麼減少樹的深度呢?爲了解答這個問題,我們慢慢來看,先看個實際問題吧。

問題背景

在大型的數據庫存儲中,實現索引查找,如果採用二叉查找樹的查找的話,由於節點的存儲數據是有限的(不可能將節點存儲過多的數據,否則就變成線性的查找了),這樣如果數據量很大的,就會導致樹的深度過大從而造成磁盤IO操作過於頻繁(你們知道磁盤IO操作是非常耗時的),就會導致效率非常低下。可能有童鞋會問了,那爲什麼不把節點索引加載到內存中,這樣訪問不就快了嗎?其實這顯然是不可能完成的,因爲往往存儲的索引可能就有好幾個G了。全部加載到內存也是不現實的。能做的只有逐一加載每一個磁盤頁,這裏的磁盤頁就相當於索引樹的節點。

那怎麼解決呢?就回到了前面的那個問題,可以減少樹的深度。其中基本思想是:採用多叉樹結構。也就是說,因爲磁盤的操作費時費資源,如果過於頻繁的多次查找勢必效率低下。那麼如何提高效率,即如何避免磁盤過於頻繁的多次查找呢?根據磁盤查找存取的次數往往由樹的高度所決定,所以,只要我們通過某種較好的樹結構減少樹的結構儘量減少樹的高度,那麼是不是便能有效減少磁盤查找存取的次數呢?那這種有效的樹結構是一種怎樣的樹呢?

根據平衡二叉樹的啓發,自然就想到了平衡多路查找樹結構。也就是本文的主題B-tree,好了廢話不多說了,進入正題!

B-tree的簡介

B-樹就是我們平常說的B樹,不要讀成B減樹了,它在文件系統中很有用(原因之前已經介紹了),我們先來看下一個m階的Bs樹具有如下幾個特性:

  1. 根節點至少有兩個子女
  2. 每個中間節點都包含k-1個元素和k個孩子,其中m/2<=k<=m
  3. 每個葉子節點都包含k-1元素,其中m/2<=k<=m
  4. 所有的葉子節點都位於同一層
  5. 每個節點的元素從小到大排列,節點當中k-1個元素正好是k個孩子包含的元素的值域分劃。

簡介有點複雜,我嘗試用自己的語言解釋解釋。

1、好理解

2、中間的節點 如果有k個孩子節點,那麼必須有k-1個元素,這樣才能夠準確的根據大小找到孩子節點

3、每個葉子節點元素的數量在[m/2-1,m-1]的區間內

4、好理解

5、每個節點的  k-1個元素 從小到大的排序  k個區間 分別對應孩子節點的數值區間大小

 

B+樹

以下內容來自: 博客

 

麼是B+樹呢?在說B+樹之前我們先了解一下爲什麼要有B樹,其實這些樹最開始都是爲了解決某種系統中,查詢效率低的問題。B樹其實最開始源於的是二叉樹,二叉樹是隻有左右孩子的樹,當數據量越大的時候,二叉樹的節點越多,那麼當從根節點搜索的時候,影響查詢效率。所以如果這些節點存儲在外存儲器中的話,每訪問一個節點,相當於進行了一次I/O操作。

這裏面說下外存儲器和內存儲器:

   外存儲器:就是將數據存儲到磁盤中,每次查找的某個元素的時候都要取磁盤中查找,然後再寫入內存中,容量大,但是查詢效率低。

   內存儲器:就是將數據放在內存中,查詢快,但是容量小。

我們大致瞭解了B樹和什麼是外存儲器,內存儲器,那麼就知道其實B+樹就是爲了解決數據量大的時候存儲在外存儲器時候,查找效率低的問題。接下來就說下B+樹的特點:

  1. 中間元素不存數據,只是當索引用,所有數據都保存在葉子結點中。

  2. 所有的中間節點在子節點中要麼是最大的元素要麼是最小的元素 。

  3. 葉子結點包含所有的數據,和指向這些元素的指針,而且葉子結點的元素形成了自小向大這樣子的鏈表。

如下這個圖就很好的說明了B+的特點

      看圖其實可以看到一個節點可以存放多個數據,查找一個節點的時候可以有多個元素,大大提升查找效率,這就是爲什麼數據庫索引用的就是B+樹,因爲索引很大,不可能都放在內存中,所以通常是以索引文件的形式放在磁盤上,所以當查找數據的時候就會有磁盤I/O的消耗,而B+樹正可以解決這種問題,減少與磁盤的交互,因爲進行一次I/O操作可以得到很多數據,增大查找數據的命中率。

這就可以很明顯的看出B+樹的優勢:

  1. 單個節點可以存儲更多的數據,減少I/O的次數。

  2. 查找性能更穩定,因爲都是要查找到葉子結點。

  3. 葉子結點形成了有序鏈表,便於查詢。

B+樹是怎麼進行查找的呢,分爲單元素查找和範圍查找

   單元素查找是從根一直查找到葉子結點,即使中間結點有這個元素也要查到葉子結點,因爲中間結點只是索引,不存數據。比如要查元素3,如圖:

  範圍查找是直接從鏈表查,比如要查元素3到元素8的,如圖:

B+樹與B樹的區別

  • 有k個子結點的結點必然有k個關鍵碼;

  • 非葉結點僅具有索引作用,跟記錄有關的信息均存放在葉結點中。

  • 樹的所有葉結點構成一個有序鏈表,可以按照關鍵碼排序的次序遍歷全部記錄。

用自己語言進行解釋:

1、若一個節點有k個兒子節點,當它自己必須得有k個關鍵字(索引)

2、信息都存在葉子節點,其他節點只保留索引,方便查找

3、葉子節點從左至右形成一個有序得鏈表,可以遍歷

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章