Чи двійкові дерева служать певній меті для зберігання ієрархічних даних? У чому полягає їх канонічне використання?


12

Я розумію структуру двійкових дерев і як їх перетинати. Однак я намагаюся усвідомити їх фактичне використання, цілі в програмах та програмуванні. Коли я замислююсь над „реальним життям” на прикладі ієрархічних даних, вони майже напевно мають понад 2 дітей. Наприклад, у родинному дереві мати часто може мати більше двох дітей.

Чи справді "бінарні дерева" корисні лише для зберігання лінійно пов'язаних даних за рахунок більш швидкого часу обробки масивів та списків? Як варіант, чи служать вони певній меті для зберігання ієрархічних даних? Якщо так, то які приклади застосування бінарних дерев. Які дані такі, що у вузла є щонайбільше 2 дітей?


Я думаю, що основне використання бінарного дерева - це замовлення даних. https://en.wikipedia.org/wiki/Binary_search_tree
Mandrill

Відповіді:


25

Ні, бінарні дерева не для зберігання ієрархічних даних у тому сенсі, про який ви думаєте. Основним випадком використання для n-арних дерев, де nє фіксоване число, є можливість швидкого пошуку , а не семантична ієрархія.

Згадайте стару гру, де одна людина думає про число від 1 до 100, а інша повинна здогадуватися про неї якомога менше здогадок, і якщо ви гадаєте неправильно, людина, яка думає про число, повинна повідомити вам, чи занадто ви високий чи занадто низький? Через деякий час стає нудно, тому що ви швидко зрозумієте, що завжди слід починати з 50, потім переходити до 25 або 75 і продовжувати ділити діапазон, який потрібно шукати навпіл, з кожним новим здогадом після цього, і врешті-решт, ви зможете вгадати будь-яке число максимум у 7 здогадах, гарантовано.

Це може не зробити веселою грою, але ця властивість робить те, що робить бінарні (та інші n-ary) дерева корисними: ви можете використовувати їх для пошуку дуже великого набору даних за дуже малий час.


Відмінна відповідь велике спасибі Отже, бінарне дерево - це справді лише інша структура для зберігання даних, таких як ви були б у масиві чи списку, але з додатковою перевагою можливостей швидкого пошуку?
sw123456

1
@ sw123456: Правильно. Як і будь-яка інженерія, вона стосується компромісів (використовує більше - і більш фрагментовану - пам'ять, ніж масив з однаковою кількістю елементів, O (n) доступ до елемента #n набору даних, а не O (1) доступ тощо), але швидкий пошук, безумовно, є головною перевагою бінарних дерев.
Мейсон Уілер

@ sw123456 Радий, що можу допомогти пояснити це :)
Мейсон Уілер

3
Доступ до елементів є O (log (n)), коли дерево збалансовано. O (n) буде найгіршим випадком, коли він буде виродженим (більшість вузлів лише з одним дужкою).
Mandrill

@ sw123456 Маршрутизація в мережі використовує незначну модифікацію бінарного дерева під назвою Trie (створена для більшої ефективності для проблемного домену). Він фактично зберігає інформацію про ієрархію, оскільки маршрутизатори обробляють дерево побітно, коли шукає IP-адресу, щоб знайти, куди він повинен пересилати пакет. IP-адреси також є ієрархічними за своєю природою, тому при обходженні IP-адреси для пошуку найдовшого збігу префіксів маршрутизатор здійснює обхід ієрархії ІР, IP-підмережі тощо. Семантично це не очевидно, але взаємозв'язок існує. Маршрутизатори використовують цю структуру для ефективності пошуку, як відповів Мейсон.
Кріс Сірефіс

3

Будь-яка структура дерева, де вузол може мати необмежену кількість дітей, може бути реалізована за допомогою двійкового дерева.

Для кожного вузла вашого дерева замініть його на вузол правою та лівою вказівкою. Лівий покажчик переходить до першого з вузлів дітей. Правий вузол переходить до наступного брати вузла. Усі діти даного вузла перебувають у пов'язаному списку, з'єднаному їх правими вказівниками, при цьому заголовком списку вказується лівий вказівник їхнього батька.

Ваше складне, n-ary дерево стало простим, бінарним деревом.

Я впевнений, що це в Knuth, Vol. 1 десь.


Це дійсно цікава реалізація. Я маю рацію, думаючи, що оскільки кожен дочірній вузол був початком зв'язаного списку, дерево більше не буде O (log) n), якщо збалансованим, або O (n), якщо ні, через те, що відвідування кожного вузла розпочнеться від лінійного пошуку? Ця реалізація призведе до набагато повільніших часів пошуку? Але вгору часи пошуку були б швидшими, ніж у стандартної лінійної структури? Я правильно це зрозумів?
sw123456

@ sw123456, Якби початкове дерево було врівноваженим, отримане бінарне дерево майже точно не було б. Я вважаю, що все інше залежатиме від вентилятора з дерева, скільки дітей має будь-який вузол. Лінійний пошук відбуватиметься лише при з’ясуванні, кого з дітей певного вузла слід. Але я не впевнений, що ви могли цього уникнути в будь-якій іншій реалізації дерев яного типу.
Justsalt

2

Двійкові дерева навіщо їх використовувати?

У програмуванні ви багато працюєте з колекціями даних одного типу.

Два основні способи зберігання цих даних: пов'язані списки та масиви.

Вони обидва мають і недоліки: у пов'язаному списку легко додавати елементи в будь-яку позицію або видаляти елементи. Але доступ до певного елемента складніше, тому що вам доведеться пройти список, поки ви не знайдете потрібний елемент.

  • Він не працює ефективно, але вставити та видалити дуже просто.

За допомогою масиву доступ до конкретного елемента простий, але важче вставити або видалити елемент, оскільки вставляє засоби: розширити масив на один, змістити всі елементи перед позицією 1 вставки праворуч та вставити елемент.

  • Він здійснює пошук ефективно (якщо відсортовано), але вставити та видалити важко.

Отже, і пов'язаний список, і масив мають мінуси.

Бінарні дерева створені для вирішення як проблем масиву, так і пов'язаного списку:

  1. Легке вставлення та видалення
  2. Легкий пошук

Отже, бінарне дерево створюється, коли у вас є маса даних, які регулярно змінюються.

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