Решение RMQ с помощью разреженной таблицы

Материал из Викиконспекты
Версия от 14:37, 7 мая 2012; 178.178.24.167 (обсуждение) (Постановка задачи RMQ)
Перейти к: навигация, поиск

Разреженная таблица (англ. sparse table) позволяет решать задачу online static RMQ за O(1) на запрос, с предподсчётом за O(NlogN) и использованием O(NlogN) памяти.

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

Дан массив A[1..N] целых чисел. Поступают запросы вида (l,r): найти минимум в подмассиве A[l],A[l+1],,A[r].

Разреженная таблица

Разреженная таблица — двумерная структура данных ST[i,j], для которой выполнено следующее: ST[i][j]=min(A[i],A[i+1],...,A[i+2j1]),j[0..logN]. Иначе говоря, в этой таблице хранятся минимумы на всех отрезках, длины которых равны степеням двойки. Объём, занимаемый таблицей, равен O(NlogN), и заполненными являются только те элементы, для которых i+2jN.

Простой метод построения таблицы заключён в следующем реккурентном соотношении:

ST[i][j]={min(ST[i][j1],ST[i+2j1][j1]),j>0A[i],j=0 .

Идемпотентность

Такая простота достигается за счет идемпотентности операции минимум: min(a,a)=a. Это один из ключевых моментов этого метода, так как она позволяет нам корректно считать минимум в области пересечения отрезков. <wikitex> Пусть — произвольная бинарная операция, которая удовлетворяет свойствам:

  • ассоциативности: a(bc)=(ab)c;
  • коммутативности: ab=ba;
  • идемпотентности: aa=a.


Утверждение:
alal+1ar=(alal+1ak)(arkark+1ar), где lkr;l2k.
Отрезок (ark,ak) содержится в обои операндах правой части. Значит, каждый элемент из него входит два раза. По коммутативности мы можем расположить повторяющиеся элементы друг с другом. По ассоциотивности мы можем расставлять скобки как угодно, в том числе, обособляя эти самые повторы. А за счет идемпотентности мы от них избавляемся. В итоге, получаем выражение в левой части равенства.

</wikitex>

Применение к задаче RMQ

Решение задачи RMQ на разреженной таблице
Предпосчитаем длину отрезка k. Это можно сделать за O(NlogN) введением функции fl[l]=k, для которой верно fl[1]=0,fl[x]=fl[x2]+1.

Пусть теперь дан запрос (l,r). Заметим, что min(A[l],A[l+1],...,A[r])=min(ST[l][k],ST[r2k+1][j]), где k=max{j|2jrl+1}, т.е. логарифм длины запрашиваемого отрезка, округленный вниз. Но эту величину мы уже предпосчитали, поэтому запрос выполняется за O(1).

Стоит отметить, что этот метод работает не только с операцией минимум, но и с любой идемпотентной, ассоциативной и коммутативной операцией, так как отрезки (l,2k) и (r2k,r), на которых мы считаем ответ, есть те самые из доказанного утверждения. Таким образом мы получаем целый класс задач, решаемых разреженной таблицей.

См. также

Источники

  • Bender, M.A., Farach-Colton, M. et al.Lowest common ancestors in trees and directed acyclic graphs. — J. Algorithms 57(2) (2005) — с. 75–94.