Сведение задачи RMQ к задаче LCA — различия между версиями
|  (→Построение дерева за линейное время) |  (→Сложность) | ||
| Строка 30: | Строка 30: | ||
| == Сложность == | == Сложность == | ||
| − | + | Следующий [[Декартово дерево#Построение декартова дерева|алгоритм]] строит декартово дерево за <tex>O(n)</tex>. Используя [[Сведение задачи LCA к задаче RMQ]], получаем: | |
| − | + | препроцессинг для <tex>LCA</tex> {{---}} <tex>O(n)</tex>, и ответ на запрос {{---}} <tex>O(1)</tex>.   | |
| − | В итоге получили <tex>RMQ</tex>  | + | В итоге получили <tex>RMQ</tex> с построением за <tex>O(n)</tex> и ответом на запрос за <tex>O(1)</tex>. | 
| + | |||
| == См.также == | == См.также == | ||
| *[[Сведение задачи LCA к задаче RMQ]] | *[[Сведение задачи LCA к задаче RMQ]] | ||
| ==Ссылки== | ==Ссылки== | ||
| *[http://e-maxx.ru/algo/rmq_linear Задача RMQ. Решение за O (1) с препроцессингом O (N)] | *[http://e-maxx.ru/algo/rmq_linear Задача RMQ. Решение за O (1) с препроцессингом O (N)] | ||
Версия 14:54, 21 июня 2012
Постановка задачи RMQ
Дан массив . Поступают запросы вида , на каждый запрос требуется найти минимум в массиве , начиная с позиции и заканчивая позицией .
Алгоритм
Декартово дерево (англ. сartesian tree) по неявному ключу на массиве — это бинарное дерево, допускающее следующее рекурсивное построение:
- Корнем дерева является элемент массива, имеющий минимальное значение , скажем . Если минимальных элементов несколько, можно взять любой.
- Левым поддеревом является декартово дерево на массиве .
- Правым поддеревом является декартово дерево на массиве .
Здесь и далее будет также использоваться для обозначения соответствующей вершины дерева.
Построим декартово дерево на массиве . Тогда = .
Доказательство
| Теорема: | 
|  = . | 
| Доказательство: | 
| Положим . Заметим, что и не принадлежат одновременно либо правому, либо левому поддереву , потому как тогда бы соответствующий сын находился на большей глубине, чем , и также являлся предком как так и , что противоречит определению . Из этого замечанию следует, что лежит между и и, следовательно, принадлежит отрезку . 
 
 | 
Сложность
Следующий алгоритм строит декартово дерево за . Используя Сведение задачи LCA к задаче RMQ, получаем: препроцессинг для — , и ответ на запрос — . В итоге получили с построением за и ответом на запрос за .
