<?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=94.25.193.57&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=94.25.193.57&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/94.25.193.57"/>
		<updated>2026-06-15T11:28:45Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B0%D1%81%D0%B0%D0%B8_%D0%B8_%D0%B4%D1%80.&amp;diff=20822</id>
		<title>Алгоритм Касаи и др.</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B0%D1%81%D0%B0%D0%B8_%D0%B8_%D0%B4%D1%80.&amp;diff=20822"/>
				<updated>2012-04-16T17:47:28Z</updated>
		
		<summary type="html">&lt;p&gt;94.25.193.57: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Алгоритм Касаи''' (Аримуры-Арикавы-Касаи-Ли-Парка) {{---}} алгоритм, позволяющий за линейное время вычислить&lt;br /&gt;
значения наибольших общих префиксов для соседних циклических сдвигов строки, отсортированных в лексикографическом&lt;br /&gt;
порядке (largest common prefix, далее &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Обозначения==&lt;br /&gt;
Задана строка &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;A_{i}&amp;lt;/tex&amp;gt; {{---}} суфикс строки &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;, начинающийся в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом символе. Пусть задан суфиксный массив &amp;lt;tex&amp;gt;Pos&amp;lt;/tex&amp;gt;. Для вычисления &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; будем использовать промежуточный массив &amp;lt;tex&amp;gt;Rank&amp;lt;/tex&amp;gt;. Массив &amp;lt;tex&amp;gt;Rank&amp;lt;/tex&amp;gt; определен как обратный к массиву &amp;lt;tex&amp;gt;Pos&amp;lt;/tex&amp;gt;. Он может быть получен немедленно, если задан массив &amp;lt;tex&amp;gt;Pos&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;Pos[k] = i&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;Rank[i] = k&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;Height[i]&amp;lt;/tex&amp;gt; {{---}} длина наибольшего общего префикса &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;i-1&amp;lt;/tex&amp;gt; строк в суффиксном массиве (&amp;lt;tex&amp;gt;Pos[i]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Pos[i-1]&amp;lt;/tex&amp;gt; соответственно).&lt;br /&gt;
&lt;br /&gt;
==Некоторые свойства &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt;==&lt;br /&gt;
===Факт №1===&lt;br /&gt;
&amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между двумя суфиксами {{---}} это минимум &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; всех пар смежных суфиксов между ними в суфиксном массиве &amp;lt;tex&amp;gt;Pos&amp;lt;/tex&amp;gt;. То есть &amp;lt;tex&amp;gt;LCP(A_{Pos[x]}, A_{Pos[z]}) = min_{x &amp;lt; y \le z}(LCP(A_{Pos[y - 1]},A_{Pos[y]})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Отсюда следует, что &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; пары соседних суфиксов в массиве &amp;lt;tex&amp;gt;Pos&amp;lt;/tex&amp;gt; больше или равно &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; пары суфиксов, окружающих их.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt;LCP(A_{Pos[y - 1]}, A_{Pos[y]}) \le LCP(A_{Pos[x]},A_{Pos[z]}), x &amp;lt; y \le z&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Факт №2===&lt;br /&gt;
Если значение &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между парой соседних суфиксов, смежных в массиве &amp;lt;tex&amp;gt;Pos&amp;lt;/tex&amp;gt; больше &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, то лексикографический порядок суффиксов сохранится, если удалить первый символ каждого суффикса.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;LCP(A_{Pos[x-1]} , A_{Pos[x]} ) &amp;gt; 1&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;Rank[Pos[x - 1] + 1] &amp;lt; Rank[Pos[x] + 1]&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
===Факт №3===&lt;br /&gt;
В этом же случае, значение &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;A_{Pos[x-1]+1}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A_{Pos[x]+1}&amp;lt;/tex&amp;gt; на один меньше значения &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;A_{Pos[x-1]}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;A_{Pos[x]}&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Если &amp;lt;tex&amp;gt;LCP(A_{Pos[x-1]} , A_{Pos[x]} ) &amp;gt; 1&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;LCP(A_{Pos[x-1]+1} , A_{Pos[x]+1}) = LCP(A_{Pos[x-1]} , A_{Pos[x]} ) - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Теперь рассмотрим следующую задачу: расчитать &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между суфиксом &amp;lt;tex&amp;gt;A_{i}&amp;lt;/tex&amp;gt; и его смежным суфиксом в массиве &amp;lt;tex&amp;gt;Pos&amp;lt;/tex&amp;gt;, при условии, что значение &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;A_{i-1}&amp;lt;/tex&amp;gt; и его смежным суфиксом известны. Для удобства записи пусть &amp;lt;tex&amp;gt;p=Rank[i - 1]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;q = Rank[i]&amp;lt;/tex&amp;gt;. Так же пусть &amp;lt;tex&amp;gt;j - 1 = Pos[p-1]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;k = Pos[q - 1]&amp;lt;/tex&amp;gt;. Проще говоря, мы хотим посчитать &amp;lt;tex&amp;gt;Height[q]&amp;lt;/tex&amp;gt;, когда задано &amp;lt;tex&amp;gt;Height[p]&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Лемма|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;LCP(A_{j-1}, A_{i-1}) &amp;gt; 1&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;LCP(A_k,A_i) \le LCP(A_j,A_i)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;LCP(A_{j−1},A_{i−1}) &amp;gt; 1&amp;lt;/tex&amp;gt;, имеем &amp;lt;tex&amp;gt;Rank[j] &amp;lt; Rank[i]&amp;lt;/tex&amp;gt; из факта №2. Так как &amp;lt;tex&amp;gt;Rank[j] \le Rank[k] = Rank[i] - 1&amp;lt;/tex&amp;gt;, имеем &amp;lt;tex&amp;gt;LCP(A_{k} , A_{i}) \ge LCP(A_{j} , A_{i})&amp;lt;/tex&amp;gt; из факта №1&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;Height[p] = lcp(A_{j-1}, A_{i-1}) &amp;gt; 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;Height[q] = lcp(A_{k}, A_{i}) \ge Height[p] - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;LCP(A_{k}, A_{i}) \ge LCP(A_{j} , A_{i})&amp;lt;/tex&amp;gt;(из Леммы) = &amp;lt;tex&amp;gt;LCP(A_{j-1}, A_{i−1}) - 1&amp;lt;/tex&amp;gt; (из факта №3).&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Описание алгоритма==&lt;br /&gt;
Таким образом, начиная проверять &amp;lt;tex&amp;gt;lcp&amp;lt;/tex&amp;gt; для текущего суффикса не с первого символа, а с указанного, можно за линейное время построить &amp;lt;tex&amp;gt;lcp&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Покажем, что построение &amp;lt;tex&amp;gt;lcp&amp;lt;/tex&amp;gt; таким образом действительно требует &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt; времени. Действительно, на каждой итерации текущее значение &amp;lt;tex&amp;gt;lcp&amp;lt;/tex&amp;gt; может быть не более&lt;br /&gt;
чем на единицу меньше предыдущего. Таким образом, значения &amp;lt;tex&amp;gt;lcp&amp;lt;/tex&amp;gt; в сумме могут увеличиться не более, чем на &amp;lt;tex&amp;gt;2N&amp;lt;/tex&amp;gt; (с точностью до константы). Следовательно, алгоритм построит &amp;lt;tex&amp;gt;lcp&amp;lt;/tex&amp;gt; за &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
1. [http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%B0%D1%81%D0%B0%D0%B8  Алгоритм Касаи].&amp;lt;br/&amp;gt;&lt;br /&gt;
2. [http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.118.8221  T.Kasai, G.Lee, H.Arimura, S.Arikawa, K.Park - Linear-Time Longest-Common-Prefix Computation in Suffix Arrays and Its Application].&lt;/div&gt;</summary>
		<author><name>94.25.193.57</name></author>	</entry>

	</feed>