Двумерная разреженная таблица
НЕТ ВОЙНЕ |
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. Антивоенный комитет России |
Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. |
meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки. |
Двумерная разреженная таблица (англ. 2D Sparse Table) — структура данных, которая позволяет решать задачу online static RMQ.
Задача: |
Дан двумерный массив | целых чисел. Поступают запросы вида такие, что и , для каждого из которых требуется найти минимум среди и .
Структура 2D Sparse Table
В целом структура 2D Sparse Table схожа со структурой обычной разреженной таблицы.
Разреженная таблица представляет собой четырехмерный массив:
, где .
То есть в ячейке структуры мы храним минимум для подматрицы, длины сторон которого являются некоторыми степенями двойки.
Рассмотрим иллюстрации.
Слева изображен общий случай. Пусть
— количество строк, — количество столбцов массива A. Рассмотрим элемент на позиции , который выделен желтым цветом. Данный элемент является левым верхним углом прямоугольника, стороны которого равны и . Прямоугольна выделен красным, а проекции его сторон - зеленым. Тогда в будет храниться минимум из всех элементов, которые входят в красную и желтую область.Справа изображен частный случай, когда N = 11, M = 11. Посмотрим, что будет храниться в
: Клетка (2, 1), которая выделена желтым цветом, является левым верхним углом красного прямоугольника, длины сторон которого и (проекции этих сторон выделены зеленым цветом). И по определению выше, хранит минимум из элементов красной области.Реализация 2D Sparse Table
Построение
Изначально заполним таблицу следующим образом:
$$ST[i][j][k_1][k_2]= \begin{cases} \infty ,&\text{если $k_1\neq0 \lor k_2\neq0$ ;}\\ A[i][j], &\text {если $k_1=0 \wedge k_2=0$ ;} \end{cases} $$
Далее мы считаем одномерную разреженную таблицу для каждого столбца:
forto for to for to
Следующим шагом мы можем обновить значения для подматриц, так как для всех столбцов ответы уже известны. Будем это делать по аналогичному алгоритму для 1D Sparse Table.
forto for to for to for to
Таким образом мы получили двумерную разреженную таблицу за
Ответы на запросы
Для ответа на запрос
в 1D Sparse Table использовалось пересечение отрезков и , где — размера массива для одномерной задачи.Тут мы будем пользоваться аналогичным утверждением для матриц. Таким образов минимум на подматрице
будет высчитываться следующим образом:// красный прямоугольник // Y-прямоугольник // AA-прямоугольник // белый прямоугольник
Таким образом мы получаем ответ на запрос
за , если предпосчитать логарифмы двоек, например так:for to
Обобщение на большие размерности
Можно заметить, что возможно реализовать и D-мерную разреженную таблицу за
памяти и времени на построение, где ответ на запрос, например, будет выполняться за .Способ построения: Если в данном случае, для того, чтобы построить двумерную структуру мы сначала должны были построить одномерную, то также и в случае с D-мерной структуре - сначала нужно построить (D-1)-мерную, а из нее получить D-мерную.
Ответ на запрос: Абсолютно аналогичен рассмотренному здесь, только обобщается до размерности D.