Сведение задачи RMQ к задаче LCA — различия между версиями
(→Алгоритм) |
|||
| Строка 3: | Строка 3: | ||
Дан массив <tex>A[1..N]</tex>. Поступают запросы вида <tex>(i, j)</tex>, на каждый запрос требуется найти минимум в массиве <tex>A</tex>, начиная с позиции <tex>i</tex> и заканчивая позицией <tex>j</tex>. | Дан массив <tex>A[1..N]</tex>. Поступают запросы вида <tex>(i, j)</tex>, на каждый запрос требуется найти минимум в массиве <tex>A</tex>, начиная с позиции <tex>i</tex> и заканчивая позицией <tex>j</tex>. | ||
== Алгоритм == | == Алгоритм == | ||
| − | Декартово дерево (англ. ''сartesian tree'') на массиве <tex>A[1..N]</tex> {{---}} это бинарное дерево, | + | Декартово дерево (англ. ''сartesian tree'') по неявному ключу на массиве <tex>A[1..N]</tex> {{---}} это бинарное дерево, допускающее следующее рекурсивное построение: |
| − | * Корнем дерева является минимальное значение | + | * Корнем дерева является элемент массива, имеющий минимальное значение <tex>A</tex>, скажем <tex>A[i]</tex>. Если минимальных элементов несколько, можно взять любой. |
* Левым поддеревом является декартово дерево на массиве <tex>A[1..i-1]</tex>. | * Левым поддеревом является декартово дерево на массиве <tex>A[1..i-1]</tex>. | ||
* Правым поддеревом является декартово дерево на массиве <tex>A[i+1..N]</tex>. | * Правым поддеревом является декартово дерево на массиве <tex>A[i+1..N]</tex>. | ||
| + | |||
| + | Здесь и далее <tex>A[i]</tex> будет также использоваться для обозначения соответствующей вершины дерева. | ||
| + | |||
Построим декартово дерево на массиве <tex>A</tex>. Тогда <tex>RMQ(i, j)</tex> = <tex>LCA(A[i], A[j])</tex>. | Построим декартово дерево на массиве <tex>A</tex>. Тогда <tex>RMQ(i, j)</tex> = <tex>LCA(A[i], A[j])</tex>. | ||
| + | |||
== Доказательство == | == Доказательство == | ||
{{Теорема | {{Теорема | ||
Версия 14:11, 21 июня 2012
Содержание
Постановка задачи RMQ
Дан массив . Поступают запросы вида , на каждый запрос требуется найти минимум в массиве , начиная с позиции и заканчивая позицией .
Алгоритм
Декартово дерево (англ. сartesian tree) по неявному ключу на массиве — это бинарное дерево, допускающее следующее рекурсивное построение:
- Корнем дерева является элемент массива, имеющий минимальное значение , скажем . Если минимальных элементов несколько, можно взять любой.
- Левым поддеревом является декартово дерево на массиве .
- Правым поддеревом является декартово дерево на массиве .
Здесь и далее будет также использоваться для обозначения соответствующей вершины дерева.
Построим декартово дерево на массиве . Тогда = .
Доказательство
| Теорема: |
= . |
| Доказательство: |
|
Мы знаем что:
|
Построение дерева за линейное время
Пусть дан массив . Будем по очереди слева на право добавлять элементы в дерево. Чтобы добавить новое значение , начнем обход из вершины к корню, пока не найдем вершину , для которой . Тогда правого сына назначим левым сыном , а — правым сыном . Рассмотрим правую ветку дерева, т.е. по которой проходит обход алгоритма. Заметим, что при добавлении нового узла в дерево элементы, по которым только что прошелся алгоритм отправляются налево, т.е. перестают принадлежать правой ветке. Таким образом процедура поиска родителя не сможет выполнится более раз и итоговая асимптотика алгоритма .
Сложность
Выше описан алгоритм построения дерева за . Препроцессинг для — и ответ на запрос . В итоге получили {построение , запрос }.