Дерево сегментов

редактировать

В информатике, дерево сегментов, также известное как дерево статистики, представляет собой дерево структуру данных, используемую для хранения информации о интервалах или сегментах. Он позволяет запросить, какой из сохраненных сегментов содержит данную точку. В принципе, это статическая структура; то есть это структура, которую нельзя изменить после постройки. Подобной структурой данных является дерево интервалов.

Сегментное дерево для набора I из n интервалов использует O (n log n) хранилище и может быть построено за O (n log n) время.. Деревья сегментов поддерживают поиск всех интервалов, содержащих точку запроса в O (log n + k), где k - количество извлеченных интервалов или сегментов.

Приложения дерева сегментов находятся в областях вычислительная геометрия и географические информационные системы.

Сегментное дерево может быть обобщено на пространства более высокого измерения.

Содержание
  • 1 Описание структуры
  • 2 Требования к хранилищу
  • 3 Конструкция
  • 4 Запрос
  • 5 Обобщение для более высоких измерений
  • 6 Примечания
  • 7 История
  • 8 Ссылки
  • 9 Процитированные источники
  • 10 Внешние ссылки
Описание структуры

В этом разделе описывается структура дерева сегментов в одномерном пространстве.

Пусть S будет набором интервалов или сегментов. Пусть p 1, p 2,..., p m будет списком отдельных конечных точек интервала, отсортированных слева направо. Рассмотрим разбиение вещественной прямой, вызванное этими точками. Области этого разбиения называются элементарными интервалами. Таким образом, элементарные интервалы слева направо:

(- ∞, p 1), [p 1, p 1], (p 1, p 2), [p 2, p 2],…, ( pm - 1, pm), [pm, pm], (pm, + ∞) {\ displaystyle (- \ infty, p_ {1}), [p_ {1}, p_ {1}], (p_ {1}, p_ {2}), [p_ {2}, p_ {2}], \ dots, (p_ {m-1}, p_ {m}), [p_ {m}, p_ {m}], (p_ {m}, + \ infty)}{\ displaystyle (- \ infty, p_ {1}), [p_ {1}, p_ {1}], (p_ {1}, p_ {2}), [p_ {2}, p_ {2}], \ dots, (p_ {m-1}, p_ {m}), [p_ {m}, p_ {m}], (p_ {m}, + \ infty)}

То есть список элементарных интервалов состоит из открытых интервалов между двумя последовательными конечными точками p i и p i + 1, чередующихся с закрытые интервалы, состоящие из одной конечной точки. Отдельные точки рассматриваются как интервалы, потому что ответ на запрос не обязательно будет одинаковым внутри элементарного интервала и его конечных точек.

Графический пример структуры дерева сегментов. Этот экземпляр построен для сегментов, показанных внизу.

Учитывая набор I интервалов или сегментов, дерево сегментов T для I структурировано следующим образом:

  • T - это двоичное дерево.
  • Его листья соответствуют элементарным интервалам, индуцированным конечными точками в I, упорядоченным образом: крайний левый лист соответствует крайнему левому интервалу и т. Д. Элементарный интервал, соответствующий листу v, обозначается Int (v).
  • внутренние узлы T соответствуют интервалам, которые являются объединением элементарных интервалов: Интервал Int (N), соответствующий узлу N, представляет собой объединение интервалов, соответствующих листьям дерева с корнем в N. Это означает, что Int (N) является объединением интервалов двух его дочерних элементов.
  • Каждый узел или лист v в T хранит интервал Int (v) и набор интервалов в некоторой структуре данных. Это каноническое подмножество узла v содержит интервалы [x, x ′] из I, такие что [x, x ′] содержит Int (v) и не содержит Int (parent (v)). То есть каждый узел в T хранит сегменты, которые охватывают его интервал, но не охватывают интервал его родительского элемента.
Требования к хранилищу

В этом разделе анализируется стоимость хранения дерева сегментов в одномерное пространство.

Сегментное дерево T на множестве I из n интервалов использует память O (n log n).

Лемма - Любой интервал [x, x ′] из I сохраняется в каноническом наборе не более чем для двух узлов на одинаковой глубине.

Доказательство -

Пусть v 1, v 2, v 3 - три узла на одной глубине, пронумерованные слева направо; и пусть p (v) будет родительским узлом любого заданного узла v. Предположим, что [x, x '] хранится в v 1 и v 3. Это означает, что [x, x '] охватывает весь интервал от левой конечной точки Int (v 1) до правой конечной точки Int (v 3). Обратите внимание, что все сегменты на определенном уровне не перекрываются и упорядочены слева направо: это верно по конструкции для уровня, содержащего листья, и свойство не теряется при переходе с любого уровня на уровень выше, путем объединения пар смежных сегментов. Теперь либо parent (v 2) = parent (v 1), либо первый находится справа от последнего (ребра в дереве не пересекаются). В первом случае крайняя левая точка Int (parent (v 2)) совпадает с крайней левой точкой Int (v 1); во втором случае крайняя левая точка Int (parent (v 2)) находится справа от крайней правой точки Int (parent (v 1)), и, следовательно, также справа от крайней правой точки Int (v 1). В обоих случаях Int (parent (v 2)) начинается в самой левой точке Int (v 1) или справа от нее. Аналогичные рассуждения показывают, что Int (parent (v 2)) заканчивается в самой правой точке Int (v 3) или слева от нее. Следовательно, Int (parent (v 2)) должен содержаться в [x, x ′]; следовательно, [x, x ′] не будет храниться в v 2.

Набор I имеет не более 4n + 1 элементарных интервалов. Поскольку T - это двоичное сбалансированное дерево с не более чем 4n + 1 листом, его высота равна O (log n). Поскольку любой интервал сохраняется не более двух раз на заданной глубине дерева, общий объем памяти равен O (n log n).
Конструкция

В этом разделе описывается построение дерева сегментов в одномерное пространство.

Сегментное дерево из множества сегментов I можно построить следующим образом. Сначала сортируются конечные точки интервалов в I. Из этого получаются элементарные интервалы. Затем на элементарных интервалах строится сбалансированное двоичное дерево, и для каждого узла v определяется интервал Int (v), который он представляет. Осталось вычислить канонические подмножества узлов. Для этого интервалы в I вставляются один за другим в дерево сегментов. Интервал X = [x, x ′] может быть вставлен в поддерево с корнем в T, используя следующую процедуру:

  • Если Int (T) содержится в X, сохранить X в T и закончить.
  • Иначе:
    • Если X пересекает интервал левого дочернего элемента T, то вставьте X в этот дочерний элемент рекурсивно.
    • Если X пересекает интервал правого дочернего элемента T, то вставить X в этот дочерний элемент рекурсивно.

Полная операция построения занимает O (n log n) времени, n - количество сегментов в I.

Доказательство —
Сортировка конечных точек занимает O (n log n). Построение сбалансированного двоичного дерева из отсортированных конечных точек занимает линейное время на n.
Вставка интервала X = [x, x ′] в дерево стоит O (log n).
Доказательство. -

Посещение каждого узла занимает постоянное время (при условии, что канонические подмножества хранятся в простой структуре данных, такой как связанный список ). Когда мы посещаем узел v, мы либо сохраняем X в v, либо Int (v) содержит конечную точку X. Как доказано выше, интервал сохраняется не более двух раз на каждом уровне дерева. Также существует не более одного узла на каждом уровне, чей соответствующий интервал содержит x, и один узел, интервал которого содержит x '. Таким образом, посещается не более четырех узлов на каждом уровне. Поскольку существует O (log n) уровней, общая стоимость вставки равна O (log n).

Запрос

В этом разделе описывается операция запроса дерева сегментов в одномерном пространстве.

Запрос дерева сегментов, получает точку q x (должен быть одним из листьев дерева) и извлекает список всех сохраненных сегментов, которые содержат точку q x.

Официально заявлено; учитывая узел (поддерево) v и точку запроса q x, запрос может быть выполнен с использованием следующего алгоритма:

  • Сообщить обо всех интервалах в I (v).
  • Если v не является листом:
    • Если q x находится в Int (левый дочерний элемент v), то
      • Выполните запрос в левом дочернем элементе v.
    • Если q x находится в Int (правый дочерний элемент v), то
      • Выполните запрос в правом дочернем элементе v.

В дереве сегментов, которое содержит n интервалов, те, которые содержат о заданной точке запроса можно сообщить за время O (log n + k), где k - количество отчетных интервалов.

Доказательство -

Алгоритм запроса посещает один узел на каждом уровне дерева, так что всего O (log n) узлов. С другой стороны, в узле v сегменты в I сообщаются за время O (1 + k v), где k v - количество интервалов в узле v, сообщил. Сумма всех k v для всех посещенных узлов v равна k, числу сегментов, о которых сообщается.

Обобщение для более высоких измерений

Дерево сегментов может быть обобщено для более высоких измерений пространства в виде многоуровневых сегментных деревьев. В версиях с более высокой размерностью сегментное дерево хранит коллекцию параллельных осям (гипер-) прямоугольников и может извлекать прямоугольники, содержащие заданную точку запроса. Структура использует хранилище O (n log n) и отвечает на запросы за O (log n).

Использование дробного каскадирования снижает время запроса, ограниченное логарифмическим коэффициентом. Использование дерева интервалов на самом глубоком уровне связанных структур снижает ограничение памяти на логарифмический коэффициент.

Примечания

Запрос, который запрашивает все интервалы, содержащие данную точку часто называют острым запросом.

Дерево сегментов менее эффективно, чем дерево интервалов для запросов диапазона в одном измерении, из-за более высоких требований к памяти: O (n log n) против O (n) интервального дерева. Важность дерева сегментов состоит в том, что сегменты внутри канонического подмножества каждого узла могут быть сохранены любым произвольным образом.

Для n интервалов, конечные точки которых находятся в диапазоне малых целых чисел (например, в диапазоне [1,…, O (n)]) существуют оптимальные структуры данных с линейным временем предварительной обработки и временем запроса O (1 + k) для сообщения всех k интервалов, содержащих заданную точку запроса.

Еще одно преимущество дерева сегментов состоит в том, что его можно легко адаптировать для подсчета запросов; то есть, чтобы сообщить количество сегментов, содержащих данную точку, вместо того, чтобы сообщать сами сегменты. Вместо того, чтобы хранить интервалы в канонических подмножествах, он может просто хранить их количество. Такое дерево сегментов использует линейное хранилище и требует времени запроса O (log n), поэтому оно является оптимальным.

Версии дерева интервалов с более высокой размерностью и приоритетное дерево поиска не работают. существовать; то есть не существует четкого расширения этих структур, которое решает аналогичную проблему в более высоких измерениях. Но эти структуры можно использовать как связанную структуру деревьев сегментов.

История

Дерево сегментов было изобретено Джоном Луи Бентли в 1977 году; в «Решениях проблем прямоугольника Кли».

Ссылки
Цитированные источники
Внешние ссылки
Последняя правка сделана 2021-06-07 08:54:41
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте