Двумерная разреженная таблица — различия между версиями
м (переименовал Участник:Alex PKZDL в 2D Sparse Table: Неправильное название) |
|||
Строка 71: | Строка 71: | ||
== Источники информации== | == Источники информации== | ||
− | [[Решение_RMQ_с_помощью_разреженной_таблицы| | + | [[Решение_RMQ_с_помощью_разреженной_таблицы| Решение RMQ с помощью разреженной таблицы]] |
[[Категория: Алгоритмы и структуры данных]] | [[Категория: Алгоритмы и структуры данных]] |
Версия 02:55, 15 декабря 2016
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 за
Ответы на запросы
Для ответа на запрос RMQ
в 1D Sparse Table использовалось пересечение отрезков и , где - размера массива для одномерной задачи.Тут мы будем пользоваться аналогичным утверждением для матриц. Таким образов минимум на подматрице
будет высчитываться следующим образом:Таким образом мы рассмотрим мы получаем ответ за
, если предпосчитать логарифмы двоек, например так:curLog = 0; k = 1; whilelg[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 можно решать и некоторые другие задачи, например связанные с суммой на подматрице. (Идемпотентность)