Сведение задачи RMQ к задаче LCA — различия между версиями
Строка 11: | Строка 11: | ||
Мы знаем что: | Мы знаем что: | ||
* 1. Любая вершина дерева всегда имеет меньшее значение, чем её дети. Тогда любой предок <tex>A[i]</tex> или <tex>A[j]</tex> меньше их самих. | * 1. Любая вершина дерева всегда имеет меньшее значение, чем её дети. Тогда любой предок <tex>A[i]</tex> или <tex>A[j]</tex> меньше их самих. | ||
− | * 2. | + | * 2. <tex>LCA(A[i], A[j])</tex> ближайший к корню и по п.1 имеет наименьшее значение в своем поддереве. По построению, это поддерево содержит как минимум подмассив <tex>A[i..j].</tex> То есть <tex>LCA(A[i], A[j])</tex> является <tex>RMQ(i, j).</tex> |
− | |||
== Сложность == | == Сложность == | ||
Построение дерева наивным алгоритмом <tex>O(n^2)</tex>. Существует алгоритм построения за <tex>O(n)</tex>. | Построение дерева наивным алгоритмом <tex>O(n^2)</tex>. Существует алгоритм построения за <tex>O(n)</tex>. |
Версия 21:24, 10 мая 2011
Постановка задачи RMQ
Дан массив
. Поступают запросы вида , на каждый запрос требуется найти минимум в массиве , начиная с позиции и заканчивая позицией .Алгоритм
Декартово дерево (Сartesian tree) на массиве
- это бинарное дерево, рекурсивно определенное следующим образом:- Корнем дерева является минимальное значение в массиве , скажем .
- Левым поддеревом является декартово дерево на массиве .
- Правым поддеревом является декартово дерево на массиве .
Построим декартово дерево на массиве
. Тогда = .Доказательство
Мы знаем что:
- 1. Любая вершина дерева всегда имеет меньшее значение, чем её дети. Тогда любой предок или меньше их самих.
- 2. ближайший к корню и по п.1 имеет наименьшее значение в своем поддереве. По построению, это поддерево содержит как минимум подмассив То есть является
Сложность
Построение дерева наивным алгоритмом
. Существует алгоритм построения за .Препроцессинг для
- и ответ на запрос . В итоге получили {построение , запрос }.