Як вводити записи за допомогою ключів до спочатку порожнього дерева B +?


11

Покажіть результат введення записів ключами в порядку (1, 2, 3, 4, 5) на початково порожній B + - дерево порядку m = 3. У разі переповнення розділіть вузол і не поширюйте повторно ключі від сусідів. Чи можна вводити записи за допомогою клавіш в іншому порядку, щоб мати дерево меншої висоти?

Із внутрішніх реляційних СУБД, глава 5: Організації динамічної структури дерев, стор

Мені недобре в цьому, але я намагався зробити ≤ зліва та> справа:

До введення 1,2:

введіть тут опис зображення

Тоді, наскільки ми повинні розділити вузол і не перерозподіляти ключі сусідам (я розумію це як вузлові вузли), я вставив лише праворуч клітинки з 2:

введіть тут опис зображення

І я продовжував робити те саме, що вставляючи 5:

введіть тут опис зображення

Але це досить дивно, я ніколи не бачив порожніх вузлів на кшталт цих ... І я не знаю, чи він поважає деякі дуже основні властивості B-дерев:

  • кожен вузол має максимум (m-1) клавіш і принаймні (⌈ (m / 2) ⌉-1) ключів, якщо ключ не може бути порожнім, і я би розумів ключ як "покажчик".

Перша спроба: помилка в наказі виявила неоднозначне дерево

На початку я неправильно зрозумів, що таке "замовлення" (максимальна кількість дітей на вузол). Тому я подумав, що у вузла може бути три пробіли (і, отже, 4 дитини. Я створював дерево порядку 4, я думаю:

До введення 1,2,3:

введіть тут опис зображення

Вставку 4, наскільки нам потрібно розділити вузол і не перерозподіляти ключі сусідам (що здається суперечливим), я б пустив 1,2,3 і 4,5 на правому аркуші після 3:

B дерево порядку 3 після вставки 4 і 5

Відповіді:


6

Я думаю, у вас є створення сторінки догори ногами. Коли вузол розщеплюється не створює більше вузлів вниз по ієрархії (син вузлів у вашій номенклатурі). Натомість він створює більше вгору , до кореня. Як говориться в книзі

Зауважте, що зростання знаходиться на верхівці дерева, і це властива характеристика дерева 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-Дерево.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.