Сведение задачи RMQ к задаче LCA — различия между версиями
 (→Сложность:  small innocent inconsiderable fixup)  | 
				 (+categories, -links)  | 
				||
| Строка 39: | Строка 39: | ||
*[[Алгоритм Фарака-Колтона и Бендера]]  | *[[Алгоритм Фарака-Колтона и Бендера]]  | ||
| − | + | [[Категория: Алгоритмы и структуры данных]]  | |
| − | + | [[Категория: Задача о наименьшем общем предке]]  | |
Версия 14:58, 21 июня 2012
Постановка задачи RMQ
Дан массив . Поступают запросы вида , на каждый запрос требуется найти минимум в массиве , начиная с позиции и заканчивая позицией .
Алгоритм
Декартово дерево (англ. сartesian tree) по неявному ключу на массиве — это бинарное дерево, допускающее следующее рекурсивное построение:
- Корнем дерева является элемент массива, имеющий минимальное значение , скажем . Если минимальных элементов несколько, можно взять любой.
 - Левым поддеревом является декартово дерево на массиве .
 - Правым поддеревом является декартово дерево на массиве .
 
Здесь и далее будет также использоваться для обозначения соответствующей вершины дерева.
Построим декартово дерево на массиве . Тогда = .
Доказательство
| Теорема: | 
 = .  | 
| Доказательство: | 
| 
 Положим . Заметим, что и не принадлежат одновременно либо правому, либо левому поддереву , потому как тогда бы соответствующий сын находился на большей глубине, чем , и также являлся предком как так и , что противоречит определению . Из этого замечанию следует, что лежит между и и, следовательно, принадлежит отрезку . 
 
  | 
Сложность
Следующий алгоритм строит декартово дерево за . Используя Сведение задачи LCA к задаче RMQ, получаем: препроцессинг для — и ответ на запрос — . В итоге получили с построением за и ответом на запрос за .