Двумерная разреженная таблица — различия между версиями
(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 to for j = 1 to
Далее мы считаем 1D Sparse Table для каждого столбца и строчки:
for lg = 1 to for 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 можно решать и некоторые другие задачи, например, поиск суммы на подматрице. (Идемпотентность)