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