Сведение задачи RMQ к задаче LCA — различия между версиями
|  (Новая страница: «== Постановка задачи RMQ == Дан массив <tex>A[1..N]</tex>. Поступают запросы вида <tex>(i, j)</tex>, на каждый …») | |||
| Строка 3: | Строка 3: | ||
| == Алгоритм == | == Алгоритм == | ||
| Декартово дерево(Сartesian tree) на массиве <tex>A[1..N]</tex> - это бинарное дерево, рекурсивно определенное следующим образом: | Декартово дерево(Сartesian tree) на массиве <tex>A[1..N]</tex> - это бинарное дерево, рекурсивно определенное следующим образом: | ||
| − | * Корнем дерева является минимальное значение в массиве <tex> | + | * 1. Корнем дерева является минимальное значение в массиве <tex>A</tex>, скажем <tex>A[i]</tex>.   | 
| − | * Левым поддеревом является декартово дерево на массиве <tex>A[1..i-1]</tex>. | + | * 2. Левым поддеревом является декартово дерево на массиве <tex>A[1..i-1]</tex>. | 
| − | * Правым поддеревом является декартово дерево на массиве <tex>A[i+1..N]</tex>. | + | * 3. Правым поддеревом является декартово дерево на массиве <tex>A[i+1..N]</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: | Строка 14: | ||
| == Сложность == | == Сложность == | ||
| Построение дерева наивным алгоритмом <tex>O(n^2)</tex>. Существует алгоритм построение за <tex>O(n)</tex>. | Построение дерева наивным алгоритмом <tex>O(n^2)</tex>. Существует алгоритм построение за <tex>O(n)</tex>. | ||
| − | Препроцессинг для <tex>LCA O(n)</tex> и ответ на запрос <tex>O(1)</tex>. В итоге получили <tex>RMQ</tex> {построение <tex>O(n)</tex>, запрос <tex>O(1)</tex>}. | + | Препроцессинг для <tex>LCA</tex> - <tex>O(n)</tex> и ответ на запрос <tex>O(1)</tex>. В итоге получили <tex>RMQ</tex> {построение <tex>O(n)</tex>, запрос <tex>O(1)</tex>}. | 
| == См.также == | == См.также == | ||
| − | *[[Сведение задачи  | + | *[[Сведение задачи LCA к задаче RMQ]] | 
Версия 06:28, 6 мая 2011
Постановка задачи RMQ
Дан массив . Поступают запросы вида , на каждый запрос требуется найти минимум в массиве , начиная с позиции и заканчивая позицией .
Алгоритм
Декартово дерево(Сartesian tree) на массиве - это бинарное дерево, рекурсивно определенное следующим образом:
- 1. Корнем дерева является минимальное значение в массиве , скажем .
- 2. Левым поддеревом является декартово дерево на массиве .
- 3. Правым поддеревом является декартово дерево на массиве .
Построим декартово дерево на массиве . Тогда = .
Доказательство
Мы знаем что:
- 1. Любая вершина дерева всегда имеет меньшее значение, чем её дети. Тогда любой предок или меньше их самих.
- 2. Все вершины, которые лежат в дереве на пути от до , а так же их поддеревья образуют подмассив (возьмём только правое поддерево у и левое поддерево у ). Т.к. всё, что левее -го элемента в массиве, лежит левее в дереве, и всё, что правее -го, лежит правее . A дерево содержит все элементы .
- 3. Из всех вершин, определенных в п.2, ближайший к корню и по п.1 имеет наименьшее значение в подмассиве .
Сложность
Построение дерева наивным алгоритмом . Существует алгоритм построение за . Препроцессинг для - и ответ на запрос . В итоге получили {построение , запрос }.
