Я думаю, у вас є створення сторінки догори ногами. Коли вузол розщеплюється не створює більше вузлів вниз по ієрархії (син вузлів у вашій номенклатурі). Натомість він створює більше вгору , до кореня. Як говориться в книзі
Зауважте, що зростання знаходиться на верхівці дерева, і це властива характеристика дерева B – для забезпечення важливих властивостей того, що у нього завжди все листя на одному рівні, а кожен вузол, відмінний від кореня, принаймні 50% повно.
(Мій наголос.)
Із пов’язаної книги:
Визначення 5.1 AB – дерево порядку m (m ≥ 3) ... кожен вузол містить максимум m - 1 клавіш
Вправа для m = 3, тому максимум 2 клавіші на вузол.
Перші два клавіші прості - вони переходять на першу сторінку:
A:[1,2]
Я буду використовувати мистецтво ASCII. Я позначу кожну сторінку в послідовності, яку вони створили, і покажу ключі / покажчики всередині сторінки. Отже, сторінка P, що містить ключові значення k1 і k2, буде P:[k1,k2]
.
Тепер приходить ключ 3. Згідно з розділом 5.2.1 ... Введення, перше завдання - пошук. Це визначає, що ключ 3 повинен знаходитись на сторінці A - єдиній у нас сторінці. Далі "якщо [цей вузол] повний, він розділиться на два вузли." Сторінка повна, тому її потрібно розділити. Зараз у нас є
A:[1,2] B:[3, ]
Але це не дерево! Як говориться в книзі:
вказівник на [новий вузол], .. вставляється у батьківський вузол .. [поточного вузла], повторюючи операцію введення в цей вузол [тобто батьківський вузол]. Цей процес розщеплення і переміщення вгору може продовжуватися до необхідності до кореня, і якщо це потрібно розділити, буде створений новий кореневий вузол ..
(Мій наголос на показовій обробці триває вгору до дерева, а не до листя.)
Тому ми повинні поставити вказівник на нову сторінку (B) на батька поточної сторінки (A). Повинно бути новий кореневий вузол:
C:[2,3]
/ \
A:[1,2] B:[3, ]
У мене є вказівники на сторінках, які не містять листів, які вказують на найвище значення у вузлі дитини (сина) Ваш зв'язаний текст може зробити це по-різному, але результат буде рівноцінним.
Ключове значення 4 надходить; слідуючи алгоритму, який ми шукаємо, щоб знайти, на якій сторінці він повинен бути. Це має бути сторінка B. Тут є місце, тому ми оновлюємо цю сторінку та вказівник на сторінці C:
C:[2,4]
/ \
A:[1,2] B:[3,4]
Далі вставляємо ключ 5. Він повинен зайти на сторінку В, але вона заповнена. Тому вона розбивається
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 в B-дереві саме з цієї причини означає "врівноважене".)
Щодо другої частини - "Чи можна вводити записи за допомогою клавіш в іншому порядку, щоб мати дерево меншої висоти?" За допомогою 5 клавіш і двох клавіш на вузол нам потрібно щонайменше 3 вузла аркуша, щоб утримувати всі значення та висоту 3 для формування дерева. Тож моє розташування є оптимальним для даних, послідовності та алгоритму.
У книзі використовується дуже інше розташування вказівників у порівнянні з тим, що я використовую, та інше розташування розділених сторінок. Це буде суттєво, що призведе до заповнення частин сторінок. Про те, що на сторінці 42 є розділ "Завантаження даних", який показує, як можна досягти повніших сторінок, завантажуючи послідовність ключів, підтримуючи мою думку. Однак я сподіваюся, що я дав вам достатньо вказівників, і ви зможете використовувати структуру вказівників книги, щоб вирішити це для себе.
Я натрапив на це інтерактивне моделювання того, як росте B-Дерево.