Сведение задачи RMQ к задаче LCA — различия между версиями
м |
|||
Строка 4: | Строка 4: | ||
[[Файл:Wiki.PNG|thumb|right|300x160px|Пример построенного дерева для массива А]] | [[Файл:Wiki.PNG|thumb|right|300x160px|Пример построенного дерева для массива А]] | ||
Декартово дерево (англ. ''сartesian tree'') на массиве <tex>A[1..N]</tex> {{---}} это бинарное дерево, рекурсивно определенное следующим образом: | Декартово дерево (англ. ''сartesian tree'') на массиве <tex>A[1..N]</tex> {{---}} это бинарное дерево, рекурсивно определенное следующим образом: | ||
− | * Корнем дерева является минимальное значение в массиве <tex>A</tex>, скажем <tex>A[i]</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>. |
Версия 15:53, 8 апреля 2012
Постановка задачи RMQ
Дан массив
. Поступают запросы вида , на каждый запрос требуется найти минимум в массиве , начиная с позиции и заканчивая позицией .Алгоритм
Декартово дерево (англ. сartesian tree) на массиве
— это бинарное дерево, рекурсивно определенное следующим образом:- Корнем дерева является минимальное значение в массиве , скажем . Если минимальных значений несколько, можно взять любое.
- Левым поддеревом является декартово дерево на массиве .
- Правым поддеревом является декартово дерево на массиве .
Построим декартово дерево на массиве
. Тогда = .Доказательство
Мы знаем что:
- Любая вершина дерева всегда имеет меньшее значение, чем её дети. Тогда любой предок или меньше их самих.
- ближайший к корню и по п.1 имеет наименьшее значение в своем поддереве. По построению, это поддерево содержит в частности подмассив и находится между и . То есть является
Сложность
Построение дерева наивным алгоритмом
. Существует алгоритм построения за .Препроцессинг для
— и ответ на запрос . В итоге получили {построение , запрос }.