Двумерная разреженная таблица — различия между версиями
(First List Update) |
м |
||
Строка 2: | Строка 2: | ||
{{Задача | {{Задача | ||
− | |definition = Дан двумерный массив <tex>A[1 \ldots N][1 \ldots M]</tex> целых чисел. Поступают запросы вида <tex>(x_1, y_1, x_2, y_2)</tex> такие, что <tex> x_1 \ | + | |definition = Дан двумерный массив <tex>A[1 \ldots N][1 \ldots M]</tex> целых чисел. Поступают запросы вида <tex>(x_1, y_1, x_2, y_2)</tex> такие, что <tex> x_1 \leqslant x_2 </tex> и <tex> y_1 \leqslant y_2 </tex> , для каждого из которых требуется найти минимум среди <tex>A[i][j], x_1 \leqslant i \leqslant x_2 </tex> и <tex> y_1 \leqslant j \leqslant y_2 </tex>. |
}} | }} | ||
Строка 58: | Строка 58: | ||
curLog = 0; | curLog = 0; | ||
k = 1; | k = 1; | ||
− | '''while ''' <tex> | + | '''while ''' (<tex>k</tex> <tex><</tex> <tex>\max(N, M)</tex>) |
lg[k] = curLog; | lg[k] = curLog; | ||
k = k * 2; | k = k * 2; |
Версия 21:45, 9 января 2017
Двумерная разреженная таблица (2D Sparse Table) — структура данных, которая позволяет решать задачу online static RMQ.
Задача: |
Дан двумерный массив | целых чисел. Поступают запросы вида такие, что и , для каждого из которых требуется найти минимум среди и .
Содержание
Структура 2D Sparse Table
В целом структура 2D Sparse Table схожа со структурой обычной разряженной таблице.
Разреженная таблица представляет собой четырехмерный массив:
, где ., ,
То есть в ячейке структуры мы храним минимум для подматрицы, длины сторон которого являются некоторыми степенями двойки.
Реализация 2D Sparse Table
Построение
Исходно полагаем, что все элементы структуры имеют значение
.Для начала необходимо присвоить элементам структуры, размеры которых
, значения элементов исходной матрицы .for i = 1 tofor j = 1 to
Далее мы считаем 1D Sparse Table для каждого столбца и строчки:
for lg = 1 tofor i = 1 to for j = 1 to
Следующим шагом мы можем обновить значения для подматриц, так как для всех строк и столбцов ответы уже известны. Будем это делать по аналогичному алгоритму для 1D Sparse Table.
for= 1 to for = 1 to for i = 1 to for j = 1 to
Таким образом мы получили 2D Sparce Table за
Ответы на запросы
Для ответа на запрос
в 1D Sparse Table использовалось пересечение отрезков и , где - размера массива для одномерной задачи.Тут мы будем пользоваться аналогичным утверждением для матриц. Таким образов минимум на подматрице
будет высчитываться следующим образом:Таким образом мы рассмотрим мы получаем ответ за
, если предпосчитать логарифмы двоек, например так:curLog = 0; k = 1; while () lg[k] = curLog; k = k * 2; curLog = curLog + 1; curLog = 0; for k = 1 to if (curLog != lg[k]) curLog = lg[k]; lg[k] = curLog;
При помощи 2D Sparse Table можно решать и некоторые другие задачи, например, поиск суммы на подматрице. (Идемпотентность)