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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

算法导轮之B树的学习

發(fā)布時(shí)間:2025/4/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法导轮之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ù)的定義如下:
  • 每個(gè)節(jié)點(diǎn)x均有如下屬性:
    • 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)
  • 每個(gè)內(nèi)部節(jié)點(diǎn)包含了n+1個(gè)孩子,葉節(jié)點(diǎn)沒(méi)有孩子
  • 關(guān)鍵字keyi對(duì)存儲(chǔ)在各子樹(shù)中的關(guān)鍵字范圍加以分割:即比keyi小的元素在其左子樹(shù),比keyi大的元素在其右子樹(shù)
  • 每個(gè)葉節(jié)點(diǎn)具有相同的深度
  • 每個(gè)節(jié)點(diǎn)包含的關(guān)鍵字個(gè)數(shù)有上界與下界。我們定義B樹(shù)的最小度數(shù)為t,則除根節(jié)點(diǎn)外的每個(gè)節(jié)點(diǎn)至少有t-1個(gè)關(guān)鍵字,每個(gè)節(jié)點(diǎn)最多有2t-1個(gè)關(guān)鍵字(即每個(gè)節(jié)點(diǎn)最少有t個(gè)孩子,最多有2t個(gè)孩子)(當(dāng)一個(gè)節(jié)點(diǎn)有2t-1個(gè)關(guān)鍵字時(shí),我們稱它為滿的)。
  • B樹(shù)的示意圖如下: 上圖是一個(gè)最小度數(shù)為2的B樹(shù),因此每個(gè)節(jié)點(diǎn)擁有1個(gè)、2個(gè)或3個(gè)元素,擁有2個(gè)、3個(gè)或4個(gè)孩子,也被稱為2-3-4樹(shù)。 根節(jié)點(diǎn)只有一個(gè)元素,因此它擁有兩個(gè)孩子;兩個(gè)孩子分別擁有3個(gè)和2個(gè)元素,因此他們分別擁有4個(gè)和3個(gè)孩子。 看到DEF葉節(jié)點(diǎn)位于關(guān)鍵字C與G的中間,表明了關(guān)鍵字對(duì)于存儲(chǔ)在各子樹(shù)中的關(guān)鍵字范圍進(jì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:
  • 在根節(jié)點(diǎn),由于P < Q 而且 Q < X,進(jìn)入P與X之間的子節(jié)點(diǎn)
  • 發(fā)現(xiàn)該子節(jié)點(diǎn)是滿的,則進(jìn)行分裂,把關(guān)鍵字T上升到父節(jié)點(diǎn),原子節(jié)點(diǎn)分為RS與UV,分為在T關(guān)鍵字的左右
  • 由于Q < T,于是進(jìn)入T的左子節(jié)點(diǎn)
  • 在RS葉節(jié)點(diǎn)中找到對(duì)應(yīng)位置并加入
  • 插入關(guān)鍵字L:
  • 發(fā)現(xiàn)根節(jié)點(diǎn)是滿的,分裂根節(jié)點(diǎn),上移P
  • L < P 進(jìn)入P的左子節(jié)點(diǎn)
  • G < L < M,進(jìn)入G與M關(guān)鍵字間的節(jié)點(diǎn)
  • 在葉節(jié)點(diǎn)的相應(yīng)位置中插入
  • 插入關(guān)鍵字F:
  • F < P,進(jìn)入P的左子節(jié)點(diǎn)
  • F < G,進(jìn)入G的左子節(jié)點(diǎn)
  • 發(fā)現(xiàn)滿的節(jié)點(diǎn),分裂,上移C
  • F > C,進(jìn)入C的右子節(jié)點(diǎn)
  • 在葉節(jié)點(diǎn)的相應(yīng)位置中插入
  • 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
    然后我們?cè)俣x一些在尋找刪除節(jié)點(diǎn)路上的操作:如果在尋找刪除節(jié)點(diǎn)的路上,我們發(fā)現(xiàn)某個(gè)節(jié)點(diǎn)關(guān)鍵字?jǐn)?shù)只有t-1個(gè)關(guān)鍵字,則分兩種情況:
  • 看該節(jié)點(diǎn)的相鄰兄弟節(jié)點(diǎn)是否含有至少t個(gè)關(guān)鍵字,如果是則向相鄰的兄弟節(jié)點(diǎn)“借一個(gè)關(guān)鍵字”(一該節(jié)點(diǎn)的左節(jié)點(diǎn)為例:把左節(jié)點(diǎn)的最后一個(gè)關(guān)鍵字上升至父節(jié)點(diǎn),然后父節(jié)點(diǎn)位置的節(jié)點(diǎn)下移到關(guān)鍵字個(gè)數(shù)為t-1的節(jié)點(diǎn)上)
  • 如果該節(jié)點(diǎn)相鄰的兄弟節(jié)點(diǎn)都只含有t-1個(gè)關(guān)鍵字,則選擇一個(gè)兄弟節(jié)點(diǎn)合并,并把兩兄弟之間的父節(jié)點(diǎn)下移
  • 下面我們來(lái)看一個(gè)B樹(shù)刪除的例子: B樹(shù)的初始狀態(tài)如圖,這是一顆最小度數(shù)為3的B樹(shù),即每個(gè)節(jié)點(diǎn)擁有2~5個(gè)關(guān)鍵字。 刪除F操作:
  • F < P,進(jìn)入P的左子節(jié)點(diǎn)
  • C < F < G,進(jìn)入C與G之間的子節(jié)點(diǎn)
  • 在葉節(jié)點(diǎn)中刪除F
  • 刪除M操作:
  • M < P,進(jìn)入P的左子節(jié)點(diǎn)
  • 在內(nèi)部節(jié)點(diǎn)中發(fā)現(xiàn)M,查看M的左子節(jié)點(diǎn)JKL,擁有3個(gè)關(guān)鍵字,則把最后一個(gè)關(guān)鍵字L上升至M的位置,遞歸的刪除L
  • 節(jié)點(diǎn)JKL是葉節(jié)點(diǎn),直接刪除L即可
  • 刪除G操作:
  • G < P,進(jìn)入P的左子節(jié)點(diǎn)
  • 在內(nèi)部節(jié)點(diǎn)中發(fā)現(xiàn)G,查看G的左右子節(jié)點(diǎn)均只有2個(gè)關(guān)鍵字(不足最小度數(shù)3個(gè)),下降G關(guān)鍵字并合并其左右子節(jié)點(diǎn)
  • 節(jié)點(diǎn)DEGJK為葉節(jié)點(diǎn),直接刪除G即可
  • 刪除D操作:
  • D < P,進(jìn)入P的左子節(jié)點(diǎn)
  • 發(fā)現(xiàn)內(nèi)部節(jié)點(diǎn)CL只有2個(gè)關(guān)鍵字(不足最小度數(shù)3個(gè)),其兄弟節(jié)點(diǎn)也只有2個(gè)關(guān)鍵字,下降父節(jié)點(diǎn)P,與兄弟節(jié)點(diǎn)一起合并成一個(gè)節(jié)點(diǎn)
  • 由于C < D < L,進(jìn)入C與L間的子節(jié)點(diǎn)
  • DEJK節(jié)點(diǎn)是葉節(jié)點(diǎn),直接刪除D即可
  • 刪除B操作:
  • B < C,進(jìn)入E的左子節(jié)點(diǎn)
  • 發(fā)現(xiàn)節(jié)點(diǎn)AC只有兩個(gè)關(guān)鍵字,其兄弟節(jié)點(diǎn)EJK有三個(gè)關(guān)鍵字,則E上移到父節(jié)點(diǎn),C下移到子節(jié)點(diǎn),變?yōu)楣?jié)點(diǎn)ABC
  • 節(jié)點(diǎn)ABC為葉節(jié)點(diǎn),直接刪除B即可
  • 轉(zhuǎn)載于:https://www.cnblogs.com/KingIceMou/p/6984141.html

    總結(jié)

    以上是生活随笔為你收集整理的算法导轮之B树的学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 国产精品无码粉嫩小泬 | 日本69少妇 | 欧美日韩视频免费观看 | 91桃色免费视频 | 日韩欧美一区二区三区视频 | 91豆花视频| 91福利在线导航 | 少妇性生活视频 | 中文人妻熟妇乱又伦精品 | 青在线视频 | 国产真人做爰视频免费 | 日本欧美成人 | 国产片淫乱18一级毛片动态图 | 成人欧美一区二区三区小说 | www.操操操 | 91免费网站入口 | av影视在线观看 | 俄罗斯美女一级爱片 | 成人在线综合网 | 日韩伦乱| 欧美午夜精品久久久 | 亚洲一区二区三区久久久成人动漫 | 青娱乐91视频| 超污视频软件 | 国产欧美不卡 | jizz欧美性11 | 欧美成年人视频在线观看 | 国产精品成人va在线观看 | 老色批影视 | 日日碰狠狠添天天爽无码 | 国产激情免费 | 日本在线视频一区二区 | 少妇无内裤下蹲露大唇视频 | 五月天婷婷导航 | 农村老妇性真猛 | 色哟哟国产 | 久久久久九九 | 欧美精品一区二区久久婷婷 | av一级免费 | 超碰在线免费播放 | 男人的天堂av网站 | 天堂av在线免费 | 国产精品伦子伦免费视频 | 国产精品免费视频一区二区 | 肉色欧美久久久久久久免费看 | 中文字幕一区三区 | 999伊人| 国产大片中文字幕 | 亚洲狠狠| 日日色av| 一级欧美在线 | 精品国产精品三级精品av网址 | 日韩欧美亚洲 | 无码人妻丰满熟妇区五十路百度 | 青青草免费在线 | 欧美亚洲一区二区在线观看 | 国产又大又粗又爽的毛片 | 99免费精品| 美女超碰在线 | 三年中文在线观看中文版 | 欧美91在线 | 超碰在线中文 | 一级黄色aa | 亚洲熟女乱色一区二区三区 | 污视频在线 | 国产伦理一区 | 午夜国产一区二区三区 | 毛片av网站 | 日日爱886 | 99资源在线 | 青在线视频 | 久久久久久久久久福利 | 欧美激情一级精品国产 | 空姐毛片 | 亚洲黄色短视频 | 精品视频在线观看一区二区 | 日韩视频精品 | 看黄色小视频 | 手机在线播放av | 成年女人免费视频 | 久久久免费精品视频 | 国产伦精品一区二区三区在线观看 | 国产精品午夜无码专区 | 草草久久久 | 九九超碰 | 黄色喷水网站 | 乱色专区 | 婷婷激情图片 | 在线观看入口 | 操穴影院| 亚洲一区黄色 | 自拍第一页 | 国产精品后入内射日本在线观看 | 黄色动漫软件 | 久久综合成人网 | 亚洲天堂av女优 | 疯狂撞击丝袜人妻 | www.com欧美| 日本中文有码 |