Дерево диапазонов | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Тип | дерево | |||||||||||||||||
Изобретенный | 1979 | |||||||||||||||||
Изобретено | Джон Луис Бентли | |||||||||||||||||
|
В информатике ранговое дерево — это упорядоченная древовидная структура данных для хранения списка точек. Она позволяет эффективно сообщать обо всех точках в заданном диапазоне и обычно используется в двух или более измерениях. Ранговые деревья были введены Джоном Луисом Бентли в 1979 году. [1] Похожие структуры данных были независимо открыты Люкером, [2] Ли и Вонгом, [3] и Уиллардом. [4] Ранговое дерево является альтернативой k -d дереву . По сравнению с k -d деревьями ранговые деревья предлагают более быстрое время запроса (в нотации Big O ), но худшее хранение , где n — количество точек, хранящихся в дереве, d — измерение каждой точки, а k — количество точек, сообщаемых данным запросом.
В 1990 году Бернар Шазелл усовершенствовал этот метод, чтобы сделать запрос по сложности времени и пространства . [5] [6]
Дерево диапазонов на наборе одномерных точек — это сбалансированное бинарное дерево поиска на этих точках. Точки, хранящиеся в дереве, хранятся в листьях дерева; каждый внутренний узел хранит наибольшее значение своего левого поддерева. Дерево диапазонов на наборе точек в d -измерениях — это рекурсивно определенное многоуровневое бинарное дерево поиска . Каждый уровень структуры данных — это бинарное дерево поиска на одном из d -измерений. Первый уровень — это бинарное дерево поиска на первой из d -координат. Каждая вершина v этого дерева содержит связанную структуру, которая является ( d −1)-мерным деревом диапазонов на последних ( d −1)-координатах точек, хранящихся в поддереве v .
1-мерное дерево диапазонов на множестве из n точек — это бинарное дерево поиска, которое может быть построено со временем. Деревья диапазонов в более высоких измерениях строятся рекурсивно путем построения сбалансированного бинарного дерева поиска по первой координате точек, а затем для каждой вершины v в этом дереве строятся ( d −1)-мерное дерево диапазонов по точкам, содержащимся в поддереве v . Построение дерева диапазонов таким образом потребует времени.
Это время построения может быть улучшено для 2-мерных деревьев диапазонов до . [7] Пусть S будет набором из n 2-мерных точек. Если S содержит только одну точку, вернуть лист, содержащий эту точку. В противном случае построить связанную структуру S , 1-мерное дерево диапазонов по y -координатам точек в S . Пусть x m будет медианной x -координатой точек. Пусть S L будет набором точек с x -координатой, меньшей или равной x m , и пусть S R будет набором точек с x -координатой, большей x m . Рекурсивно построить v L , 2-мерное дерево диапазонов на S L , и v R , 2-мерное дерево диапазонов на S R . Создать вершину v с левым потомком v L и правым потомком v R . Если мы отсортируем точки по их y -координатам в начале алгоритма и сохраним этот порядок при разделении точек по их x -координате, мы можем построить связанные структуры каждого поддерева за линейное время. Это сокращает время построения двумерного дерева диапазонов до , а также сокращает время построения d -мерного дерева диапазонов до .
Запрос диапазона на дереве диапазонов сообщает набор точек, которые лежат внутри заданного интервала. Чтобы сообщить точки, которые лежат в интервале [ x 1 , x 2 ], мы начинаем с поиска x 1 и x 2 . В некоторой вершине дерева пути поиска к x 1 и x 2 будут расходиться. Пусть v split будет последней вершиной, которая является общей для этих двух путей поиска. Для каждой вершины v на пути поиска от v split до x 1 , если значение, сохраненное в v, больше x 1 , сообщить каждую точку в правом поддереве v . Если v является листом, сообщить значение, сохраненное в v , если оно находится внутри интервала запроса. Аналогично, сообщая все точки, сохраненные в левых поддеревьях вершин со значениями меньше x 2 вдоль пути поиска от v split до x 2 , и сообщить лист этого пути, если он находится внутри интервала запроса.
Поскольку дерево диапазонов является сбалансированным бинарным деревом, пути поиска к x 1 и x 2 имеют длину . Отчет обо всех точках, хранящихся в поддереве вершины, может быть выполнен за линейное время с использованием любого алгоритма обхода дерева . Из этого следует, что время выполнения запроса диапазона составляет , где k — количество точек в интервале запроса.
Запросы диапазона в d -измерениях похожи. Вместо того, чтобы сообщать все точки, хранящиеся в поддеревьях путей поиска, выполните запрос диапазона ( d −1) для связанной структуры каждого поддерева. В конечном итоге будет выполнен запрос диапазона 1 и будут сообщены правильные точки. Поскольку запрос измерения d состоит из запросов диапазона ( d −1)-мерных, следует, что время, необходимое для выполнения запроса диапазона d -мерных, составляет , где k — количество точек в интервале запроса. Это можно сократить до использования варианта дробного каскадирования . [2] [4] [7]