日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

b树与b+树的区别_面试必考:B树、B树、B+树、B*树图文详解

發布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 b树与b+树的区别_面试必考:B树、B树、B+树、B*树图文详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

B樹

B樹又叫做二叉搜索樹,倒狀的樹形結構。如下圖所示

特點:
  • 所有的非子夜節點最多擁有兩個子節點樹(左子樹和右子樹)。

  • 所有結點存儲一個關鍵字。

  • 節點的左右兒子,左邊是比該節點小的,右邊是比該節點大的。

缺點:

因為二叉搜索樹不存在平衡算法,所以在某些特殊的情況下,二叉搜索樹等同于線性,出現蹩腳的情況,設計者們發現降低樹的高度自然就可以提高查找效率。那么如何解決降低樹的高度的問題?在這種基礎上設計者給二叉樹加入了平衡算法,出現了平衡樹。


二叉樹搜索樹的查詢原理,先從根節點開始,和根節點匹配,若是比根節點小就進入左子節點,若是比根節點大進行右子節點,依次按照這樣的邏輯進行,找到就返回。

另一方面樹的高度也會影響查詢的效率,設計者又是怎么解決的呢?
假設大規模數據存儲中,實現索引查詢這樣一個實際背景下,樹節點存儲的元素數量是有限的,即使存儲在平衡二叉樹中,在大量數據的儲存情況下,這樣導致二叉平衡查找樹結構由于樹的深度過大而造成磁盤I/O讀寫過于頻繁,進而導致查詢效率低下,那么如何減少樹的深度(當然是不能減少查詢的數據量),一個基本的想法就是:采用多叉樹結構(由于樹節點元素數量是有限的,自然該節點的子樹數量也就是有限的)。在這種前提下,B-、B+、B*也就是這樣的數據結構,多路搜索樹,不再是只有二路。

所謂的平衡就是加上平衡算法,在B樹在經過多次插入與刪除后,有可能導致不同的結構,極端一點就是出現線性的蹩腳樹,通過平衡算法(左旋和右旋),使樹的節點分布均勻,是樹的查找算法等同于二分查找。所以對于樹而言要提高查找的效率,一個是保存平衡;另一個是減少樹的高度。

B-樹

基于減少樹的高度上,B-樹是一種多路搜索樹,并不是二叉的。如下圖所示:

特點:
  • 所有的非葉子結點最多有M個兒子(且M>2)。

  • 根結點的兒子數為[2, M],其它非葉子結點的兒子數為[M/2, M]。

  • 每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)。

  • 非葉子結點的關鍵字個數=指向兒子的指針個數-1。

  • 非葉子結點的關鍵字中從左到右由大到小排序。即A[1]

  • 非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小于K[1]的子樹,其它P[i]指向關鍵字屬于(K[i-1], K[i])范圍的子樹,最后一個指針P[M]指向大于隨后一個關鍵字A[M-1]范圍的值。

  • 關鍵字集合分布在整顆樹中,并且只會在節點中出現一次。

  • 搜索可能在非子葉節點或者子葉節點結束,即非子葉節點也存儲數據的身,這個與B+樹有根本區別。

  • 所有葉子結點位于同一層。

缺點:

  • 當數據量大的時候不是依然會查詢到最底層的葉子節點。這就是B-樹的缺點,但是相比B樹而言已經優化了很多。

B-樹的性能總是等價于二分查找(與M值無關),也就沒有B樹平衡的問題。由于M/2的限制,在插入結點時,如果結點已滿,需要將結點分裂為兩個各占M/2的結點;刪除結點時,需將兩個不足M/2的兄弟結點合并。

B+樹

B+樹是B-樹的變體,也是一種多路搜索樹。如下圖所示:

B+基本與B-樹同,以下是與B-樹的區別:
  • 非葉子結點的指針與關鍵字個數相等,而B-樹的關鍵字=指針個數-1;

  • 指針P[i],指向關鍵字值屬于[K[i], K[i+1])范圍的子樹,而在B-樹是開區間。

  • 所有葉子結點增加一個指針,指向下一個的兄弟葉子節點。

  • 所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的,搜索只會在葉子節點結束,葉子節點存儲所有關鍵字的值。

  • 不可能在非葉子結點命中;非葉子結點相當于是葉子結點的索引(稀疏索引),葉子結點相當于是存儲。

B樹與B+樹的區別:

  • 所有的葉子節點包含了全部關鍵子信息,及指向含有這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大的順序鏈接。(而B樹的葉子節點并沒有包括全部需要查找的信息)。

  • 所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最大(或最小)關鍵字。(而B樹的非終節點也包含需要查找的有效信息)。

這些鏈指針在鏈表中是有序存儲的,在搜索中能省大量的時間。那這些鏈指針可不可以加在所有的節點中呢,答案是可以的,除了根節點,所有的節點都可以加上鏈指針。這就是B*樹索引。

B*樹

B*樹是在B+樹的基礎上,在B+樹的非根和非葉子結點增加指向兄弟的指針,將結點的最低利用率從1/2提高到2/3。

特點:
  • B*樹定義了非葉子結點關鍵字個數至少為(2/3)M,即塊的最低使用率為2/3(代替B+樹的1/2)

  • 在非根和非葉子結點增加指向兄弟的指針。

B+樹與B*樹的區別:
(1)B+樹的分裂:當一個結點滿時,分配一個新的結點,并將原結點中1/2的數據復制到新結點,最后在父結點中增加新結點的指針;B+樹的分裂只影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針。
(2)B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那么將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最后修改父結點中兄弟結點的關鍵字(因為兄弟結點的關鍵字范圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,并各復制1/3的數據到新結點,最后在父結點增加新結點的指針。結論:
所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高。

關于回表查詢:
比如select name from table where id=?,如果name沒有索引,那在查詢的時候先得得到的是id對應這條數據所在的行數。拿著這個行數,再去表中查詢這條數據,得到name字段。而拿著這個行數去得到name字段的動作,就是回表查詢。

我們如何避免回表查詢呢,首先就是不要用 ” * “ 查詢,因為這時候會默認查詢的字段沒有索引,必定進行回表查詢。

長按訂閱更多面經分享

總結

以上是生活随笔為你收集整理的b树与b+树的区别_面试必考:B树、B树、B+树、B*树图文详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。