如何使用最初為空的 B+ 樹的鍵輸入記錄?
顯示按順序 (1, 2, 3, 4, 5) 將鍵輸入記錄到初始為空的 B+ – 樹的結果 m = 3。如果溢出,拆分節點並且不重新分配鄰居的鑰匙。是否可以以不同的順序輸入帶有鍵的記錄以獲得高度較低的樹?
我對此並不擅長,但我嘗試在左側做 ≤ 並在右側做 >:
直到插入 1,2 :
然後,就我們必須拆分節點而不是將密鑰重新分配給鄰居(我將其理解為子節點)而言,我僅在單元格右側插入 2 :
我在插入 5 時繼續做同樣的事情:
但這很奇怪,我從未見過像這樣的空節點……而且我不知道它是否尊重一些非常基本的 B 樹屬性:
- 每個節點最多有**(m-1) 個鍵和至少(⌈(m/2)⌉-1)**個鍵,除非鍵可以為空,我會將鍵理解為“指針”。
第一次嘗試:訂單錯誤顯示一棵不明確的樹
一開始我誤解了“訂單”是什麼(每個節點的最大子節點數)。所以我認為一個節點可以有三個空格(因此有 4 個孩子。我正在創建一個 4 階的樹,我認為:
直到插入 1,2,3 :
插入 4,只要我們必須拆分節點而不是將密鑰重新分配給鄰居(這似乎是矛盾的),我會讓 1,2,3 和 4,5 在 3 之後的右葉上:
我認為您的頁面創建顛倒了。當一個節點分裂時,它不會在層次結構中創建更多節點*(您的命名法中的子節點)。相反,它會向上*創建更多,朝向根。正如書上所說
注意生長在樹的頂端,這是B-Tree的一個內在特性,它保證了它的所有葉子總是在同一層級,並且每個與根不同的節點至少是50% 滿。
(我的重點。)
從連結的電子書:
定義 5.1 AB-m 階 (m ≥ 3) 樹 … 每個節點最多包含 m - 1 個鍵
該練習適用於 m=3,因此每個節點最多 2 個鍵。
前兩個鍵很簡單——它們進入第一頁:
A:[1,2]
我將使用 ASCII 藝術。我將按照它們創建的順序標記每個頁面,並在頁面中顯示鍵/指針。因此,包含鍵值 k1 和 k2 的頁面 P 將是
P:[k1,k2]
。現在關鍵 3 出現了。根據Section 5.2.1 …插入,第一個任務是搜尋。這決定了關鍵 3 應該在頁面 A 上——我們唯一的頁面。進一步“如果
$$ that node $$已滿,它將被拆分為兩個節點。” 頁面已滿,因此必須拆分。我們現在有
A:[1,2] B:[3, ]
但這不是一棵樹!正如書中所說:
指向的指針
$$ the new node $$, .. 被插入到父節點 .. 的$$ the current node $$,在這個節點重複插入操作$$ i.e. the father node $$. 如果需要的話,這個分裂和向上的過程可以繼續到根,如果必須分裂,一個新的根節點將被創建..
(我的重點是顯示處理繼續向上到樹根,而不是向下到葉子。)
所以我們必須把指向新頁面(B)的指針放入目前頁面(A)的父頁面。必須有一個新的根節點:
C:[2,3] / \ A:[1,2] B:[3, ]
我在非葉頁面中有指向子(子)節點中的最大值的指針。您的連結文本可能會以不同的方式執行此操作,但結果將是相同的。
鍵值4到;按照我們搜尋的算法來找到它應該在哪個頁面上。它應該是頁面 B。它有空間,所以我們更新該頁面和頁面 C 上的指針:
C:[2,4] / \ A:[1,2] B:[3,4]
接下來我們插入密鑰 5。它應該進入頁面 B,但它已滿。因此它分裂
C:[2,4] / \ A:[1,2] B:[3,4] D:[5, ]
我們必須更新父節點。它也滿了,所以它分裂了:
C:[2,4] E:[5, ] / \ \ A:[1,2] B:[3,4] D:[5, ]
分裂向上傳播並形成一個新的根節點:
F:[4,5] / \ C:[2,4] E:[5, ] / \ \ A:[1,2] B:[3,4] D:[5, ]
通過向上生長,樹在每個分支中保持相同的深度。這對於可預測的性能很重要。(出於這個原因,有人說 B-Tree 中的 B 代表“平衡”。)
至於第二部分——“是否有可能以不同的順序輸入帶有鍵的記錄以得到一棵高度較低的樹?” 每個節點有 5 個鍵和兩個鍵,我們需要至少 3 個葉節點來保存所有值,並且高度為 3 來形成樹。所以我的安排對於給定的數據、序列和算法是最優的。
這本書使用了與我使用的非常不同的指針排列,以及不同的頁面拆分排列。這將是重要的,導致部分完整的頁面。第 42 頁上有一個名為“數據載入”的部分,它顯示瞭如何通過載入鍵序列來實現更完整的頁面,這支持了我的預感。然而,我希望我已經給了你足夠的指針,你將能夠使用本書的指針結構來自己解決這個問題。
我遇到過這種關於 B 樹如何生長的互動式模擬。