Які відмінності між сегментними деревами, інтервальними деревами, двійковими індексованими деревами та деревами діапазону?


200

Які відмінності між сегментальними деревами, інтервальними деревами, двійковими індексованими деревами та деревами діапазону у розрізі:

  • Ключова ідея / визначення
  • Програми
  • Продуктивність / порядок у великих розмірах / споживання місця

Будь ласка, не просто дайте визначення.


12
Це не дублікат. Це питання, якщо фенвікові дерева є узагальненням інтервальної траси, а моє питання більш конкретний та інший.
Aditya

7
На нього не відповіли на сайті stackoverflow.com/questions/2795989/… , відповідь там просто дає визначення.
Адітя

12
Як він занадто широкий? "Які існують відмінності між x і y?" настільки ж чітка і цілеспрямована, як це виходить. Це дуже гарне запитання.
IVlad

16
І немає хорошої відповіді на це, що є в будь-якому місці. Гарна відповідь буде чудовою для громади
Aditya

22
Більшість цих структур даних (крім дерев Fenwick) переглядаються в цьому PDF: "Інтервал, сегмент, діапазон та пріоритетні дерева пошуку" (автор Д.Т. Лі). Або ви можете прочитати це як розділ із цієї книги: "Довідник структур даних та програм" .
Євгеній Клюєв

Відповіді:


319

Усі ці структури даних використовуються для вирішення різних завдань:

  • Дерево сегмента зберігає інтервали та оптимізує для запитів " який із цих інтервалів містить задану точку ".
  • Інтервальне дерево також зберігає інтервали, але оптимізовано для запитів " який із цих інтервалів перетинається із заданим інтервалом ". Його також можна використовувати для точкових запитів - схоже на дерево сегмента.
  • Дерево діапазону зберігає точки та оптимізує для запитів " які точки потрапляють у заданий інтервал ".
  • Двійкове індексоване дерево зберігає кількість елементів на індекс та оптимізовано для запитів " скільки елементів існує між запитами m та n ".

Продуктивність / Споживання місця для одного виміру:

  • Дерево сегментів - час попередньої обробки O (n logn), O (k + logn) час запиту, O (n logn) простір
  • Інтервальне дерево - час попередньої обробки O (n logn), O (k + logn) час запиту, O (n) простір
  • Дерево діапазону - час попередньої обробки O (n logn), O (k + logn) час запиту, O (n) простір
  • Двійкове індексоване дерево - час попередньої обробки O (n logn), час запиту O (logn), O (n) простір

(k - кількість повідомлених результатів).

Всі структури даних можуть бути динамічними, в тому сенсі, що сценарій використання включає як зміни даних, так і запити:

  • Дерево сегментів - інтервал можна додавати / видаляти за час (час входу) (див. Тут )
  • Інтервальне дерево - інтервал можна додавати / видаляти за час O (реєстрації)
  • Дерево діапазону - нові точки можна додавати / видаляти за час (час входу) (див. Тут )
  • Бінарне індексоване дерево - кількість елементів на індекс може бути збільшена за O (час входу)

Більш високі розміри (d> 1):

  • Сегментне дерево - O (n (logn) ^ d) час попередньої обробки, O (k + (logn) ^ d) час запиту, O (n (logn) ^ (d-1)) простір
  • Інтервальне дерево - час попередньої обробки O (n logn), O (k + (logn) ^ d) час запиту, O (n logn) простір
  • Дерево діапазону - O (n (logn) ^ d) час попередньої обробки, O (k + (logn) ^ d) час запиту, O (n (logn) ^ (d-1))) простір
  • Двійкове індексоване дерево - O (n (logn) ^ d) час попередньої обробки, O ((logn) ^ d) час запиту, O (n (logn) ^ d) простір

12
Я дійсно складаю враження, що дерева сегментувати <інтервали дерев від цього. Чи є якась причина віддати перевагу сегментному дереву? Наприклад, простота реалізації?
j_random_hacker

7
@j_random_hacker: Алгоритми, засновані на деревах сегментів, мають переваги в певних складніших розмірних варіантах запиту інтервалів. Наприклад, знаходження, які не вісь-паралельні відрізки ліній перетинаються з 2D-вікном.
Ліор Коган

5
Дякую, я був би зацікавлений у будь-якій розробці, яку ви могли б надати з цього приводу.
j_random_hacker

3
@j_random_hacker, сегментні дерева мають ще одне цікаве використання: RMQ (діапазон мінімальних запитів) у час O (log N), де N - загальний розмір інтервалу.
ars-longa-vita-brevis

1
Чому сегментні дерева O (n log n) простір? Вони зберігають N листя + N / 2 + N / 4 + ... + N / 2 ^ (log N), і ця сума - O (N), якщо я не помиляюся. Також у відповіді @ icc97 також повідомляється про O (N) пробіл.
Мураха

24

Не те, що я можу додати що-небудь до відповіді Ліора , але здається, що це могло б зробити з хорошим столом.

Один вимір

k - кількість повідомлених результатів

|              | Segment       | Interval   | Range          | Indexed   |
|--------------|--------------:|-----------:|---------------:|----------:|
|Preprocessing |        n logn |     n logn |         n logn |    n logn |
|Query         |        k+logn |     k+logn |         k+logn |      logn |
|Space         |        n logn |          n |              n |         n |
|              |               |            |                |           |
|Insert/Delete |          logn |       logn |           logn |      logn |

Більш високі розміри

d > 1

|              | Segment       | Interval   | Range          | Indexed   |
|--------------|--------------:|-----------:|---------------:|----------:|
|Preprocessing |     n(logn)^d |     n logn |      n(logn)^d | n(logn)^d |
|Query         |    k+(logn)^d | k+(logn)^d |     k+(logn)^d |  (logn)^d |
|Space         | n(logn)^(d-1) |     n logn | n(logn)^(d-1)) | n(logn)^d |

Ці таблиці створені в Github Formatted Markdown - див. Цей Gist, якщо ви хочете, щоб таблиці були добре відформатовані.


2
Що ви маєте на увазі під повідомленими результатами?
Пратік Сінгал

@ ps06756 алгоритми пошуку часто мають час виконання журналу (n), де n - вхідний розмір, але можуть давати лінійні результати n, які неможливо виконати в логарифмічний час (виведення n чисел у журналі (n) час неможливий) .
oerpli

1
Чи не повинно бути дерево сегмента O(n logn) spaceу першій таблиці?
Danny_ds
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.