Двумерная разреженная таблица — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Построение: неправильный порядок пересчета)
Строка 1: Строка 1:
 +
{| class="wikitable" align="center" style="color: red; background-color: black; font-size: 56px; width: 800px;"
 +
|+
 +
|-align="center"
 +
|'''НЕТ ВОЙНЕ'''
 +
|-style="font-size: 16px;"
 +
|
 +
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.
 +
 +
Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием.
 +
 +
Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей.
 +
 +
Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить.
 +
 +
''Антивоенный комитет России''
 +
|-style="font-size: 16px;"
 +
|Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.
 +
|-style="font-size: 16px;"
 +
|[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки].
 +
|}
 +
 
'''Двумерная разреженная таблица''' (англ. ''2D Sparse Table'') {{---}} структура данных, которая позволяет решать задачу online static RMQ.  
 
'''Двумерная разреженная таблица''' (англ. ''2D Sparse Table'') {{---}} структура данных, которая позволяет решать задачу online static RMQ.  
  

Версия 07:04, 1 сентября 2022

НЕТ ВОЙНЕ

24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян.

Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием.

Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей.

Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить.

Антивоенный комитет России

Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению.
meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки.

Двумерная разреженная таблица (англ. 2D Sparse Table) — структура данных, которая позволяет решать задачу online static RMQ.


Задача:
Дан двумерный массив [math]A[1 \ldots N][1 \ldots M][/math] целых чисел. Поступают запросы вида [math](x_1, y_1, x_2, y_2)[/math] такие, что [math] x_1 \leqslant x_2 [/math] и [math] y_1 \leqslant y_2 [/math] , для каждого из которых требуется найти минимум среди [math]A[i][j], x_1 \leqslant i \leqslant x_2 [/math] и [math] y_1 \leqslant j \leqslant y_2 [/math].


Структура 2D Sparse Table

В целом структура 2D Sparse Table схожа со структурой обычной разреженной таблицы.

Разреженная таблица представляет собой четырехмерный массив: [math]ST[N][M][LOGN][LOGM][/math], где [math]LOGN = \log(N), LOGM = \log(M)[/math].

[math] ST[i][j][k_1][k_2] = \min\limits_{r = i,\dots,i+2^{k_1}-1, c = j,\ldots,j + 2^{k_2}-1} A[r][c], r \lt N, c \lt M [/math]

То есть в ячейке структуры мы храним минимум для подматрицы, длины сторон которого являются некоторыми степенями двойки.

STP1.png
SparseTableExample1Picture.png

Рассмотрим иллюстрации.

Слева изображен общий случай. Пусть [math]n + 1[/math] — количество строк, [math]m + 1[/math] — количество столбцов массива A. Рассмотрим элемент на позиции [math](i, j)[/math], который выделен желтым цветом. Данный элемент является левым верхним углом прямоугольника, стороны которого равны [math]2^{k_1}[/math] и [math]2^{k_2}[/math]. Прямоугольна выделен красным, а проекции его сторон - зеленым. Тогда в [math]ST[i][j][k_1][k_2][/math] будет храниться минимум из всех элементов, которые входят в красную и желтую область.

Справа изображен частный случай, когда N = 11, M = 11. Посмотрим, что будет храниться в [math]ST[2][1][2][3][/math]: Клетка (2, 1), которая выделена желтым цветом, является левым верхним углом красного прямоугольника, длины сторон которого [math]2^{2}[/math] и [math]2^{3}[/math] (проекции этих сторон выделены зеленым цветом). И по определению выше, [math]ST[2][1][3][2][/math] хранит минимум из элементов красной области.

Реализация 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} $$

Далее мы считаем одномерную разреженную таблицу для каждого столбца:

for [math] i = 0 [/math] to [math] N [/math]
    for [math] lg = 1 [/math] to [math] \log(M) [/math]         
        for [math] j = 0 [/math] to [math] M [/math]   
            [math]ST[i][j][0][lg] = \min(ST[i][j][0][lg - 1], ST[i][j+ 2^{lg-1}][0][lg - 1])[/math]

Следующим шагом мы можем обновить значения для подматриц, так как для всех столбцов ответы уже известны. Будем это делать по аналогичному алгоритму для 1D Sparse Table.

for [math] k_1 = 1 [/math] to [math] \log(N) [/math]
    for [math] i = 0 [/math] to [math] N [/math]
        for [math] k_2 = 0 [/math] to [math] \log(M) [/math]
            for [math] j = 0 [/math] to [math] M [/math]         
                [math]ST[i][j][k_1][k_2]=\min\left(ST[i][j][k_1 - 1][k_2],ST[i+2^{k_1-1}][j][k_1 - 1][k_2]\right)[/math]

Таким образом мы получили двумерную разреженную таблицу за [math]O(NM\log(N)\log(M))[/math]

Ответы на запросы

Для ответа на запрос [math] \mathrm {RMQ(l, r)} [/math] в 1D Sparse Table использовалось пересечение отрезков [math] [l, l + 2^{k}] [/math] и [math] [r - 2^{k} + 1, r] [/math], где [math] k = \lfloor \log(SZ) \rfloor , SZ [/math] — размера массива для одномерной задачи.

Тут мы будем пользоваться аналогичным утверждением для матриц. Таким образов минимум на подматрице [math](x_1, y_1, x_2, y_2)[/math] будет высчитываться следующим образом:

[math] k_1 = \lfloor  \log(x_2 - x_1 + 1) \rfloor [/math]
[math] k_2 = \lfloor  \log(y_2 - y_1 + 1) \rfloor [/math]
[math] ans_1 = ST[x_1][y_1][k_1][k_2] [/math]      // красный прямоугольник
[math] ans_2 = ST[x_2 - 2^{k_1} + 1][y_1][k_1][k_2] [/math]      // Y-прямоугольник
[math] ans_3 = ST[x_1][y_2 - 2^{k_2} + 1][k_1][k_2] [/math]      // AA-прямоугольник
[math] ans_4 = ST[x_2 - 2^{k_1} + 1][y_2 - 2^{k_2} + 1][k_1][k_2] [/math]      // белый прямоугольник
[math] ans = \min\left(ans_1, ans_2, ans_3, ans_4\right) [/math] 
ST3.png

Таким образом мы получаем ответ на запрос [math] \mathrm {RMQ(x_1, y_1, x_2, y_2)} [/math] за [math] O(1) [/math], если предпосчитать логарифмы двоек, например так:

[math] lg[1] = 0 [/math]
for [math] i = 2 [/math] to [math]\max\left(N, M\right)[/math]
    [math] lg[i] = lg[i / 2] + 1 [/math]

Обобщение на большие размерности

Можно заметить, что возможно реализовать и D-мерную разреженную таблицу за [math]O((N\log(n))^{D})[/math] памяти и [math]O((N\log(n))^{D})[/math] времени на построение, где ответ на запрос, например, [math] \mathrm {RMQ(l, r)} [/math] будет выполняться за [math] O(2^{D}) [/math].

Способ построения: Если в данном случае, для того, чтобы построить двумерную структуру мы сначала должны были построить одномерную, то также и в случае с D-мерной структуре - сначала нужно построить (D-1)-мерную, а из нее получить D-мерную.

Ответ на запрос: Абсолютно аналогичен рассмотренному здесь, только обобщается до размерности D.

См. также