Каковы различия между деревьями сегментов, деревьями интервалов, двоичными индексированными деревьями и деревьями диапазона?

Каковы различия между деревьями сегментов, деревьями интервалов, двоичными индексированными деревьями и деревьями диапазона в терминах:

  • Основная идея/определение
  • Приложения
  • Производительность/порядок в более высоких измерениях/потреблении пространства

Пожалуйста, не просто дайте определения.

Ответ 1

Все эти структуры данных используются для решения различных задач:

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

Производительность/расход пространства для одного измерения:

  • Дерево сегментов - время предварительной обработки O (n logn), время вывода O (k + logn), O (n logn) space
  • Дерево интервала - время предварительной обработки 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 (logn) времени (см. здесь)
  • Дерево интервала - интервал может быть добавлен/удален в O (logn) time
  • Дерево диапазонов - новые точки могут быть добавлены/удалены в O (logn) времени (см. здесь)
  • Двоичное индексированное дерево - количество элементов для индекса может быть увеличено за время O (logn)

Более высокие размеры (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) пространство

Ответ 2

Не то, чтобы я мог добавить что-нибудь в Lior answer, но похоже, что это может быть сделано с хорошей таблицей.

Они создают таблицы в Github Formatted Markdown - см. Gist.

Одно измерение

k - количество сообщенных результатов

              | Segment       | Interval   | Range          | Indexed   |
--------------|--------------:|-----------:|---------------:|----------:|
Preprocessing |        n logn |     n logn |         n logn |    n logn |
Query         |        k+logn |     k+logn |         k+logn |      logn |
Space         |             n |          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 |

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