18B树、B++树和Trie树
B樹、B++樹和Trie樹
?
B樹
定義:一個非空M元(也稱M階)B樹(R.Bayer,1970年)
滿足下列條件:
1)每個結點含有m個元素a1<a2<…<am。含有m個元素的結點有m+1個子樹,m稱為結點長度
2)結點長度m滿足:
???? 根結點,1≤m≤M-1???? 可以有2~M個子樹
???? 非根結點,?M/2?-1≤m≤M-1?
????????????????????????? 可以有?M/2?~M個子樹
3)結點結構中:
?? pi(i=0,1,…,m)是指向第i個子樹的指針
?? ai(i=1,…,m)是結點值
對于非葉結點,第0個子樹上所有元素都小于a1
第i個子樹上的元素x滿足ai<x<ai+1(1≤i≤m-1)
第m個子樹上所有元素都大于am
4)所有的葉均在同一層上
?
?
?
B樹的查找
查找元素x的步驟大致如下:
步驟1)如果當前結點為空,則查找失敗
步驟2)在當前結點中查找x
如果找到x,查找成功;??
否則
若x<a1,沿p0遞歸向下查找
若ai<x<ai+1(1≤i<m),沿pi遞歸向下查找
若x>am,沿pm遞歸向下查找
?
?
B樹的插入
插入步驟如下:
步驟1)用查找的方法為x找到所在位置,查找路徑終止于某個空樹,把x插在其父結點的有序位置上
步驟2)如果插入x后,結點不超長,則插入完畢;
????????????? 否則,進入下一步超長處理
步驟3)將超長結點一分為二,將“中間元素”遞歸地插在上層結點中
步驟4)若插入波及到根,當根上溢時,把根一分為二,并將中間元素上移,而產生含單元素的新根,使B樹升高。
?
將超長結點d一分為二的操作方法:
1. 超長結點d的元素達M個,令k=?M/2,元素ak作為中間元素。
2. 將排在ak左側的元素和相應的指針被保留在結點d中。
3. 將排在ak右側的元素和相應的指針移入新結點e中。
4. 將ak連同指向結點e的指針一起插在d的父結點f中,排在指向結點d的指針右側。
?
?
?
?
B樹的刪除
(1)刪除x大體步驟:
步驟1)經查找,在某一結點c中找到x
步驟2)根據x所在位置的不同,作出不同的處理
??? ①如果c是葉,直接從葉中刪除x
②如果c是非葉,需要用x的“中序前驅”代替x。
注意:
尋找x的中序前驅:
沿著x左側子樹的最右分枝一直下降到某個葉結點s,結點s中最右元素y便是x的前驅,
用y代替x(復制)后,在結點s中刪除y。
步驟3)如果刪除后d(d指的是真正刪除元素的結點)不下溢,刪除結束;否則,進入下一步下溢處理。
步驟4)如果d是根(根變空才算下溢),轉步驟9;否則,進入下一步。
步驟5)找d的鄰近兄弟e。(現在d下溢,d不是根,d的長度小于?M/2?-1)。
步驟6)如果e長度未到下限,即多于半滿(否則,進入步驟7) ,則從e中借一個元素(連同相應的指針)給d,并應適當地調整d和e之間的那個元素,刪除結束。
步驟7)將e合并到d,也就是把e中的元素,以及d和e之父f的那個“中間元素”都加到結點d中,結點e變空,刪除空結點e。(也可將d合并到e,而刪除d)。
步驟8)如果引起f下溢,令d=f轉步驟4;否則刪除結束。(因f的元素下移,使f的長度減小)
步驟9)(根的長度變為0)刪除根,B樹高度下降。
?
?
?
?
?
B+樹
基本概念
(1)B+樹與B樹主要區別:
所有的數據元素都存儲在葉結點中,非葉結點僅存便于查找的索引信息(索引結點)。
1)第i個子樹上的元素x滿足ai<x≤ai+1可取等號,與B樹不同。
2)葉與非葉具有不同的結點結構。葉結點中可以存放儲?K/2?~K個元素;K的可以與樹的元數M相等也可以不等。
?
注意點:
將葉結點“穿成”有序鏈表。具有“兩套”查找機構。
縱向:沿樹枝進行查找;
橫向:沿鏈表順序查找。
?
?
?
B+樹的插入
(1)插入x的大體步驟:
步驟1)從根結點起,沿縱向搜索路徑為x找到所在的葉結點d。如果葉d未滿,則把x插在葉d的有序位置上,插入完畢;否則,進入下一步。
步驟2)葉d已滿,葉長達到K,將d一分為二:
產生新葉e,將d的下部K/2個元素移入e,另一半留在d中。
設d的父親是f,給f加一個兒子e,e排在d之右側,將e的最小元素的值加到f中作為新索引項,如果f不超長,則插入結束;否則,進入下一步。
步驟3)將f分裂成f和g,并遞歸地將g插到上一層中。
步驟4)若插入波及到根,當根上溢時,把根一分為二,并產生新根。
?
B+樹的插入示例:
?
?
?
?
?
?
B+樹的刪除
(1)刪除x的大體步驟:
步驟1)沿根到某葉的一條路徑查找x,如果x不存在,刪除失敗,結束;否則,進入下一步。
步驟2)在x所在葉d中刪除x。如果刪除x后,葉d不下溢,則刪除結束;否則,進入下一步。
步驟3)找葉d的兄弟e。如果e處于半滿狀態,進入步驟4;
否則,從e中移一個元素給葉d。如果e在d的左側,則移的是e中最大元素;如果e在d的右側,則移的是e中最小元素,移走元素的同時,修改上層結點中的索引信息,刪除結束。
步驟4)將d合并到e。將d的所有元素都給e,刪除d,并相應的修改上層結點中的索引信息,也可將e合并到d。
步驟5)如果刪除d不引起其父f的下溢,則刪除結束;
否則,將遞歸地波及到更上層結點,或者可以向其兄弟“借”一個索引項和一個子樹,或者與其兄弟合并。如果波及根,根長度為0,刪除根,整個樹的高度下降,刪除非葉結點的大體步驟與B樹相同。
?
刪除示例:
?
?
?
?
?
?
?
?
Trie樹
組織結構:
定義:屬于數字查找樹,用于按數字或字符索引。像大型字典的“書邊標目”。
優點:
1.元素(字符串)存儲在葉結點中。
2.非葉結點只存儲一個字符作為索引。
3.從根到某個葉的路徑上字符組合成的字符串,恰是存儲于該葉中的元素值(關鍵字)。
?
?
示例:
?
?
轉載于:https://www.cnblogs.com/gd-luojialin/p/8509268.html
總結
以上是生活随笔為你收集整理的18B树、B++树和Trie树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈 Scala 中下划线的用途
- 下一篇: Mutual and feedback(