<?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.27.113&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.27.113&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.27.113"/>
		<updated>2026-05-19T14:02:17Z</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=21829</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=21829"/>
				<updated>2012-05-03T19:51:09Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.27.113: /* Факт №2 */&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;S&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;S_{i}&amp;lt;/tex&amp;gt; {{---}} суффикс строки &amp;lt;tex&amp;gt;S&amp;lt;/tex&amp;gt;, начинающийся в &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ом символе. Пусть задан суффиксный массив &amp;lt;tex&amp;gt;Suf&amp;lt;/tex&amp;gt;. Для вычисления &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; будем использовать промежуточный массив &amp;lt;tex&amp;gt;Suf^{-1}&amp;lt;/tex&amp;gt;. Массив &amp;lt;tex&amp;gt;Suf^{-1}&amp;lt;/tex&amp;gt; определен как обратный к массиву &amp;lt;tex&amp;gt;Suf&amp;lt;/tex&amp;gt;. Он может быть получен немедленно, если задан массив &amp;lt;tex&amp;gt;Suf&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;Suf[k] = i&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;Suf^{-1}[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;Suf[i]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Suf[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;Suf&amp;lt;/tex&amp;gt;. То есть &amp;lt;tex&amp;gt;LCP(S_{Suf[x]}, S_{Suf[z]}) = \min_{x &amp;lt; y \le z}(LCP(S_{Suf[y - 1]},S_{Suf[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;Suf&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(S_{Suf[y - 1]}, S_{Suf[y]}) \ge LCP(S_{Suf[x]},S_{Suf[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;Suf&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(S_{Suf[x-1]} , S_{Suf[x]} ) &amp;gt; 1&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;Suf^{-1}[Suf[x - 1] + 1] &amp;lt; Suf^{-1}[Suf[x] + 1]&amp;lt;/tex&amp;gt;&lt;br /&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;S_{Suf[x-1]+1}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_{Suf[x]+1}&amp;lt;/tex&amp;gt; на один меньше значения &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;S_{Suf[x-1]}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_{Suf[x]}&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=Если &amp;lt;tex&amp;gt;LCP(S_{Suf[x-1]} , S_{Suf[x]} ) &amp;gt; 1&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;LCP(S_{Suf[x-1]+1} , S_{Suf[x]+1}) = LCP(S_{Suf[x-1]} , S_{Suf[x]} ) - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&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;S_{i}&amp;lt;/tex&amp;gt; и его соседних суффиксом в массиве &amp;lt;tex&amp;gt;Suf&amp;lt;/tex&amp;gt;, при условии, что значение &amp;lt;tex&amp;gt;LCP&amp;lt;/tex&amp;gt; между &amp;lt;tex&amp;gt;S_{i-1}&amp;lt;/tex&amp;gt; и его соседним суффиксом известны. Для удобства записи пусть &amp;lt;tex&amp;gt;p=Suf^{-1}[i - 1]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;q = Suf^{-1}[i]&amp;lt;/tex&amp;gt;. Так же пусть &amp;lt;tex&amp;gt;j - 1 = Suf[p-1]&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;k = Suf[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(S_{j-1}, S_{i-1}) &amp;gt; 1&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;LCP(S_k,S_i) \ge LCP(S_j,S_i)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Так как &amp;lt;tex&amp;gt;LCP(S_{j-1},S_{i-1}) &amp;gt; 1&amp;lt;/tex&amp;gt;, имеем &amp;lt;tex&amp;gt;Suf^{-1}[j] &amp;lt; Suf^{-1}[i]&amp;lt;/tex&amp;gt; из факта №2. Так как &amp;lt;tex&amp;gt;Suf^{-1}[j] \le Suf^{-1}[k] = Suf^{-1}[i] - 1&amp;lt;/tex&amp;gt;, имеем &amp;lt;tex&amp;gt;LCP(S_{k} , S_{i}) \ge LCP(S_{j} , S_{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(S_{j-1}, S_{i-1}) &amp;gt; 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;Height[q] = LCP(S_{k}, S_{i}) \ge Height[p] - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;LCP(S_{k}, S_{i}) \ge LCP(S_{j} , S_{i})&amp;lt;/tex&amp;gt;(из Леммы) = &amp;lt;tex&amp;gt;LCP(S_{j-1}, S_{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;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Суффиксный массив]]&lt;/div&gt;</summary>
		<author><name>178.178.27.113</name></author>	</entry>

	</feed>