b tree b tree data structure c
Цей підручник з C ++ пояснює структуру даних B Tree & B + Tree. Вони використовуються для зберігання даних на дисках, коли цілі дані неможливо зберегти в основній пам'яті:
B-дерево - це самозбалансоване дерево, а також спеціалізоване дерево m-way, яке використовується для доступу до диска.
Коли обсяг даних, які слід зберегти, дуже великий, ми не можемо зберігати всі дані в основній пам’яті. Отже, ми зберігаємо дані на диску. Доступ до даних з диска займає більше часу в порівнянні з доступом до основної пам'яті.
Коли кількість ключів даних, що зберігаються на дисках, дуже велика, доступ до даних зазвичай здійснюється у вигляді блоків. Час доступу до цих блоків прямо пропорційний висоті дерева.
=> Клацніть тут, щоб переглянути абсолютну серію навчальних програм C ++.
Що ви дізнаєтесь:
B-дерево в C ++
B-Tree - це плоске дерево, тобто висота B-дерева зведена до мінімуму. Натомість у кожен вузол B-дерева вкладається стільки ключів. Зберігаючи висоту B-дерева на мінімумі, доступ стає швидшим у порівнянні з іншими збалансованими деревами, такими як дерева AVL.
Типове B-дерево показано нижче:
додаток картки часу для iphone та android
Як правило, розмір вузла в B-дереві зберігається таким же, як розмір блоку.
Нижче наведено деякі властивості B-Tree.
- Всі листя B-дерева знаходяться на одному рівні.
- B-дерево порядку m може мати не більше m-1 ключів і m дітей.
- Кожен вузол у B-дереві має не більше m дітей.
- Кореневий вузол повинен мати принаймні два вузли.
- Кожен вузол, крім кореневого вузла та листового вузла, містить m / 2 дітей.
Далі ми обговоримо деякі основні операції B-дерева.
Основні операції B-дерева
Нижче наведено деякі основні операції B-Tree.
# 1) Пошук
Пошук у дереві B подібний до пошуку в BST. У наведеному вище дереві, якщо ми хочемо шукати пункт 3, ми будемо діяти наступним чином:
- Порівняйте 3 з елементами кореня. Тут, 3<6 and 3 <15. So we proceed to the left subtree.
- Порівняйте 3 із 4 у лівому піддереві. Як 3<4, we proceed to the left subtree of node 4.
- Наступний вузол має два ключі, 2 і 3. 3> 2, тоді як 3 = 3. Отже, ми знайшли ключ у цьому вузлі. Поверніться до знайденого місця.
Пошук у дереві B залежить від висоти дерева. Зазвичай для пошуку даного елемента потрібен час O (log n).
# 2) Вставка
Вставка нового елемента в дерево B виконується на рівні вузлів листя.
Нижче наведена послідовність кроків (алгоритм) для вставки нового елемента в дерево B.
- Проведіть дерево B, щоб знайти місце у вузлах листя, щоб вставити предмет.
- Якщо листовий вузол містить ключі
- В іншому випадку, якщо ключі вузла листа = m-1, тоді:
- Вставте новий елемент у все більшу кількість елементів.
- Візьміть медіану вузлів і розділіть вузол на два вузли.
- Просуньте медіану до батьківського вузла.
- Якщо ключ батьківського вузла = m-1, повторіть наведені вище дії також для батьківського вузла. Це робиться до тих пір, поки ми не знайдемо відповідний листовий вузол.
- Нарешті, вставте елемент.
- В іншому випадку, якщо ключі вузла листа = m-1, тоді:
Ми продемонстрували вставку в дерево B наступним чином.
Давайте вставимо елемент 70 у дерево, показано нижче.
шлюз Windows 10 за замовчуванням недоступний
Дане дерево має мінімальний ступінь «m» = 3. Отже, кожен вузол може вмістити 2 * m -1 = 5 ключів усередині нього.
Тепер ми вставляємо елемент 70. Оскільки ми можемо мати 5 ключів у вузлі, ми порівнюємо елемент 70 з кореневим елементом 30. Оскільки 70> 30, ми вставимо елемент 70 у праве піддерево.
У правому піддереві ми маємо вузол з ключами 40, 50, 60. Оскільки кожен вузол може містити в собі 5 ключів, ми вставимо елемент 70 у сам цей вузол.
Після вставки B-Tree виглядає наступним чином.
# 3) Видалення
Подібно до вставки, видалення ключа також здійснюється на рівні вузлів листа. Але на відміну від вставки, видалення складніше. Ключем, який потрібно видалити, може бути або листовий вузол, або внутрішній вузол.
Щоб видалити ключ, ми виконуємо наведену нижче послідовність кроків (алгоритм).
1. Знайдіть листовий вузол.
два. Якщо кількість ключів у вузлі> m / 2, видаліть даний ключ із вузла.
3. Якщо у листовому вузлі немає ключів m / 2, тоді нам потрібно заповнити ключі, взявши ключі з правого або лівого піддерев, щоб підтримувати дерево B.
Ми виконуємо такі дії:
- Якщо ліве піддерево містить m / 2 елементів, тоді ми підштовхуємо його найбільший елемент до батьківського вузла, а потім переміщуємо проміжний елемент туди, де був видалений ключ.
- Якщо праве піддерево містить m / 2 елементів, тоді ми передаємо його найменший елемент на батьківський вузол, а потім переміщуємо проміжний елемент туди, де був видалений ключ.
Чотири. Якщо жоден вузол не має m / 2 вузлів, то описані вище дії неможливо виконати, таким чином ми створюємо новий листовий вузол, поєднуючи два листові вузли та проміжний елемент батьківського вузла.
5. Якщо батько не має m / 2 вузлів, то ми повторюємо вищезазначені кроки для відповідного батьківського вузла. Ці кроки повторюються, поки ми не отримаємо збалансоване дерево B.
Нижче наведено ілюстрацію для видалення вузла з дерева B.
Розглянемо ще раз таке Б-дерево.
Припустимо, що ми хочемо видалити ключ 60 з дерева В. Якщо ми перевіримо дерево B, ми зможемо виявити, що ключ, який потрібно видалити, присутній у листовому вузлі. Ми видаляємо ключ 60 з цього листового вузла.
Тепер дерево буде виглядати так, як показано нижче:
Ми можемо помітити, що після видалення ключа 60 вузол листя дерева B задовольняє необхідним властивостям, і нам не потрібно більше вносити зміни в дерево B.
Однак, якби нам довелося видалити ключ 20, то у лівому вузлі листа залишився б лише ключ 10. У цьому випадку нам довелося б перемістити корінь 30 до листового вузла і перемістити ключ 40 до кореня.
Таким чином, під час видалення ключа з дерева B слід бути обережним і не порушувати властивості дерева B.
Обхід в B-дереві
Обхід в дереві B також подібний до обходу в BST. Ми починаємо рекурсивно зліва, а потім приходимо до кореня і рухаємось до лівого піддерева.
Як додати елемент до масиву в Java
Застосування дерев В
- Дерева B використовуються для індексації даних, особливо у великих базах даних, оскільки доступ до даних, що зберігаються у великих базах даних на дисках, займає багато часу.
- Пошук даних у більших невідсортованих наборах даних займає багато часу, але це можна значно покращити за допомогою індексації за допомогою дерева B.
Дерево B + у C ++
Дерево B + є продовженням дерева B. Різниця у дереві B + та дереві B полягає в тому, що в дереві B ключі та записи можуть зберігатися як внутрішні, так і як листові вузли, тоді як у деревах B + записи зберігаються як листові вузли, а ключі зберігаються лише у внутрішніх вузлах.
Записи пов’язані між собою у зв’язаному списку. Така домовленість робить пошук дерев В + більш швидким та ефективним. Внутрішні вузли дерева B + називаються вузлами індексу.
Дерева B + мають два порядки, тобто один для внутрішніх вузлів, а інший для листових або зовнішніх вузлів.
Приклад дерева B + показано нижче.
Оскільки B + дерево є продовженням B-дерева, основні операції, які ми обговорювали в темі B-дерево, досі зберігаються.
Під час вставки та видалення ми повинні зберігати основні властивості дерев B + у цілості. Однак операція видалення в дереві B + є порівняно простішою, оскільки дані зберігаються лише у листових вузлах, і вони будуть видалятися з вузлів листа завжди.
Переваги дерев В +
- Ми можемо отримувати записи в однаковій кількості звернень до диска.
- У порівнянні з деревом B висота дерева B + менша і залишається збалансованою.
- Ми використовуємо ключі для індексації.
- Доступ до даних у дереві B + можна отримати послідовно або безпосередньо, коли вузли листів розташовані у зв’язаному списку.
- Пошук здійснюється швидше, оскільки дані зберігаються лише у вузлах листя та у вигляді зв’язаного списку.
Різниця між B-Tree та B + Tree
B-Tree | B + Дерево |
---|---|
Дані зберігаються в листових вузлах, а також у внутрішніх вузлах. | Дані зберігаються лише в листових вузлах. |
Пошук відбувається трохи повільніше, оскільки дані зберігаються як у внутрішніх, так і в листових вузлах. | Пошук відбувається швидше, оскільки дані зберігаються лише у листових вузлах. |
Немає надлишкових клавіш пошуку. | Можуть бути резервні клавіші пошуку. |
Операція видалення є складною. | Операція видалення проста, оскільки дані можна безпосередньо видалити з листових вузлів. |
Листові вузли не можуть бути пов’язані між собою. | Листові вузли пов’язані між собою, утворюючи зв’язаний список. |
Висновок
У цьому підручнику ми детально обговорили B-дерево та B + дерево. Ці дві структури даних використовуються, коли даних дуже багато і коли цілі дані не можуть бути збережені в основній пам'яті. Таким чином, для зберігання даних на дисках ми використовуємо B-дерево та B + дерево.
Пошук B-дерева відбувається дещо повільніше, оскільки дані зберігаються як у внутрішніх вузлах, так і в листових вузлах у ньому. Дерево B + є розширенням дерева B, і дані тут зберігаються лише у листових вузлах. Завдяки цьому фактору пошук у дереві B + відбувається швидше та ефективніше.
=> Відвідайте тут, щоб отримати повний список підручників з C ++.
Рекомендована література
- Структура даних дерева та купи AVL у C ++
- Структура даних зв’язаного списку на C ++ з ілюстрацією
- Структура даних черги в C ++ з ілюстрацією
- Структура даних стеку в C ++ з ілюстрацією
- Структура даних кругового зв’язаного списку на C ++ з ілюстрацією
- Вступ до структур даних на C ++
- Структура даних черги пріоритетів у C ++ з ілюстрацією
- Подвійно пов’язана структура даних списку на C ++ з ілюстрацією