Декомпозиция Линдона — различия между версиями
(→Алгоритм Дюваля) |
(→Алгоритм Дюваля) |
||
| Строка 80: | Строка 80: | ||
i <tex>\leftarrow</tex> 0 | i <tex>\leftarrow</tex> 0 | ||
w <tex>\leftarrow</tex> 0 | w <tex>\leftarrow</tex> 0 | ||
| − | while (i < n) { | + | '''while''' (i < n) { |
j <tex>\leftarrow</tex> i + 1 | j <tex>\leftarrow</tex> i + 1 | ||
k <tex>\leftarrow</tex> i | k <tex>\leftarrow</tex> i | ||
| − | while (j < n and s[k] <= s[j]) { | + | '''while''' (j < n and s[k] <= s[j]) { |
| − | if s[k] < s[j] | + | '''if''' s[k] < s[j] |
k <tex>\leftarrow</tex> i | k <tex>\leftarrow</tex> i | ||
| − | else | + | '''else''' |
k <tex>\leftarrow</tex> k + 1 | k <tex>\leftarrow</tex> k + 1 | ||
j <tex>\leftarrow</tex> j + 1 | j <tex>\leftarrow</tex> j + 1 | ||
} | } | ||
| − | while (i <= k) { | + | '''while''' (i <= k) { |
words[w] <tex>\leftarrow</tex> s[i..j-k] | words[w] <tex>\leftarrow</tex> s[i..j-k] | ||
w <tex>\leftarrow</tex> w + 1 | w <tex>\leftarrow</tex> w + 1 | ||
Версия 21:56, 1 мая 2014
Основные определения
Декомпозиция Линдона была изобретена Роджером Линдоном (англ. Roger Lyndon) в 1954 году. Она используется для нахождения лексикографически минимального и максимального суффиксов строки.
| Определение: |
| Простая строка — строка, которая строго лексикографически меньше любого своего суффикса. |
| Определение: |
| Декомпозиция Линдона (англ. Lyndon decomposition) строки — её разложение , где строки просты, и при этом . |
Существование и единственность
| Лемма: |
, — простые и лексикографически. Тогда:
1. 2. — простая |
| Доказательство: |
|
1. Так как , и , 2. Пусть — суффикс строки 1) 2) — суффикс . Так как — простая, 3) , . Так как — простая, и |
| Теорема: |
Можно построить декомпозицию Линдона любой строки , причем единственным образом. |
| Доказательство: |
|
1. Существование. Разобьем строку на символы. Будем их склеивать, если подряд идущие символы: . Так как символ — простая строка, по лемме — тоже простая и . Далее склеиваем строки, не удовлетворяющие условию . Это конечный процесс, так как длина строки конечна получим нужное разбиение. Пусть существует хотя бы одно разбиение строки на простые слова. Возьмем разбиение строки на простые слова (без условия ) такое, чтобы было минимально. Пусть в нем есть , тогда эти строки можно сконкатернировать получим разбиение с меньшим числом слов — противоречие с выбором . Получили: — минимально нет 2. Единственность. Пусть существует несколько разбиений , удовлетворяющих условию теоремы. Сравним длины первых двух слов и , если , сравним вторые и так далее. Если у всех слов длины одинаковы, то разбиения совпадают — противоречие. Иначе Покажем, что такого не может быть: 1) Пусть Тогда , где — префикс , Получаем: (так как простая и по определению меньше своего суффикса), (так как — префикс), (по условию разбиения), (их начало совпадает, и по предположению. Получили противоречие: . 2) Пусть — проверяется аналогично. То есть не может быть строк несовпадающей длины разбиения равны. |
Алгоритм Дюваля
Алгоритм Дюваля (англ. Duval's algorithm) находит для данной строки длины декомпозицию Линдона за время с использованием дополнительной памяти.
| Определение: |
| Предпростая строка — строка , такая что , где — некоторая простая строка, а - некоторый префикс строки . |
string s // входная строка string[] words // декомпозиция n |s| i 0 w 0 while (i < n) { j i + 1 k i while (j < n and s[k] <= s[j]) { if s[k] < s[j] k i else k k + 1 j j + 1 } while (i <= k) { words[w] s[i..j-k] w w + 1 i i + j - k; } }