<?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=178.178.14.56&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=178.178.14.56&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/178.178.14.56"/>
		<updated>2026-04-14T19:03:54Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_RMQ_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B&amp;diff=20989</id>
		<title>Решение RMQ с помощью разреженной таблицы</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_RMQ_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B&amp;diff=20989"/>
				<updated>2012-04-22T11:25:35Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.14.56: small fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Разреженная таблица''' (англ. ''sparse table'') позволяет решать задачу online static RMQ за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt; на запрос, с предподсчётом за &amp;lt;tex&amp;gt;O(N \log N)&amp;lt;/tex&amp;gt; и использованием &amp;lt;tex&amp;gt;O(N \log N)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
== Постановка задачи RMQ ==&lt;br /&gt;
Дан массив &amp;lt;tex&amp;gt;A[1..N]&amp;lt;/tex&amp;gt; действительных чисел. Поступают запросы вида &amp;lt;tex&amp;gt;(l, r)&amp;lt;/tex&amp;gt;: найти минимум в подмассиве &amp;lt;tex&amp;gt;A[l], A[l + 1], \dots, A[r] &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Разреженная таблица ==&lt;br /&gt;
Разреженная таблица — двумерная структура данных &amp;lt;tex&amp;gt;ST[i, j]&amp;lt;/tex&amp;gt;, для которой выполнено следующее: &amp;lt;tex&amp;gt;ST[i][j]=\min\left(A[i], A[i+1], ..., A[i+2^{j}-1]\right),\quad j \in [0 .. \log N]&amp;lt;/tex&amp;gt;. Иначе говоря, в этой таблице хранятся минимумы на всех отрезках, длины которых равны степеням двойки. Объём, занимаемый таблицей, равен &amp;lt;tex&amp;gt;O(N \log N)&amp;lt;/tex&amp;gt;, и заполненными являются только те элементы, для которых &amp;lt;tex&amp;gt;i+2^j \le N &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Простой метод построения таблицы заключён в следующем реккурентном соотношении: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; ST[i][j] = &lt;br /&gt;
\left\{  &lt;br /&gt;
           \begin{array}{rcl}  &lt;br /&gt;
             \min\left(ST[i][j-1], ST[i+2^{j-1}][j-1]\right), j &amp;gt; 0 \\  &lt;br /&gt;
             A[i], j = 0 \\  &lt;br /&gt;
           \end{array}   &lt;br /&gt;
           \right. &lt;br /&gt;
&amp;lt;/tex&amp;gt; .&lt;br /&gt;
=== Идемпотентность ===&lt;br /&gt;
Такая простота достигается за счет идемпотентности операции минимум: &amp;lt;tex&amp;gt;\min(a, a)=a&amp;lt;/tex&amp;gt;. Это один из ключевых моментов этого метода, так как она позволяет нам корректно считать минимум в области пересечения отрезков. &lt;br /&gt;
&amp;lt;wikitex&amp;gt;&lt;br /&gt;
Пусть $\circ$ — произвольная бинарная операция, которая удовлетворяет свойствам:&lt;br /&gt;
* ассоциативности: $a \circ (b \circ c) = (a \circ b) \circ c $;&lt;br /&gt;
* коммутативности: $a \circ b = b \circ a$;&lt;br /&gt;
* идемпотентности: $a \circ a = a $.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
$a_l \circ a_{l+1} \circ \dots \circ a_r = (a_l \circ a_{l+1} \circ \dots \circ a_k) \circ (a_{r - k} \circ a_{r - k + 1} \circ \dots \circ a_r)$, где $l \leqslant k \leqslant  r$.&lt;br /&gt;
|proof=&lt;br /&gt;
Покажем, что $a \circ b \circ c \circ d = (a \circ b \circ c) \circ (b \circ c \circ d)$. Действительно, $a \circ b \circ c \circ b \circ c \circ d = a \circ b \circ b \circ c \circ c \circ d = a \circ b \circ c \circ d $. Будем применять это к выражению в правой части равенства до тех пор, пока не получим выражение в левой части. Поле каждого шага количество одинаковых элементов сократится на два. А так как их конечное четное (по $2k - r$ в каждой скобке) число, то и количество шагов будет конечным.&lt;br /&gt;
}}&lt;br /&gt;
Таким образом мы получаем целый класс задач, которые могут решаться разреженной таблицей.&lt;br /&gt;
&amp;lt;/wikitex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Применение к задаче RMQ ==&lt;br /&gt;
[[Файл:SparseTableRMQ.png|right|Решение задачи RMQ на разреженной таблице]]&lt;br /&gt;
&amp;lt;div&amp;gt;Дан запрос &amp;lt;tex&amp;gt;(l, r)&amp;lt;/tex&amp;gt;. По нему найдем &amp;lt;tex&amp;gt;k = \max \{j| 2^j \le r - l + 1\}&amp;lt;/tex&amp;gt;, т.е. логарифм длины запрашиваемого отрезка. Заметим, что &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; зависит лишь от длины отрезка. Предпосчитать эту величину за &amp;lt;tex&amp;gt;O(N\log N)&amp;lt;/tex&amp;gt; можно введением функции &amp;lt;tex&amp;gt;fl[l] = k&amp;lt;/tex&amp;gt;, для которой верно &amp;lt;tex&amp;gt;fl[1] = 0, fl[x] = fl[\lfloor \frac{x}{2}\rfloor] + 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Далее заметим, что &amp;lt;tex&amp;gt;\min(A[l], A[l+1], ..., A[r]) = \min\left(ST[l][k], ST[r-2^k+1][j]\right)&amp;lt;/tex&amp;gt;.  Таким образом мы можем находить &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Сведение задачи LCA к задаче RMQ | Сведение задачи LCA к задаче RMQ]]&lt;br /&gt;
* [[Алгоритм Фарака-Колтона и Бендера | Алгоритм Фарака-Колтона и Бендера]]&lt;br /&gt;
* [[Сведение задачи RMQ к задаче LCA | Сведение задачи RMQ к задаче LCA]]&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* ''Bender, M.A., Farach-Colton, M. et al.'' — '''Lowest common ancestors in trees and directed acyclic graphs'''. — J. Algorithms 57(2) (2005) —  с. 75–94.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о наименьшем общем предке]]&lt;/div&gt;</summary>
		<author><name>178.178.14.56</name></author>	</entry>

	</feed>