Двумерная разреженная таблица
Двумерная разреженная таблица (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 можно решать и некоторые другие задачи, например, поиск суммы на подматрице. (Идемпотентность)