數據結構-B樹(簡介)

簡介

B-樹即 B 樹,這裏的 - 可不是減號而是橫槓的意思,就是“B 槓樹”或者直接說“B 樹”。B 樹這種數據結構在解決文件系統以及部分數據庫索引上起到關鍵作用(其他有部分數據庫使用 B+ 樹解決索引問題)

爲什麼有 B 樹

爲什麼二叉排序樹不適合做索引樹?

因爲如果我們利用傳統的二叉排序樹來讀取指定元素時候,效率是非常高的(二分查找),但是問題是數據庫索引我們是保存在磁盤中,而不是簡單的內存中,當數據量比較大的時候,索引可能有幾個 G,這個時候就比較麻煩了,你一次性讀到內存裏頭不現實,怎麼辦呢?分幾次讀,第一次磁盤 IO 操作一下,然後再一次,然後再一次,每次加載一個磁盤片(磁盤片對應索引樹的結點),換句話說磁盤 IO 的最大可能操作次數就是此二叉排序樹的最大深度,於是我們想到使得二叉排序樹深度縮減,那我們該怎麼做呢?那我們用 AVL Tree 做索引樹吧!自平衡的特性來降低它的深度!如何呢?

爲什麼平衡二叉樹 AVL Tree 不適合做索引樹?

平衡二叉樹結點很多在邏輯結構相連的結點,在物理上不相連,所以說如果我們幾次讀取磁盤,很可能讀不到,所以也不適合做索引樹

B 樹規則

在這裏插入圖片描述

下面的 m 是 B 樹的階,階就是一顆樹每個結點最多包含的孩子數,m 取值與磁盤頁大小有關

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

B 樹操作

  • B 樹的搜索

    B 樹的搜索很簡單,搜索的最大次數就是 B 樹的最大深度,B 樹保留了二叉排序樹搜索的便捷性,所以搜索很快速,而且也杜絕了深度過深的問題,使得不會過於頻繁的進行磁盤 IO 操作使效率降低

  • B 樹的新增

    B 樹的新增操作比較麻煩,很容易就要動樹的結構,本文作爲簡介,不做深入探究

  • B 樹的刪除

    B 樹的刪除也是比較麻煩的,也容易動樹的結構,本文作爲簡介,不做深入探究

B 樹應用

Oracle 索引,mongoDB 索引

推薦 B 樹好文

https://www.jianshu.com/p/8b653423c586

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