阿里面試,問了B+樹,這個回答讓我通過了

前言

上週我通過阿里一面,崗位是客戶端開發工程師(是的,還是java崗!)。面試過程中面試官問了B+樹,回答時面試官一直點頭(應該回答得還不錯所以過了),今天詳細講一講B+樹

平衡二叉樹

它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。

B樹(B-樹)

在這裏插入圖片描述

m階B樹定義

m階B樹是一棵平衡的m路搜索樹,或者是空樹,或者是滿足以下條件:

  1. 樹中的每個節點最多有m個孩子

  2. 除了根節點和葉子結點外,其他節點最少含有 (m+1)/2 個孩子

ceil(m/2) 即是 (m+1)/2,向上取整

  1. 如果根節點不是葉子結點,則根節點最少2個孩子

  2. 所有葉子節點都在同一層,並不帶任何信息

  3. 除了葉子結點,節點含有關鍵字屬性,數目範圍是 [M/2 - 1,M-1],即關鍵字個數 = 孩子個數 - 1

非葉子結點

  • 關鍵字:K[1], K[2], …, K[M-1],且K[i] < K[i+1],即關鍵字時有序的。

  • 孩子指針:P[1], P[2], …, P[M]

  • P[1]指向關鍵字小於K[1]的子樹,P[M]指向關鍵字大於K[M-1]的子樹,其它P[i]指向關鍵字屬於**(K[i-1], K[i])**的子樹。

時間複雜度:O(nlogn)。

優點

B樹相對於B+樹的優點是,如果經常訪問的數據離根節點很近,而B樹的非葉子節點存儲關鍵字數據的地址,所以這種數據檢索的時候會要比B+樹快。

B+樹

在這裏插入圖片描述

m階B+樹定義

B+樹是B樹的一種變形形式,m階B+樹滿足以下條件:

(1) 每個結點至多有m個孩子。

(2) 除根節點和葉結點外,每個結點至少有(m+1)/2個孩子。

(3) 如果根節點不爲空,根結點至少有兩個孩子。

(4) 所有葉子結點增加一個鏈指針,所有關鍵字都在葉子結點出現。

(5) 除了葉節點,結點的孩子數目等於關鍵字數目。 注意,B+樹中非葉子結點存儲的不是關鍵字數據的地址,而是指向葉子結點中關鍵字的索引。(所以任何關鍵字的查找必須走一條從根結點到葉子結點的路)

非葉子結點的子樹指針P[i],指向關鍵字值屬於[K[i], K[i+1])的子樹(B-樹是開區間)

優點

  1. B+樹的層級更少:相較於B樹B+每個非葉子節點存儲的關鍵字數更多,樹的層級更少所以查詢數據更快;

  2. B+樹查詢速度更穩定B+所有關鍵字數據地址都存在葉子節點上,所以每次查找的次數都相同所以查詢速度要比B樹更穩定;

  3. B+樹天然具備排序功能:B+樹所有的葉子節點數據構成了一個有序鏈表,在查詢大小區間的數據時候更方便,數據緊密性很高,緩存的命中率也會比B樹高。

  4. B+樹全節點遍歷更快:B+樹遍歷整棵樹只需要遍歷所有的葉子節點即可,而不需要像B樹一樣需要對每一層進行遍歷,這有利於數據庫做全表掃描。

適應場景

通常用於數據庫和操作系統的文件系統中。

結點的分裂

  • 將已滿結點進行分裂,將已滿節點後M/2節點生成一個新節點,將新節點的第一個元素指向父節點。

  • 父節點出現已滿,將父節點繼續分裂。

  • 一直分裂,如果根節點已滿,則需要分類根節點,此時樹的高度增加。

優點

能夠保持數據穩定有序,其插入與修改擁有較穩定的對數時間複雜度

總結

咱們玩歸玩,鬧歸鬧,別拿面試開玩笑。

B+樹在面試中幾乎被問爛了。除了本文提到的平衡二叉樹、B樹和B+樹外,B+樹的應用場景還有很高的話題性,比如MySQL和一些文件系統中使用的是B+樹結構。本文篇幅有限,希望大家面試前要把知識點記全記牢。

參考鏈接:https://zhuanlan.zhihu.com/p/27700617

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