<?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=88.135.63.26&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=88.135.63.26&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/88.135.63.26"/>
		<updated>2026-05-09T17:30:42Z</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=20157</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=20157"/>
				<updated>2012-03-31T16:58:51Z</updated>
		
		<summary type="html">&lt;p&gt;88.135.63.26: &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&amp;lt;/tex&amp;gt;, начиная с позиции &amp;lt;tex&amp;gt;l&amp;lt;/tex&amp;gt; и заканчивая позицией &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;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;
&amp;lt;tex&amp;gt; ST[i][j] = &lt;br /&gt;
\left\{  &lt;br /&gt;
           \begin{array}{lcl}  &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;
Это достигается за счет идемпотентности операции минимум: &amp;lt;tex&amp;gt;\min(a, a)=a&amp;lt;/tex&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;, т.е. логарифм длины запрашиваемого отрезка.&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(N\log N)&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;fl[x] = fl[\lfloor \frac{x}{2}\rfloor] + 1&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;
* ''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;
* [[Сведение задачи LCA к задаче RMQ | Сведение задачи LCA к задаче RMQ]]&lt;br /&gt;
* [[Алгоритм Фарака-Колтона и Бендера | Алгоритм Фарака-Колтона и Бендера]]&lt;br /&gt;
* [[Сведение задачи RMQ к задаче LCA | Сведение задачи RMQ к задаче LCA]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о наименьшем общем предке]]&lt;/div&gt;</summary>
		<author><name>88.135.63.26</name></author>	</entry>

	</feed>