<?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.24.167&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.24.167&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.24.167"/>
		<updated>2026-05-19T16:00:44Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B8%D0%BE%D0%B4_%D0%B8_%D0%B1%D0%BE%D1%80%D0%B4%D0%B5%D1%80,_%D0%B8%D1%85_%D1%81%D0%B2%D1%8F%D0%B7%D1%8C&amp;diff=21983</id>
		<title>Период и бордер, их связь</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B8%D0%BE%D0%B4_%D0%B8_%D0%B1%D0%BE%D1%80%D0%B4%D0%B5%D1%80,_%D0%B8%D1%85_%D1%81%D0%B2%D1%8F%D0%B7%D1%8C&amp;diff=21983"/>
				<updated>2012-05-07T15:13:32Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.24.167: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Связь периода и бордера==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement= Если у строки длины &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; есть [[Основные определения, связанные со строками#Отношения между строками|бордер]] длины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, то у нее есть [[Основные определения, связанные со строками#Отношения между строками|период]] длины &amp;lt;tex&amp;gt;n - k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть дана строка &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Напишем формально определения бордера длины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; строки &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;tex&amp;gt;\forall i = 1 \ldots k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\alpha [i] = \alpha[i + (n - k)]&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Сделаем замену &amp;lt;tex&amp;gt;x = n - k&amp;lt;/tex&amp;gt;:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;tex&amp;gt;\forall i = 1 \ldots n - x&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\alpha [i] = \alpha[i + x]&amp;lt;/tex&amp;gt;.&amp;lt;/ul&amp;gt; &lt;br /&gt;
Получили определение периода длины &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;. Но &amp;lt;tex&amp;gt;x = n - k&amp;lt;/tex&amp;gt;, значит у строки &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt; есть период длины &amp;lt;tex&amp;gt;n - k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Свойства периода==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement= Если у строки есть [[Основные определения, связанные со строками#Отношения между строками|период]] длины &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, то у нее есть период длины &amp;lt;tex&amp;gt;kx&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; x \in N&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть длина строки равна &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, сама строка {{---}} &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Доказательство будем вести по индукции по числу &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для &amp;lt;tex&amp;gt; x = 1 &amp;lt;/tex&amp;gt; утверждение очевидно.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть верно для &amp;lt;tex&amp;gt;x \leqslant m&amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Докажем, что верно для &amp;lt;tex&amp;gt;x = m + 1&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Из определения периода имеем, что&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;tex&amp;gt;\forall i = 1 \ldots n - k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\alpha [i] = \alpha[i + k]&amp;lt;/tex&amp;gt;,&amp;lt;/ul&amp;gt;&lt;br /&gt;
а из предположения индукции, что&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;tex&amp;gt;\forall i = 1 \ldots n - km&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\alpha [i] = \alpha[i + mk]&amp;lt;/tex&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Значит получаем, что&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;tex&amp;gt;\forall i = 1 \ldots n - km - k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\alpha [i] = \alpha [i + mk] = \alpha[i + mk + k]&amp;lt;/tex&amp;gt;,&amp;lt;/ul&amp;gt;&lt;br /&gt;
следовательно&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;для &amp;lt;tex&amp;gt;\forall i = 1 \ldots n - k(m + 1)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\alpha [i] = \alpha[i + k(m + 1)]&amp;lt;/tex&amp;gt;.&amp;lt;/ul&amp;gt;&lt;br /&gt;
Значит у строки есть период длины &amp;lt;tex&amp;gt;k(m + 1)&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Утверждение доказано.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement= Если у строки есть периоды длины &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;q&amp;lt;/tex&amp;gt;, то НОД&amp;lt;tex&amp;gt;(p, q)&amp;lt;/tex&amp;gt; также является периодом этой строки.&lt;br /&gt;
|proof=&lt;br /&gt;
Для удобства доказательства допишем перед строкой её копию и будем нумеровать символы новой строки не с &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;2n&amp;lt;/tex&amp;gt;, а с &amp;lt;tex&amp;gt;-n + 1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Назовём полученную строку &amp;lt;tex&amp;gt;\alpha&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Доказательство будем вести по индукции по парам &amp;lt;tex&amp;gt;(p, q)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; p \geqslant q &amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;(p, q) + 1 = \begin{cases} (p, q + 1), &amp;amp; q &amp;lt; p;\\&lt;br /&gt;
(p + 1, 1), &amp;amp;  q = p.\end{cases}&amp;lt;/tex&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Для &amp;lt;tex&amp;gt; (1, 1) &amp;lt;/tex&amp;gt; утверждение очевидно.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Пусть верно для всех пар меньших &amp;lt;tex&amp;gt;(p, q)&amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Докажем, что верно для &amp;lt;tex&amp;gt;(p, q)&amp;lt;/tex&amp;gt;.&amp;lt;br/&amp;gt; &lt;br /&gt;
Из определения периода:&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;tex&amp;gt;\forall i = -n + 1 \ldots n - p&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\alpha [i] = \alpha[i + p] = \alpha[i + q]&amp;lt;/tex&amp;gt;.&amp;lt;/ul&amp;gt;&lt;br /&gt;
Значит &amp;lt;ul&amp;gt;&amp;lt;tex&amp;gt;\forall i = 1 - q \ldots n - p&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\alpha [i + q] = \alpha[i + p]&amp;lt;/tex&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Сделаем замену &amp;lt;tex&amp;gt;j = i + q&amp;lt;/tex&amp;gt; и получим, что&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;tex&amp;gt;\forall j = 1 \ldots n - (p - q)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\alpha [j] = \alpha[j + (p - q)]&amp;lt;/tex&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
Получили новый период длины &amp;lt;tex&amp;gt;p - q&amp;lt;/tex&amp;gt;. Из предположения известно, что НОД&amp;lt;tex&amp;gt;(p - q, q)&amp;lt;/tex&amp;gt; {{---}} период строки, но НОД&amp;lt;tex&amp;gt;(p - q, q)&amp;lt;/tex&amp;gt;&amp;lt;tex&amp;gt;=&amp;lt;/tex&amp;gt;НОД&amp;lt;tex&amp;gt;(p, q)&amp;lt;/tex&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
Следовательно утверждение доказано.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
[[Основные определения, связанные со строками]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Основные определения. Простые комбинаторные свойства слов]]&lt;/div&gt;</summary>
		<author><name>178.178.24.167</name></author>	</entry>

	<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=21974</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=21974"/>
				<updated>2012-05-07T12:08:23Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.24.167: /* Применение к задаче RMQ */&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;, для которой выполнено следующее: &lt;br /&gt;
&lt;br /&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;. &lt;br /&gt;
&lt;br /&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_{r-k}, a_k)$ содержится в обои операндах правой части. Значит, каждый элемент из него входит два раза. По коммутативности мы можем располагать элементы в любом порядке, по ассоциативности мы можем выполнять операции в произвольном порядке, поэтому повторяющие в правой части элементы мы можем расположить рядом друг с другом и затем по идемпотентности один из них убрать. Переставляя оставшиеся элементы в правой затем легко получаем выражение в левой части.&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&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;k =\lfloor \log_2l \rfloor&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;
&lt;br /&gt;
Пусть теперь дан запрос &amp;lt;tex&amp;gt;(l, r)&amp;lt;/tex&amp;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 = \max \{j| 2^j \le r - l + 1\}&amp;lt;/tex&amp;gt;, т.е. логарифм длины запрашиваемого отрезка, округленный вниз. Но эту величину мы уже предпосчитали, поэтому запрос выполняется за &amp;lt;tex&amp;gt;O (1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что этот метод работает не только с операцией минимум, но и с любой идемпотентной, ассоциативной и коммутативной операцией, так как отрезки &amp;lt;tex&amp;gt;(l, 2^k)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(r - 2^k, r)&amp;lt;/tex&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.24.167</name></author>	</entry>

	<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=21973</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=21973"/>
				<updated>2012-05-07T11:57:13Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.24.167: /* Разреженная таблица */&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;, для которой выполнено следующее: &lt;br /&gt;
&lt;br /&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;. &lt;br /&gt;
&lt;br /&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_{r-k}, a_k)$ содержится в обои операндах правой части. Значит, каждый элемент из него входит два раза. По коммутативности мы можем располагать элементы в любом порядке, по ассоциативности мы можем выполнять операции в произвольном порядке, поэтому повторяющие в правой части элементы мы можем расположить рядом друг с другом и затем по идемпотентности один из них убрать. Переставляя оставшиеся элементы в правой затем легко получаем выражение в левой части.&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;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;
&lt;br /&gt;
Пусть теперь дан запрос &amp;lt;tex&amp;gt;(l, r)&amp;lt;/tex&amp;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 = \max \{j| 2^j \le r - l + 1\}&amp;lt;/tex&amp;gt;, т.е. логарифм длины запрашиваемого отрезка, округленный вниз. Но эту величину мы уже предпосчитали, поэтому запрос выполняется за &amp;lt;tex&amp;gt;O (1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что этот метод работает не только с операцией минимум, но и с любой идемпотентной, ассоциативной и коммутативной операцией, так как отрезки &amp;lt;tex&amp;gt;(l, 2^k)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(r - 2^k, r)&amp;lt;/tex&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.24.167</name></author>	</entry>

	<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=21971</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=21971"/>
				<updated>2012-05-07T11:38:25Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.24.167: /* Постановка задачи RMQ */&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; \frac{l}{2} \leqslant k$.&lt;br /&gt;
|proof=&lt;br /&gt;
Отрезок $(a_{r-k}, a_k)$ содержится в обои операндах правой части. Значит, каждый элемент из него входит два раза. По коммутативности мы можем расположить повторяющиеся элементы друг с другом. По ассоциотивности мы можем расставлять скобки как угодно, в том числе, обособляя эти самые повторы. А за счет идемпотентности мы от них избавляемся. В итоге, получаем выражение в левой части равенства.&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;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;
&lt;br /&gt;
Пусть теперь дан запрос &amp;lt;tex&amp;gt;(l, r)&amp;lt;/tex&amp;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 = \max \{j| 2^j \le r - l + 1\}&amp;lt;/tex&amp;gt;, т.е. логарифм длины запрашиваемого отрезка, округленный вниз. Но эту величину мы уже предпосчитали, поэтому запрос выполняется за &amp;lt;tex&amp;gt;O (1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что этот метод работает не только с операцией минимум, но и с любой идемпотентной, ассоциативной и коммутативной операцией, так как отрезки &amp;lt;tex&amp;gt;(l, 2^k)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(r - 2^k, r)&amp;lt;/tex&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.24.167</name></author>	</entry>

	<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=21970</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=21970"/>
				<updated>2012-05-07T11:37:38Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.24.167: /* Постановка задачи RMQ */&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; \frac{l}{2} \leqslant k$.&lt;br /&gt;
|proof=&lt;br /&gt;
Отрезок $(a_{r-k}, a_k)$ содержится в обои операндах правой части. Значит, каждый элемент из него входит два раза. По коммутативности мы можем расположить повторяющиеся элементы друг с другом. По ассоциотивности мы можем расставлять скобки как угодно, в том числе, обособляя эти самые повторы. А за счет идемпотентности мы от них избавляемся. В итоге, получаем выражение в левой части равенства.&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;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;
&lt;br /&gt;
Пусть теперь дан запрос &amp;lt;tex&amp;gt;(l, r)&amp;lt;/tex&amp;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 = \max \{j| 2^j \le r - l + 1\}&amp;lt;/tex&amp;gt;, т.е. логарифм длины запрашиваемого отрезка, округленный вниз. Но эту величину мы уже предпосчитали, поэтому запрос выполняется за &amp;lt;tex&amp;gt;O (1)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, что этот метод работает не только с операцией минимум, но и с любой идемпотентной, ассоциативной и коммутативной операцией, так как отрезки &amp;lt;tex&amp;gt;(l, 2^k)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(r - 2^k, r)&amp;lt;/tex&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.24.167</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D0%BE%D0%B2%D0%BE_%D0%A2%D1%83%D1%8D-%D0%9C%D0%BE%D1%80%D1%81%D0%B0&amp;diff=21959</id>
		<title>Слово Туэ-Морса</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D0%BE%D0%B2%D0%BE_%D0%A2%D1%83%D1%8D-%D0%9C%D0%BE%D1%80%D1%81%D0%B0&amp;diff=21959"/>
				<updated>2012-05-07T10:15:59Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.24.167: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Определим последовательность строк &amp;lt;tex&amp;gt;T_n&amp;lt;/tex&amp;gt; над двухбуквенным алфавитом &amp;lt;tex&amp;gt;\{a, b\}&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;T_n = t_0 t_1 \dots t_{2^n-1}&amp;lt;/tex&amp;gt;, где:&lt;br /&gt;
* &amp;lt;tex&amp;gt;t_i = a&amp;lt;/tex&amp;gt;, если двоичная запись числа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; содержит чётное число единиц&lt;br /&gt;
* &amp;lt;tex&amp;gt;t_i = b&amp;lt;/tex&amp;gt;, иначе.&lt;br /&gt;
&lt;br /&gt;
Строки этой последовательности называются '''строками Туэ-Морса'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
&lt;br /&gt;
Приведём первые пять строк Туэ-Морса:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0 = a&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1 = ab&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2 = abba&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3 = abbabaab&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_4 = abbabaabbaababba&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства и эквивалентные определения ==&lt;br /&gt;
&lt;br /&gt;
Как видно из определения, символ на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой позиции не зависит от номера строки. Так как длина строк возрастает, каждая строка является собственным префиксом следующей, поэтому можно рассматривать получение следующей строки как приписывание к текущей строке некоторой другой строки.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\varphi&amp;lt;/tex&amp;gt; — морфизм, инвертирующий символы:&lt;br /&gt;
&amp;lt;tex&amp;gt;\varphi(x) = \left\{ \begin{array}{rl} &lt;br /&gt;
b, &amp;amp; x = a \\&lt;br /&gt;
a, &amp;amp; x = b, \\&lt;br /&gt;
\end{array} \right.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 тогда для строк Туэ-Морса верно следующее соотношение: &amp;lt;tex&amp;gt;T_{n + 1} = T_n \varphi(T_n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Заметим, что соответсвующие индексы символов при приписывании новой строки к строке &amp;lt;tex&amp;gt;T_n&amp;lt;/tex&amp;gt; получаются добавлением к индексам &amp;lt;tex&amp;gt;i = 0, 1, \dots, 2^n - 1&amp;lt;/tex&amp;gt; числа &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt;. Количество единиц в двоичной записи числа &amp;lt;tex&amp;gt;i + 2^n&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;i &amp;lt; 2^n&amp;lt;/tex&amp;gt;) ровно на один больше, чем в двоичной записи числа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Поэтому приписываемая строка есть ни что иное, как исходная строка с инвертированными символами.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Данная теорема позволяет определять последовательность строк Туэ-Морса следующим образом: &amp;lt;tex&amp;gt;T_0 = a&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;T_{n + 1} = T_n \varphi(T_n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Часто рассматривают предельный случай — бесконечную строку Туэ-Морса, любой символ которой можно получить из обычной строки Туэ-Морса с достаточно большим номером. Бесконечную строку также можно задать с помощью правил ассоциативного исчисления, клеточного автомата, рекурсивных соотношений.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
[[Слово Фибоначчи]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Thue%E2%80%93Morse_sequence Wikipedia — Thue-Morse sequence]&lt;br /&gt;
* [http://mathworld.wolfram.com/Thue-MorseSequence.html Wolfram Mathworld — Thue-Morse sequence]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Основные определения. Простые комбинаторные свойства слов]]&lt;/div&gt;</summary>
		<author><name>178.178.24.167</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D0%BE%D0%B2%D0%BE_%D0%A2%D1%83%D1%8D-%D0%9C%D0%BE%D1%80%D1%81%D0%B0&amp;diff=21958</id>
		<title>Слово Туэ-Морса</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D0%BE%D0%B2%D0%BE_%D0%A2%D1%83%D1%8D-%D0%9C%D0%BE%D1%80%D1%81%D0%B0&amp;diff=21958"/>
				<updated>2012-05-07T10:07:09Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.24.167: /* Свойства и эквивалентные определения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Определим последовательность строк &amp;lt;tex&amp;gt;T_n&amp;lt;/tex&amp;gt; над двухбуквенным алфавитом &amp;lt;tex&amp;gt;\{a, b\}&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;T_n = t_0 t_1 \dots t_{2^n-1}&amp;lt;/tex&amp;gt;, где:&lt;br /&gt;
* &amp;lt;tex&amp;gt;t_i = a&amp;lt;/tex&amp;gt;, если двоичная запись числа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; содержит чётное число единиц&lt;br /&gt;
* &amp;lt;tex&amp;gt;t_i = b&amp;lt;/tex&amp;gt;, иначе.&lt;br /&gt;
&lt;br /&gt;
Строки этой последовательности называются '''строками Туэ-Морса'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
&lt;br /&gt;
Приведём первые пять строк Туэ-Морса:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0 = a&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1 = ab&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2 = abba&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3 = abbabaab&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_4 = abbabaabbaababba&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства и эквивалентные определения ==&lt;br /&gt;
&lt;br /&gt;
Как видно из определения, символ на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой позиции не зависит от номера строки. Так как длина строк возрастает, каждая строка является собственным префиксом следующей, поэтому можно рассматривать получение следующей строки как приписывание к текущей строке некоторой другой строки.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\varphi&amp;lt;/tex&amp;gt; — морфизм, инвертирующий символы:&lt;br /&gt;
&amp;lt;tex&amp;gt;\varphi(x) = \left\{ \begin{array}{rl} &lt;br /&gt;
b, &amp;amp; x = a \\&lt;br /&gt;
a, &amp;amp; x = b, \\&lt;br /&gt;
\end{array} \right.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 тогда для строк Туэ-Морса верно следующее соотношение: &amp;lt;tex&amp;gt;T_{n + 1} = T_n \varphi(T_n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Заметим, что соответсвующие индексы символов при приписывании новой строки к строке &amp;lt;tex&amp;gt;T_n&amp;lt;/tex&amp;gt; получаются добавлением к индексам &amp;lt;tex&amp;gt;i = 0, 1, \dots, 2^n - 1&amp;lt;/tex&amp;gt; числа &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt;. Количество единиц в двоичной записи числа &amp;lt;tex&amp;gt;i + 2^n&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;i &amp;lt; 2^n&amp;lt;/tex&amp;gt;) ровно на один больше, чем в двоичной записи числа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Поэтому приписываемая строка есть ни что иное, как исходная строка с инвертированными символами.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Данная теорема позволяет определять последовательность строк Туэ-Морса следующим образом: &amp;lt;tex&amp;gt;T_0 = a&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;T_{n + 1} = T_n \varphi(T_n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Часто рассматривают предельный случай — бесконечную строку Туэ-Морса, любой символ которой можно получить из обычной строки Туэ-Морса с достаточно большим номером. Бесконечную строку также можно задать с помощью правил ассоциативного исчисления, клеточного автомата, рекурсивных соотношений.&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Thue%E2%80%93Morse_sequence Wikipedia — Thue-Morse sequence]&lt;br /&gt;
* [http://mathworld.wolfram.com/Thue-MorseSequence.html Wolfram Mathworld — Thue-Morse sequence]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Основные определения. Простые комбинаторные свойства слов]]&lt;/div&gt;</summary>
		<author><name>178.178.24.167</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D0%BE%D0%B2%D0%BE_%D0%A2%D1%83%D1%8D-%D0%9C%D0%BE%D1%80%D1%81%D0%B0&amp;diff=21957</id>
		<title>Слово Туэ-Морса</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D0%BE%D0%B2%D0%BE_%D0%A2%D1%83%D1%8D-%D0%9C%D0%BE%D1%80%D1%81%D0%B0&amp;diff=21957"/>
				<updated>2012-05-07T10:02:49Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.24.167: /* Свойства и эквивалентные определения */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Определим последовательность строк &amp;lt;tex&amp;gt;T_n&amp;lt;/tex&amp;gt; над двухбуквенным алфавитом &amp;lt;tex&amp;gt;\{a, b\}&amp;lt;/tex&amp;gt; следующим образом: &amp;lt;tex&amp;gt;T_n = t_0 t_1 \dots t_{2^n-1}&amp;lt;/tex&amp;gt;, где:&lt;br /&gt;
* &amp;lt;tex&amp;gt;t_i = a&amp;lt;/tex&amp;gt;, если двоичная запись числа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; содержит чётное число единиц&lt;br /&gt;
* &amp;lt;tex&amp;gt;t_i = b&amp;lt;/tex&amp;gt;, иначе.&lt;br /&gt;
&lt;br /&gt;
Строки этой последовательности называются '''строками Туэ-Морса'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
&lt;br /&gt;
Приведём первые пять строк Туэ-Морса:&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_0 = a&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_1 = ab&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_2 = abba&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_3 = abbabaab&amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt;T_4 = abbabaabbaababba&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Свойства и эквивалентные определения ==&lt;br /&gt;
&lt;br /&gt;
Как видно из определения, символ на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой позиции не зависит от номера строки. Так как длина строк возрастает, каждая строка является собственным префиксом следующей, поэтому можно рассматривать получение следующей строки как приписывание к текущей строке некоторой другой строки.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;\varphi&amp;lt;/tex&amp;gt; — морфизм, инвертирующий символы:&lt;br /&gt;
&amp;lt;tex&amp;gt;\varphi(x) = \left\{ \begin{array}{rl} &lt;br /&gt;
b, &amp;amp; x = a \\&lt;br /&gt;
a, &amp;amp; x = b, \\&lt;br /&gt;
\end{array} \right.&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 тогда для строк Туэ-Морса верно следующее соотношение: &amp;lt;tex&amp;gt;T_{n + 1} = T_n \varphi(T_n)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Заметим, что соответсвующие индексы символов при приписывании новой строки к строке &amp;lt;tex&amp;gt;T_n&amp;lt;/tex&amp;gt; получаются добавлением к индексам &amp;lt;tex&amp;gt;i = 0, 1, \dots, 2^n - 1&amp;lt;/tex&amp;gt; числа &amp;lt;tex&amp;gt;2^n&amp;lt;/tex&amp;gt;. Количество единиц в двоичной записи числа &amp;lt;tex&amp;gt;i + 2^n&amp;lt;/tex&amp;gt; ровно на один больше, чем в двоичной записи числа &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;. Поэтому приписываемая строка есть ни что иное, как исходная строка с инвертированными символами.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Данная теорема позволяет определять последовательность строк Туэ-Морса следующим образом: &amp;lt;tex&amp;gt;T_0 = a&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;T_{n + 1} = T_n \varphi(T_n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Часто рассматривают предельный случай — бесконечную строку Туэ-Морса, любой символ которой можно получить из обычной строки Туэ-Морса с достаточно большим номером. Бесконечную строку также можно задать с помощью правил ассоциативного исчисления, клеточного автомата, рекурсивных соотношений.&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Thue%E2%80%93Morse_sequence Wikipedia — Thue-Morse sequence]&lt;br /&gt;
* [http://mathworld.wolfram.com/Thue-MorseSequence.html Wolfram Mathworld — Thue-Morse sequence]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Основные определения. Простые комбинаторные свойства слов]]&lt;/div&gt;</summary>
		<author><name>178.178.24.167</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D0%B1%D0%BE%D1%80&amp;diff=21954</id>
		<title>Суффиксный бор</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%83%D1%84%D1%84%D0%B8%D0%BA%D1%81%D0%BD%D1%8B%D0%B9_%D0%B1%D0%BE%D1%80&amp;diff=21954"/>
				<updated>2012-05-07T09:25:38Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.24.167: /* Хранение в памяти */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Suffix_trie.png|thumb|right|Суффиксный бор для строки &amp;lt;tex&amp;gt;abbc&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
'''Суффиксный бор''' (англ. ''suffix trie'') {{---}} [[бор]], содержащий все суффиксы данной строки.&lt;br /&gt;
&lt;br /&gt;
По определению, в суффиксном боре для строки &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; (где &amp;lt;tex&amp;gt;\lvert s\rvert=n&amp;lt;/tex&amp;gt;) содержатся все строки &amp;lt;tex&amp;gt;s[1..n], ..., s[n..n]&amp;lt;/tex&amp;gt;. Заметим, что если в суффиксном боре находится строка &amp;lt;tex&amp;gt;s[i..n]&amp;lt;/tex&amp;gt;, то все ее префиксы &amp;lt;tex&amp;gt;s[i..j], i \le j \le n&amp;lt;/tex&amp;gt; уже содержатся в боре. &lt;br /&gt;
==Применение==&lt;br /&gt;
Суффиксный бор можно использовать для поиска подстроки в строке &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; (чтобы бор формально содержал все подстроки &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, нужно пометить все его вершины терминальными, при этом корень будет соответствовать пустой строке &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;). &lt;br /&gt;
Для поиска подстроки p в суффиксном боре нужно искать совпадения для символов из p вдоль единственного пути в боре до тех пор, пока либо p не исчерпается, либо дальнейшее совпадение будет невозможным. Если p исчерпалось, то подстрока найдена за &amp;lt;tex&amp;gt;O(|p|)&amp;lt;/tex&amp;gt;, если дальнейшее совпадение невозможно, то p нет в суффиксном дереве.&lt;br /&gt;
&lt;br /&gt;
==Свойства==&lt;br /&gt;
Суффиксный бор для строки &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;:&lt;br /&gt;
* Можно использовать для поиска образца &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; в строке &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; за время &amp;lt;tex&amp;gt;O(\lvert p\rvert)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Можно построить за время &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;, последовательно добавив все суффиксы &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Имеет порядка &amp;lt;tex&amp;gt;n^2&amp;lt;/tex&amp;gt; вершин.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
 '''struct Trie'''&lt;br /&gt;
    int [length^2][alphabet] trie &lt;br /&gt;
    number &amp;lt;tex&amp;gt; \leftarrow 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 '''Add'''(i, j)&lt;br /&gt;
   current &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; 0 &lt;br /&gt;
   '''for''' (char c &amp;lt;tex&amp;gt;\in&amp;lt;/tex&amp;gt; s[i, j])&lt;br /&gt;
     if (trie[current][c] &amp;lt;tex&amp;gt;\neq  &amp;lt;/tex&amp;gt;  -1)&lt;br /&gt;
       trie[current][c] &amp;lt;tex&amp;gt; \leftarrow&amp;lt;/tex&amp;gt; number &lt;br /&gt;
       number++; &lt;br /&gt;
     current &amp;lt;tex&amp;gt;\leftarrow&amp;lt;/tex&amp;gt; trie[current][c]&lt;br /&gt;
&lt;br /&gt;
 '''Build'''(String  s)&lt;br /&gt;
   '''for'''(int i = 0, i &amp;lt; n, i++)&lt;br /&gt;
     Add(i, n)&lt;br /&gt;
&lt;br /&gt;
==Оценки использования памяти==&lt;br /&gt;
Пусть мы построили суффиксный бор для строки &amp;lt;tex&amp;gt;s \in \Sigma*&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;|s| = n&amp;lt;/tex&amp;gt;. Из третьего свойства следует, что если хранить переходы суффиксного бора  из каждой вершины как массив размера &amp;lt;tex&amp;gt;|\Sigma|&amp;lt;/tex&amp;gt; (по каждому символу — ребенок), то потребуется &amp;lt;tex&amp;gt;O(n^2 |\Sigma|)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
Однако, заметим, что число ветвлений в боре равно количеству суффиксов, так как каждый лист соответствует единственному суффиксу. Количество суффиксов  — &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, а значит число вершин, из которых ведет больше одного перехода, &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;. Поэтому, если в неветвящихся вершинах хранить только символ перехода и ребенка, то можно получить оценку &amp;lt;tex&amp;gt;O(n^2 + n|\Sigma|)&amp;lt;/tex&amp;gt;. Улучшением суффиксного бора, расходующим всего &amp;lt;tex&amp;gt;O( n|\Sigma|)&amp;lt;/tex&amp;gt; памяти, является [[сжатое суффиксное дерево]].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Словарные структуры данных]]&lt;/div&gt;</summary>
		<author><name>178.178.24.167</name></author>	</entry>

	</feed>