Сведение задачи RMQ к задаче LCA — различия между версиями
м (→Сложность) |
|||
Строка 4: | Строка 4: | ||
== Алгоритм == | == Алгоритм == | ||
+ | ===Описание=== | ||
[[Файл:Wiki.PNG|thumb|right|300x150px|Пример декартового дерева]] | [[Файл:Wiki.PNG|thumb|right|300x150px|Пример декартового дерева]] | ||
Для нахождения минимума на отрезке будем использовать информацию о наименьшем общем предке. Для хранения наименьших общих предков будем использовать [[декартово дерево по неявному ключу]]. | Для нахождения минимума на отрезке будем использовать информацию о наименьшем общем предке. Для хранения наименьших общих предков будем использовать [[декартово дерево по неявному ключу]]. | ||
Строка 17: | Строка 18: | ||
<br clear="all"> | <br clear="all"> | ||
− | == | + | === Корректность === |
{{Теорема | {{Теорема | ||
|statement= | |statement= | ||
Строка 34: | Строка 35: | ||
}} | }} | ||
− | == Сложность == | + | === Сложность === |
Существует [[Декартово дерево#Построение декартова дерева|алгоритм]], который строит декартово дерево за <tex>O(n)</tex>. Используя [[Сведение задачи LCA к задаче RMQ | алгоритм построения LCA]], получаем: | Существует [[Декартово дерево#Построение декартова дерева|алгоритм]], который строит декартово дерево за <tex>O(n)</tex>. Используя [[Сведение задачи LCA к задаче RMQ | алгоритм построения LCA]], получаем: | ||
препроцессинг для <tex>LCA</tex> {{---}} <tex>O(n)</tex> и ответ на запрос {{---}} <tex>O(1)</tex>. | препроцессинг для <tex>LCA</tex> {{---}} <tex>O(n)</tex> и ответ на запрос {{---}} <tex>O(1)</tex>. |
Версия 09:41, 7 июня 2015
Задача: |
Дан массив | . Поступают запросы вида , на каждый запрос требуется найти минимум в массиве , начиная с позиции и заканчивая позицией .
Алгоритм
Описание
Для нахождения минимума на отрезке будем использовать информацию о наименьшем общем предке. Для хранения наименьших общих предков будем использовать декартово дерево по неявному ключу.
Декартово дерево по неявному ключу на массиве
— это бинарное дерево, допускающее следующее рекурсивное построение:- Корнем дерева является элемент массива, имеющий минимальное значение , скажем . Если минимальных элементов несколько, можно взять любой.
- Левым поддеревом является декартово дерево на массиве .
- Правым поддеревом является декартово дерево на массиве .
Здесь и далее
будет также использоваться для обозначения соответствующей вершины дерева.Построим декартово дерево на массиве
Корректность
Теорема: |
= . |
Доказательство: |
Положим .Заметим, что и не принадлежат одновременно либо правому, либо левому поддереву , потому как тогда бы соответствующий сын находился на большей глубине, чем , и также являлся предком как так и , что противоречит определению . Из этого замечанию следует, что лежит между и и, следовательно, принадлежит отрезку .
|
Сложность
Существует алгоритм, который строит декартово дерево за . Используя алгоритм построения LCA, получаем: препроцессинг для — и ответ на запрос — .
Нам нужно единожды построить декартово дерево за
, единожды провести препроцессинг за и отвечать на запросы за .В итоге получили
с построением за и ответом на запрос за .