算法导轮之B树的学习
生活随笔
收集整理的這篇文章主要介紹了
算法导轮之B树的学习
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
最近學(xué)習(xí)了算法導(dǎo)輪里B樹(shù)相關(guān)的知識(shí),在此寫(xiě)一篇博客作為總結(jié)。
?
1.引言
B樹(shù)是為磁盤(pán)或其他直接存取的輔助存儲(chǔ)設(shè)備而設(shè)計(jì)的一種平衡搜索樹(shù)。B樹(shù)類(lèi)似于紅黑樹(shù),但它與紅黑樹(shù)最大不同之處在于B樹(shù)的節(jié)點(diǎn)可以擁有很多孩子,因此B樹(shù)的高度會(huì)比紅黑樹(shù)小很多,也因此B樹(shù)在磁盤(pán)I/O方面表現(xiàn)要比紅黑樹(shù)好。(對(duì)于磁盤(pán)操作最耗時(shí)的部分在于磁盤(pán)讀寫(xiě),而每次讀取一個(gè)新的樹(shù)的節(jié)點(diǎn)就必須進(jìn)行一次磁盤(pán)讀取,因此節(jié)點(diǎn)較大、樹(shù)高度較小的B樹(shù)會(huì)進(jìn)行較少的磁盤(pán)I/O操作)2.B樹(shù)的定義
一顆B樹(shù)的定義如下:- n表示存儲(chǔ)在該節(jié)點(diǎn)的關(guān)鍵字個(gè)數(shù)
- n個(gè)關(guān)鍵字本身key1、key2……keyn以非降序存放,即key1 <= key2 <= …… <= keyn
- 一個(gè)leaf布爾值表示該節(jié)點(diǎn)是否為葉節(jié)點(diǎn)
3.B樹(shù)的插入
要講到樹(shù),就不得不提樹(shù)中關(guān)鍵的插入與刪除操作,這里我們先總結(jié)B樹(shù)的插入操作。 當(dāng)我們往B樹(shù)中插入一個(gè)新的關(guān)鍵字時(shí),由于B樹(shù)節(jié)點(diǎn)的關(guān)鍵字是受到限制的,因此當(dāng)一個(gè)節(jié)點(diǎn)關(guān)鍵字?jǐn)?shù)目為2t-1時(shí)(該節(jié)點(diǎn)是滿的),我們就必須進(jìn)行分裂操作。分裂節(jié)點(diǎn)
分裂節(jié)點(diǎn)的主要操作為把滿節(jié)點(diǎn)的中間關(guān)鍵字提升至父節(jié)點(diǎn),把原滿節(jié)點(diǎn)分裂為中間關(guān)鍵字的兩個(gè)左右節(jié)點(diǎn) 其示意圖如下: 對(duì)于某個(gè)非滿的節(jié)點(diǎn)x,若其孩子節(jié)點(diǎn)x.ci為滿的(即孩子節(jié)點(diǎn)的關(guān)鍵字?jǐn)?shù)目為2t-1)。則把其孩子節(jié)點(diǎn)的中間關(guān)鍵字(S)提升為父節(jié)點(diǎn)(x節(jié)點(diǎn))的關(guān)鍵字,并把原孩子節(jié)點(diǎn)(x.c節(jié)點(diǎn))分成兩個(gè)t-1個(gè)關(guān)鍵字的節(jié)點(diǎn),分別位于中間關(guān)鍵字(S)的左、右。 還有一種比較特殊的情況就是B樹(shù)根的分裂: 分裂是B樹(shù)長(zhǎng)高的唯一途徑,因此分裂是非常重要的。插入
講完分裂操作在講插入操作就非常簡(jiǎn)單了。插入的時(shí)候我們通過(guò)比較不斷地根據(jù)關(guān)鍵字的值尋找孩子節(jié)點(diǎn),當(dāng)發(fā)現(xiàn)一個(gè)滿的節(jié)點(diǎn)時(shí)便分裂,最后找到對(duì)應(yīng)的葉節(jié)點(diǎn)時(shí)根據(jù)關(guān)鍵字的值插入相應(yīng)位置即可。 下面是一個(gè)插入關(guān)鍵字的例子: B樹(shù)的初始狀態(tài)如圖所示,這是一顆最小度數(shù)為3的B樹(shù),即他的關(guān)鍵字個(gè)數(shù)為2~5個(gè)。 插入關(guān)鍵字B,在根節(jié)點(diǎn)由于(B < G)往進(jìn)入G的左節(jié)點(diǎn),到達(dá)葉節(jié)點(diǎn)后添加至A與C關(guān)鍵字之間。 插入關(guān)鍵字Q:4.B樹(shù)的刪除
講完了B樹(shù)的插入操作,我們?cè)賮?lái)講講B樹(shù)的刪除操作。 對(duì)于刪除操作,我們必須保證每個(gè)節(jié)點(diǎn)在刪除前必須至少有t(最小度數(shù))個(gè)關(guān)鍵字。 首先我們把要?jiǎng)h除的關(guān)鍵字(假設(shè)為k)分兩種情況:- 關(guān)鍵字k在葉節(jié)點(diǎn)中:直接刪除
- 關(guān)鍵字k在內(nèi)部節(jié)點(diǎn)中,分三種情況:
- k的左子節(jié)點(diǎn)擁有t個(gè)關(guān)鍵字,則把k的左子節(jié)點(diǎn)的最后一個(gè)關(guān)鍵字(假設(shè)為j)上移到父節(jié)點(diǎn),然后遞歸的刪除j
- k的右子節(jié)點(diǎn)擁有t個(gè)關(guān)鍵字,則把k的右子節(jié)點(diǎn)的第一個(gè)關(guān)鍵字(假設(shè)為l)上移到父節(jié)點(diǎn),然后遞歸的刪除l
- k的左右子節(jié)點(diǎn)都只有t-1個(gè)關(guān)鍵字,則把k下降與左右子節(jié)點(diǎn)合并成一個(gè)擁有2t-1個(gè)關(guān)鍵字的節(jié)點(diǎn),然后遞歸的刪除k
轉(zhuǎn)載于:https://www.cnblogs.com/KingIceMou/p/6984141.html
總結(jié)
以上是生活随笔為你收集整理的算法导轮之B树的学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于面试,我也有说的
- 下一篇: JAVA多线程--Thinking in