b樹,是一種多路平衡搜尋樹,多用於檔案系統、資料庫的實現。b樹中所有節點擁有的子節點數(指標數)
的最大值稱為b樹的階,如3階b樹他的子節點個數最大為3個。
可以通過這個視覺化資料結構**自己對照模擬一遍,會更容易掌握的。選擇b trees,就可以進入到頁面建立b樹了,選擇相應的階數即可。點這裡,進入視覺化資料結構**
b樹有以下特點:
1.
每個節點可以儲存多個元素(n)
、可以擁有多個子節點(n + 1)
;
2.
擁有二叉樹的一些性質,元素都是有序的;
3.
極度平衡,每個節點的所有子樹的高度一致;
4.
整個樹的高度非常矮,儲存元素個數也非常多;
m階b數的性質:
1.
m階b樹滿足以下性質;
2.
根節點的元素個數必須1 <= x <= m - 1
;
3.
非根節點的元素個數必須為┌ m / 2 ┐ - 1 <= x <= m - 1 (┌ ┐向上取整)
;
4.
如果乙個節點中的元素個數為x
,並且有子節點,那麼子節點個數為y = x + 1
那麼作為根節點的子節點個數為2 <= y <= m
,作為非根節點的子節點個數為┌ m / 2 ┐ <= y <= m
;
b樹的搜尋步驟和二叉搜尋樹類似:
1.
先從節點內從小到大開始搜尋元素;
2.
如果命中,搜尋結束;
3.
如果未命中,在去對應的子節點中搜尋元素,重複1,2步驟;
b樹的新增,新新增的元素必定是新增到葉子節點上,如果葉子節點上的元素個數滿足m階b樹的性質,那麼就符合條件無需處理。但是如果插入到葉子節點上的個數超過b樹的階數,那麼需要進行上溢處理。
上溢解決(上溢節點的個數必定等於m):
1.
找出產生上溢的那個節點最中間的位置的元素b;
2.
將b位置的元素向上與父節點進行合併;
3.
然後將[0,b - 1]
和[b + 1,m]
位置的元素**成兩個子節點,作為上溢元素的左右子節點;
4.
檢查父節點是否發生上溢,如果父節點發生上溢,那麼執行1,2,3
步驟,直到上溢問題解決;
b樹的刪除操作,如果刪除的元素在葉子節點,那麼直接刪除即可。如果刪除元素在非葉子節點,那麼需要以下步驟:
1.
先找到他的前驅或後繼元素,覆蓋所需要刪除的元素值;
2.
在把前驅或後繼元素刪除;
由此可知,不管是葉子節點刪除,還是非葉子節點刪除。真正的刪除元素都是發生在葉子節點上。如果在刪除葉子節點的時候,節點的元素數量為┌ m / 2 ┐ - 1
,那麼需要進行下溢操作,下溢節點的元素數量必然等於┌ m / 2 ┐ - 2
.
下溢解決:
1.
如果下溢節點臨近的兄弟節點,有至少┌ m / 2 ┐
個元素,可以向其借乙個元素a,然後將其父節點的元素b插入到下溢節點的0位置,把元素a替換到父節點元素b的位置 (旋轉操作);
2.
如果臨近的兄弟節點,只有┌ m / 2 ┐ - 1
個元素,那麼將父節點的元素b挪下來跟左右子節點進行合併,並且非常巧妙的是合併的元素個數為┌ m / 2 ┐ + ┌ m / 2 ┐ - 2
不會超過m - 1
,這個操作可能會導致父節點產生下溢 ,然後嘗試執行1,2步操作。
你有沒有重視過視覺入侵
視覺入侵是指對肉眼直接可見的資訊進行記錄的黑客攻擊手段。機構往往花費鉅款,搭建針對關鍵網路的防禦系統,卻在防護視覺入侵方面毫無作為。波耐蒙研究所 ponemon institute 最近對此問題開展了一項調查。結果顯示,使用低技術手段進行視覺入侵的成功率接近九成 88 研究所僱傭了一位負責滲透測試的...
你有沒有為夢想努力過?
每乙個人,我相信,在人生的某個階段,都有夢想,而且往往它是不斷變化的。原因有以下幾點 但是不知從何時起,這個詞彙漸漸從我們的生活中消失。消失的並不是我們的想法,而是我們的熱情。沒有一帆風順的人生,只有一成不變的生活。時間是最好的良藥,卻也是最好的砂紙。它撫平了我們的創傷,也磨平了我們的鬥志。生活的不...
你心裡沒點B樹,不懂索引,怎麼去面試?
認識自己的無知是認識世界最可靠的方法 開局一張圖 做個實驗 問問你周邊的小夥伴 索引是什麼?我周邊的小夥伴是下面的表情,平時在用的時候大部分人都知道它能夠加速查詢,但是至於定義嘛,往往被忽略。mysql官方 索引 index 是幫助mysql高效獲取資料的一種資料結構。mysql的查詢本質也就是找資...