b 树查找时间复杂度_你心里是没点B树吗?
點擊上方“零一視界”,選擇“星標”公眾號
資源干貨,第一時間送達
1 引言
數據庫的增刪改查等操作是開發過程中最為常見也是尤為重要的,尤其是現在大數據的興起,導致數據存儲量急劇增加,提升數據的操作效率就變得尤為關鍵。
大部分數據庫的索引都采用樹的結構存儲,這是因為樹的查詢效率相對較高,且保持有序。
對于二叉搜索樹的時間復雜度是O(logN),在算法以及邏輯上來分析,二叉搜索樹的查找速度以及數據比較次數都是較小的。
但是我們不得不考慮一個新的問題。
數據量是遠大于內存大小的,那我們在查找數據時并不能將全部數據同時加載至內存。既然不能全部加載至內存中就只能逐步的去加載磁盤中某個頁,簡而言之就是逐一的去加載磁盤,加數據分塊的加載至內存進行查找與比較。
例如:在圖1.1所示的樹中查找10,樹中的每個節點代表一個磁盤頁。每次訪問一個新節點代表一次磁盤IO。
圖1.0圖1.1通過查找過程可以看出,磁盤IO次數與樹的高度相關,在最壞情況下,磁盤IO次數等于樹的高度。由于磁盤IO過程是相對耗時效率較低的,因此,在設計數據存儲結構時需要降低樹的高度,即將一棵“瘦高”的樹變得“矮胖”。
當數據數目相同,在保持有序前提下,降低樹高度,只需將節點中存儲的key值增加,即二叉搜索樹中每個節點只有一個key,現將一個節點中存儲多個key,得到的樹即為B樹。
2 定義
B樹也稱B-樹,B-樹直接讀作B樹,不能因為有“-”號就讀作B減樹,它是一顆多路平衡查找樹。我們描述一顆B樹時需要指定它的階數,階數表示了一個結點最多有多少個孩子結點,一般用字母m表示階數。當m取2時,就是我們常見的二叉搜索樹,m為3時是2-3樹。
一顆m階的B樹定義如下:
(1)每個結點最多有m-1個關鍵字。
(2)根結點最少可以只有1個關鍵字。
(3)非根結點至少有Math.ceil(m/2)-1個關鍵字。Math.ceil(m/2)含義是向上取整。例如Math.ceil(4.5) = 5。
(4)每個結點中的關鍵字都按照從小到大的順序排列,每個關鍵字的左子樹中的所有關鍵字都小于它,而右子樹中的所有關鍵字都大于它。
(5)所有葉子結點都位于同一層,或者說根結點到每個葉子結點的長度都相同。
3 查找
B-樹的查找其實是對二叉搜索樹查找的擴展, 與二叉搜索樹不同的地方是,B-樹中每個節點有不止一棵子樹。在B-樹中查找某個結點時,需要先判斷要查找的結點在哪棵子樹上,然后在結點中逐個查找目標結點。B樹的查找過程相對簡單,與二叉搜索樹類似,因此不再贅述。
4 插入
B樹的插入操作是指在樹種插入一條新記錄,即(key, value)的鍵值對。如果B樹中已存在需要插入的鍵值對,則用需要插入的value替換舊的value。若B樹不存在這個key,則一定是在葉子結點中進行插入操作。
4.1 插入流程
B樹的插入流程如下:
??(1)根據要插入的key的值,對B樹執行查找操作,查找到待插入數據的當前節點位置。
??(2)判斷當前結點key的個數是否小于等于m-1,若滿足,則結束直接插入數據,否則,進行第(3)步。
??(3)以結點中間的key為中心分裂成左右兩部分,然后將這個中間的key插入到父結點中,這個key的左子樹指向分裂后的左半部分,這個key的右子支指向分裂后的右半部分,然后將當前結點指向父結點,繼續進行第(3)步。
4.2 實例圖解
下面以5階B樹為例,介紹B樹的插入操作,在5階B樹中,結點最多有4個key,最少有2個key。
插入圖解:1:插入38,此時為空樹,直接插入,并作為根節點。繼續插入22、76、40,符合情形(2),直接插入。繼續插入51,符合情形(3),執行分裂。
img2:按照相同的步驟繼續插入13、21。插入39,符合情形(3),導致節點分裂。選擇中值22作為父節點,并將22節點上移,與40節點進行合并。img3:按照同樣的插入規則,繼續向樹中插入key為30、27、33、36、35、34、24、29的數據。插入完成后,繼續插入key為26的數據,插入之后需要執行節點分裂。img4:將key為27的數據節點上移至父節點,此時父節點已經有4個key,插入key27的數據后需要執行節點分裂。在插入key為26的數據后,導致根節點發生分裂,樹的高度加1。img4.3 性能分析
B樹插入過程首先需要執行一次查找操作,B樹的查找操作的時間復雜度為O(mlogmn)。其中m為B樹的階數,n為B樹中key的數目。在插入過程,最耗時的情形即為:插入數據后導致根節點發生分裂,分裂節點的操作是常數級,分裂操作向上回溯的時間復雜度為O(h)。因此,B樹的插入操作的時間復雜度近似于查找操作,即O(mlogmn)。
5 刪除
5.1 刪除流程
B樹的刪除流程如下:
??(1)如果當前需要刪除的key位于非葉子結點上,則用后繼key(這里的后繼key均指后繼記錄的意思)覆蓋要刪除的key,然后在后繼key所在的子支中刪除該后繼key。此時后繼key一定位于葉子結點上,這個過程和二叉搜索樹刪除結點的方式類似。刪除這個記錄后執行第2步
??(2)該結點key個數大于等于Math.ceil(m/2)-1,結束刪除操作,否則執行第(3)步。
??(3)如果兄弟結點key個數大于Math.ceil(m/2)-1,則父結點中的key下移到該結點,兄弟結點中的一個key上移,刪除操作結束。否則,將父結點中的key下移與當前結點及它的兄弟結點中的key合并,形成一個新的結點。原父結點中的key的兩個孩子指針就變成了一個孩子指針,指向這個新結點。然后當前結點的指針指向父結點,重復第(2)步。
5.2 實例圖解
刪除圖解:1:首先刪除21,符合情形(2)直接刪除。刪除21后,繼續刪除27,符合情形(1),使用后繼節點28替代27,并刪除28。
img2:刪除28后,當前節點只有一個key,因此需要按照情形(3)調整。當前節點的兄弟節點有3個key,父節點中key28下移,兄弟節點中key26上移,調整結束。調整完畢后繼續刪除32。img3:刪除32后,需要按照情形(3)進行調整,當前節點的兄弟節點只有2個key,則將父節點下移,將當前節點與一個兄弟節點合并,調整完畢。繼續刪除39,刪除39后按照情形(3)進行調整。img4:當前節點變為只含有key40的節點,需要按照情形(3)繼續調整,執行節點的合并,合并操作中包含根節點,導致合并之后的樹的高度減1。img5.3 性能分析
B樹的刪除操作同樣需要執行查找過程,時間復雜度為O(mlogmn)。刪除數據過程與插入過程類似,最壞情況需要回溯O(h)。因此B樹的刪除操作的時間復雜度近似為O(mlogmn)。
6 總結
B樹是一種平衡的多路查找樹。其設計思路主要是通過節點中存儲不止一個key,來降低樹的高度。同等比較次數下,樹的高度小保證磁盤IO次數相對較少,提高查找效率。
推薦閱讀
有趣的學習《操作系統真象還原》
數據分析必備,《利用Python進行數據分析》推薦
有趣的算法書《算法圖解》推薦
輕松學習網絡知識,《圖解HTTP》推薦
歡迎關注我們,收獲資源干貨!
總結
以上是生活随笔為你收集整理的b 树查找时间复杂度_你心里是没点B树吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python传文件给java_pytho
- 下一篇: vue 2个方法先后执行_有效快速制作工