Многомерное дерево отрезков — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Анализ и оценка структуры)
Строка 1: Строка 1:
[[Дерево отрезков. Построение|Дерево отрезков]] можно обобщить в многомерный случай для решения таких задач, как поиск суммы на прямоугольнике(или гиперпрямоугольной области).
+
[[Дерево отрезков. Построение|Дерево отрезков]] можно обобщить в многомерный случай для решения таких задач, как поиск суммы на прямоугольнике (или гиперпрямоугольной области).
 
{{Задача
 
{{Задача
 
|definition=
 
|definition=
Рассматривается задача регионального поиска. Задано множество точек в <tex>p-</tex>мерном евклидовом пространстве. Образцом для поиска является гиперпрямоугольная область.Найти сумму/минимум/максимум.
+
Рассматривается задача регионального поиска. Задано множество точек в <tex>p</tex>-мерном евклидовом пространстве. Образцом для поиска является гиперпрямоугольная область. Найти сумму/минимум/максимум.
 
}}
 
}}
  
 
==Построение==
 
==Построение==
Пусть задано <tex>p</tex>-мерное пространство с координатными осями <tex>x_1, x_2, x_3...x_p</tex>.Т.к. при построении одномерного дерева, индексы массива разбиваются на отрезки, тогда при построении многомерного дерева координаты будут обрабатываться сначала по <tex>x_1 </tex>, затем по <tex>x_2</tex> и так далее...Далее дерево строится рекурсивно: далее координаты по <tex>x_1</tex> обрабатываем по координатам <tex>x_2</tex>, <tex>x_3</tex>(по всем возможным координатам)и далее по аналогии...То есть получается, что основная идея построения многомерного дерева отрезков - вкладывание деревьев отрезка друг в друга.
+
Пусть задано <tex>p</tex>-мерное пространство с координатными осями <tex>x_1, x_2, x_3...x_p</tex>. Т.к. при построении одномерного дерева, индексы массива разбиваются на отрезки, тогда при построении многомерного дерева координаты будут обрабатываться сначала по <tex>x_1 </tex>, затем по <tex>x_2</tex> и так далее... Далее дерево строится рекурсивно: далее координаты по <tex>x_1</tex> обрабатываем по координатам <tex>x_2</tex>, <tex>x_3</tex> (по всем возможным координатам) и далее по аналогии... То есть получается, что основная идея построения многомерного дерева отрезков - вкладывание деревьев отрезка друг в друга.
  
 
Пример задачи, в которой удобно использовать многомерное дерево отрезков
 
Пример задачи, в которой удобно использовать многомерное дерево отрезков
 
==Пример двумерного дерева==
 
==Пример двумерного дерева==
 
Рассмотрим процесс построения предельного случая при <tex>p = 2</tex>.
 
Рассмотрим процесс построения предельного случая при <tex>p = 2</tex>.
Пусть задан массив элементов  размера <tex>n \times m</tex>.Упорядочим массив по первой координате и построим на нем дерево отрезков.После этого для каждого узла дерева строим еще одно дерево отрезков по координате <tex>y</tex>, которые находятся на том же отрезке.  
+
Пусть задан массив элементов  размера <tex>n \times m</tex>. Упорядочим массив по первой координате и построим на нем дерево отрезков. После этого для каждого узла дерева строим еще одно дерево отрезков по координате <tex>y</tex>, которые находятся на том же отрезке.  
  
 
К примеру,двумерное дерево размером <tex>4 \times 4 :</tex>
 
К примеру,двумерное дерево размером <tex>4 \times 4 :</tex>
Строка 21: Строка 21:
 
Структура использует <tex>O(n^p)</tex>  памяти, и отвечает на запрос за <tex>O(log^{p} n)</tex>, где <tex>p</tex>-размерность дерева.
 
Структура использует <tex>O(n^p)</tex>  памяти, и отвечает на запрос за <tex>O(log^{p} n)</tex>, где <tex>p</tex>-размерность дерева.
  
Ответ на запрос в таком дереве будет производиться так же,как и построение: сначала по координате <tex>x_1</tex>, затем, когда дошли до какой-либо вершины по первой координате, вызвать запрос от этого же дерева по <tex>x_2</tex> и так далее.Получается, что для <tex>n-</tex>мерного дерева запрос выполняется за <tex>O(log (s_{x_1})* log (s_{x_2})...log (s_{x_n}))</tex> (для рассмотренного двумерного дерева будет <tex>log (n) * log (m) </tex> )
+
Ответ на запрос в таком дереве будет производиться так же,как и построение: сначала по координате <tex>x_1</tex>, затем, когда дошли до какой-либо вершины по первой координате, вызвать запрос от этого же дерева по <tex>x_2</tex> и так далее. Получается, что для <tex>n-</tex>мерного дерева запрос выполняется за <tex>O(log (s_{x_1})\cdot log (s_{x_2})...log (s_{x_n}))</tex> (для рассмотренного двумерного дерева будет <tex>log (n) \cdot log (m) </tex> )
  
 
==Источники==
 
==Источники==
e-maxx.ru: [http://e-maxx.ru/algo/segment_tree Дерево отрезков] <br/>
+
*e-maxx.ru: [http://e-maxx.ru/algo/segment_tree Дерево отрезков] <br/>
F. P. Preparata, M.I. Shamos - Вычислительная геометрия [http://pogorskiy.narod.ru/rectq.htm Главы о региональном поиске]
+
*F. P. Preparata, M.I. Shamos - Вычислительная геометрия [http://pogorskiy.narod.ru/rectq.htm Главы о региональном поиске]
  
 
==См. также==
 
==См. также==
[[Дерево отрезков. Построение]] <br/>
+
*[[Дерево отрезков. Построение]] <br/>
[[Сжатое многомерное дерево отрезков]] <br/>
+
*[[Сжатое многомерное дерево отрезков]] <br/>
[[Многомерное дерево Фенвика]] <br/>
+
*[[Многомерное дерево Фенвика]] <br/>

Версия 21:41, 15 июня 2011

Дерево отрезков можно обобщить в многомерный случай для решения таких задач, как поиск суммы на прямоугольнике (или гиперпрямоугольной области).

Задача:
Рассматривается задача регионального поиска. Задано множество точек в [math]p[/math]-мерном евклидовом пространстве. Образцом для поиска является гиперпрямоугольная область. Найти сумму/минимум/максимум.


Построение

Пусть задано [math]p[/math]-мерное пространство с координатными осями [math]x_1, x_2, x_3...x_p[/math]. Т.к. при построении одномерного дерева, индексы массива разбиваются на отрезки, тогда при построении многомерного дерева координаты будут обрабатываться сначала по [math]x_1 [/math], затем по [math]x_2[/math] и так далее... Далее дерево строится рекурсивно: далее координаты по [math]x_1[/math] обрабатываем по координатам [math]x_2[/math], [math]x_3[/math] (по всем возможным координатам) и далее по аналогии... То есть получается, что основная идея построения многомерного дерева отрезков - вкладывание деревьев отрезка друг в друга.

Пример задачи, в которой удобно использовать многомерное дерево отрезков

Пример двумерного дерева

Рассмотрим процесс построения предельного случая при [math]p = 2[/math]. Пусть задан массив элементов размера [math]n \times m[/math]. Упорядочим массив по первой координате и построим на нем дерево отрезков. После этого для каждого узла дерева строим еще одно дерево отрезков по координате [math]y[/math], которые находятся на том же отрезке.

К примеру,двумерное дерево размером [math]4 \times 4 :[/math]

Многомерное до.jpg

Анализ и оценка структуры

Строится такое дерево за линейное время. Структура использует [math]O(n^p)[/math] памяти, и отвечает на запрос за [math]O(log^{p} n)[/math], где [math]p[/math]-размерность дерева.

Ответ на запрос в таком дереве будет производиться так же,как и построение: сначала по координате [math]x_1[/math], затем, когда дошли до какой-либо вершины по первой координате, вызвать запрос от этого же дерева по [math]x_2[/math] и так далее. Получается, что для [math]n-[/math]мерного дерева запрос выполняется за [math]O(log (s_{x_1})\cdot log (s_{x_2})...log (s_{x_n}))[/math] (для рассмотренного двумерного дерева будет [math]log (n) \cdot log (m) [/math] )

Источники

См. также