<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.252.138.171&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=109.252.138.171&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/109.252.138.171"/>
		<updated>2026-04-25T00:17:27Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B2%D1%83%D0%BC%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0&amp;diff=82241</id>
		<title>Двумерная разреженная таблица</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%94%D0%B2%D1%83%D0%BC%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0&amp;diff=82241"/>
				<updated>2022-03-25T15:06:55Z</updated>
		
		<summary type="html">&lt;p&gt;109.252.138.171: /* Построение */ неправильный порядок пересчета&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Двумерная разреженная таблица''' (англ. ''2D Sparse Table'') {{---}} структура данных, которая позволяет решать задачу online static RMQ. &lt;br /&gt;
&lt;br /&gt;
{{Задача&lt;br /&gt;
|definition = Дан двумерный массив &amp;lt;tex&amp;gt;A[1 \ldots N][1 \ldots M]&amp;lt;/tex&amp;gt; целых чисел. Поступают запросы вида &amp;lt;tex&amp;gt;(x_1, y_1, x_2, y_2)&amp;lt;/tex&amp;gt; такие, что &amp;lt;tex&amp;gt; x_1 \leqslant x_2 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; y_1 \leqslant y_2 &amp;lt;/tex&amp;gt; , для каждого из которых требуется найти минимум среди &amp;lt;tex&amp;gt;A[i][j], x_1 \leqslant i \leqslant x_2 &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; y_1 \leqslant j \leqslant y_2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Структура 2D Sparse Table ==&lt;br /&gt;
&lt;br /&gt;
В целом структура 2D Sparse Table схожа со структурой обычной [[Решение_RMQ_с_помощью_разреженной_таблицы| разреженной таблицы]]. &lt;br /&gt;
&lt;br /&gt;
Разреженная таблица представляет собой четырехмерный массив:&lt;br /&gt;
&amp;lt;tex&amp;gt;ST[N][M][LOGN][LOGM]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;LOGN = \log(N), LOGM = \log(M)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tex&amp;gt; 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 &amp;lt; N, c &amp;lt; M &amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
То есть в ячейке структуры мы храним минимум для подматрицы, длины сторон которого являются некоторыми степенями двойки.&lt;br /&gt;
&lt;br /&gt;
[[Файл:STP1.png|left]]&lt;br /&gt;
[[Файл:SparseTableExample1Picture.png|right]]&lt;br /&gt;
&lt;br /&gt;
Рассмотрим иллюстрации.&lt;br /&gt;
&lt;br /&gt;
Слева изображен общий случай. Пусть &amp;lt;tex&amp;gt;n + 1&amp;lt;/tex&amp;gt; {{---}} количество строк, &amp;lt;tex&amp;gt;m + 1&amp;lt;/tex&amp;gt; {{---}} количество столбцов массива A. Рассмотрим элемент на позиции &amp;lt;tex&amp;gt;(i, j)&amp;lt;/tex&amp;gt;, который выделен желтым цветом. Данный элемент является левым верхним углом прямоугольника, стороны которого равны &amp;lt;tex&amp;gt;2^{k_1}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;2^{k_2}&amp;lt;/tex&amp;gt;. Прямоугольна выделен красным, а проекции его сторон - зеленым. Тогда в &amp;lt;tex&amp;gt;ST[i][j][k_1][k_2]&amp;lt;/tex&amp;gt; будет храниться минимум из всех элементов, которые входят в красную и желтую область.&lt;br /&gt;
&lt;br /&gt;
Справа изображен частный случай, когда N = 11, M = 11. Посмотрим, что будет храниться в &amp;lt;tex&amp;gt;ST[2][1][2][3]&amp;lt;/tex&amp;gt;:&lt;br /&gt;
Клетка (2, 1), которая выделена желтым цветом, является левым верхним углом красного прямоугольника, длины сторон которого &amp;lt;tex&amp;gt;2^{2}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;2^{3}&amp;lt;/tex&amp;gt; (проекции этих сторон выделены зеленым цветом). И по определению выше, &amp;lt;tex&amp;gt;ST[2][1][3][2]&amp;lt;/tex&amp;gt; хранит минимум из элементов красной области.&lt;br /&gt;
&lt;br /&gt;
== Реализация 2D Sparse Table ==&lt;br /&gt;
&lt;br /&gt;
===Построение===&lt;br /&gt;
&lt;br /&gt;
Изначально заполним таблицу следующим образом:&lt;br /&gt;
&lt;br /&gt;
$$ST[i][j][k_1][k_2]=&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\infty ,&amp;amp;\text{если $k_1\neq0 \lor k_2\neq0$ ;}\\&lt;br /&gt;
A[i][j], &amp;amp;\text {если $k_1=0 \wedge k_2=0$ ;}&lt;br /&gt;
\end{cases}&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
Далее мы считаем [[Решение_RMQ_с_помощью_разреженной_таблицы|одномерную разреженную таблицу]] для каждого столбца:&lt;br /&gt;
 '''for''' &amp;lt;tex&amp;gt; i = 0 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt; lg = 1 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; \log(M) &amp;lt;/tex&amp;gt;         &lt;br /&gt;
         '''for''' &amp;lt;tex&amp;gt; j = 0 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; M &amp;lt;/tex&amp;gt;   &lt;br /&gt;
             &amp;lt;tex&amp;gt;ST[i][j][0][lg] = \min(ST[i][j][0][lg - 1], ST[i][j+ 2^{lg-1}][0][lg - 1])&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Следующим шагом мы можем обновить значения для подматриц, так как для всех столбцов ответы уже известны. Будем это делать по аналогичному алгоритму для 1D Sparse Table.&lt;br /&gt;
 '''for''' &amp;lt;tex&amp;gt; k_1 = 1 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; \log(N) &amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt; i = 0 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; N &amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''for''' &amp;lt;tex&amp;gt; k_2 = 0 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; \log(M) &amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''for''' &amp;lt;tex&amp;gt; j = 0 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; M &amp;lt;/tex&amp;gt;         &lt;br /&gt;
                 &amp;lt;tex&amp;gt;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)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом мы получили двумерную разреженную таблицу за &amp;lt;tex&amp;gt;O(NM\log(N)\log(M))&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ответы на запросы===&lt;br /&gt;
&lt;br /&gt;
Для ответа на запрос &amp;lt;tex&amp;gt; \mathrm {RMQ(l, r)} &amp;lt;/tex&amp;gt; в 1D Sparse Table использовалось пересечение отрезков &amp;lt;tex&amp;gt; [l, l + 2^{k}] &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; [r - 2^{k} + 1, r] &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; k = \lfloor  \log(SZ) \rfloor , SZ &amp;lt;/tex&amp;gt; {{---}} размера массива для одномерной задачи.&lt;br /&gt;
&lt;br /&gt;
Тут мы будем пользоваться аналогичным утверждением для матриц. Таким образов минимум на подматрице  &amp;lt;tex&amp;gt;(x_1, y_1, x_2, y_2)&amp;lt;/tex&amp;gt; будет высчитываться следующим образом:&lt;br /&gt;
 &amp;lt;tex&amp;gt; k_1 = \lfloor  \log(x_2 - x_1 + 1) \rfloor &amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt; k_2 = \lfloor  \log(y_2 - y_1 + 1) \rfloor &amp;lt;/tex&amp;gt;&lt;br /&gt;
 &amp;lt;tex&amp;gt; ans_1 = ST[x_1][y_1][k_1][k_2] &amp;lt;/tex&amp;gt; &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;     // красный прямоугольник&lt;br /&gt;
 &amp;lt;tex&amp;gt; ans_2 = ST[x_2 - 2^{k_1} + 1][y_1][k_1][k_2] &amp;lt;/tex&amp;gt; &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;     // Y-прямоугольник&lt;br /&gt;
 &amp;lt;tex&amp;gt; ans_3 = ST[x_1][y_2 - 2^{k_2} + 1][k_1][k_2] &amp;lt;/tex&amp;gt; &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;     // AA-прямоугольник&lt;br /&gt;
 &amp;lt;tex&amp;gt; ans_4 = ST[x_2 - 2^{k_1} + 1][y_2 - 2^{k_2} + 1][k_1][k_2] &amp;lt;/tex&amp;gt; &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;     // белый прямоугольник&lt;br /&gt;
 &amp;lt;tex&amp;gt; ans = \min\left(ans_1, ans_2, ans_3, ans_4\right) &amp;lt;/tex&amp;gt; &lt;br /&gt;
&lt;br /&gt;
[[Файл:ST3.png|center]]&lt;br /&gt;
&lt;br /&gt;
Таким образом мы получаем ответ на запрос &amp;lt;tex&amp;gt; \mathrm {RMQ(x_1, y_1, x_2, y_2)} &amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt;, если предпосчитать логарифмы двоек, например так: &lt;br /&gt;
 &amp;lt;tex&amp;gt; lg[1] = 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''for''' &amp;lt;tex&amp;gt; i = 2 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt;\max\left(N, M\right)&amp;lt;/tex&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt; lg[i] = lg[i / 2] + 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Обобщение на большие размерности ===&lt;br /&gt;
&lt;br /&gt;
Можно заметить, что возможно реализовать и D-мерную разреженную таблицу за &amp;lt;tex&amp;gt;O((N\log(n))^{D})&amp;lt;/tex&amp;gt; памяти и &amp;lt;tex&amp;gt;O((N\log(n))^{D})&amp;lt;/tex&amp;gt; времени на построение, где ответ на запрос, например, &amp;lt;tex&amp;gt; \mathrm {RMQ(l, r)} &amp;lt;/tex&amp;gt; будет выполняться за &amp;lt;tex&amp;gt; O(2^{D}) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Способ построения'': Если в данном случае, для того, чтобы построить двумерную структуру мы сначала должны были построить одномерную, то также и в случае с D-мерной структуре - сначала нужно построить (D-1)-мерную, а из нее получить D-мерную.&lt;br /&gt;
&lt;br /&gt;
''Ответ на запрос'': Абсолютно аналогичен рассмотренному здесь, только обобщается до размерности D.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Решение_RMQ_с_помощью_разреженной_таблицы| Решение RMQ с помощью разреженной таблицы]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о наименьшем общем предке]]&lt;/div&gt;</summary>
		<author><name>109.252.138.171</name></author>	</entry>

	</feed>