Сведение задачи 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>А</tex>,скажем <tex>A[i]</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>}.
 
== См.также ==
 
== См.также ==
*[[Сведение задачи RMQ к задаче LCA]]
+
*[[Сведение задачи LCA к задаче RMQ]]

Версия 06:28, 6 мая 2011

Постановка задачи RMQ

Дан массив [math]A[1..N][/math]. Поступают запросы вида [math](i, j)[/math], на каждый запрос требуется найти минимум в массиве [math]A[/math], начиная с позиции [math]i[/math] и заканчивая позицией [math]j[/math].

Алгоритм

Декартово дерево(Сartesian tree) на массиве [math]A[1..N][/math] - это бинарное дерево, рекурсивно определенное следующим образом:

  • 1. Корнем дерева является минимальное значение в массиве [math]A[/math], скажем [math]A[i][/math].
  • 2. Левым поддеревом является декартово дерево на массиве [math]A[1..i-1][/math].
  • 3. Правым поддеревом является декартово дерево на массиве [math]A[i+1..N][/math].

Построим декартово дерево на массиве [math]A[/math]. Тогда [math]RMQ(i, j)[/math] = [math]LCA(A[i], A[j])[/math].

Доказательство

Мы знаем что:

  • 1. Любая вершина дерева всегда имеет меньшее значение, чем её дети. Тогда любой предок [math]A[i][/math] или [math]A[j][/math] меньше их самих.
  • 2. Все вершины, которые лежат в дереве на пути от [math]A[i][/math] до [math]A[j][/math], а так же их поддеревья образуют подмассив [math]A[i..j][/math](возьмём только правое поддерево у [math]A[i][/math] и левое поддерево у [math]A[j][/math]). Т.к. всё, что левее [math]i[/math]-го элемента в массиве, лежит левее [math]A[i][/math] в дереве, и всё, что правее [math]j[/math]-го, лежит правее [math]A[j][/math]. A дерево содержит все элементы [math]A[1..N][/math].
  • 3. Из всех вершин, определенных в п.2, [math]LCA(A[i], A[j])[/math] ближайший к корню и по п.1 имеет наименьшее значение в подмассиве [math]A[i..j][/math].

Сложность

Построение дерева наивным алгоритмом [math]O(n^2)[/math]. Существует алгоритм построение за [math]O(n)[/math]. Препроцессинг для [math]LCA[/math] - [math]O(n)[/math] и ответ на запрос [math]O(1)[/math]. В итоге получили [math]RMQ[/math] {построение [math]O(n)[/math], запрос [math]O(1)[/math]}.

См.также