Суффиксный массив — различия между версиями
Mogikan (обсуждение | вклад) (→Добавлено новое применение) |
Mogikan (обсуждение | вклад) (→Поиск строки максимальной длины, ветвящейся влево и вправо 1.0) |
||
Строка 22: | Строка 22: | ||
'''Строка <tex>s</tex> называется ветвящейся вправо в <tex>t</tex>''' (англ. ''right branching string''), если существуют символы <tex>c</tex> и <tex>d</tex>, такие что <tex>c</tex> <tex>\ne</tex> <tex>d</tex> : <tex>sc</tex> и <tex>sd</tex> {{---}} подстроки <tex>t</tex>. Аналогично, '''ветвящаяся влево''' (англ. ''left branching''), если <tex>cs</tex> и <tex>ds</tex> {{---}} подстроки <tex>t</tex>. | '''Строка <tex>s</tex> называется ветвящейся вправо в <tex>t</tex>''' (англ. ''right branching string''), если существуют символы <tex>c</tex> и <tex>d</tex>, такие что <tex>c</tex> <tex>\ne</tex> <tex>d</tex> : <tex>sc</tex> и <tex>sd</tex> {{---}} подстроки <tex>t</tex>. Аналогично, '''ветвящаяся влево''' (англ. ''left branching''), если <tex>cs</tex> и <tex>ds</tex> {{---}} подстроки <tex>t</tex>. | ||
}} | }} | ||
+ | {{Определение | ||
+ | |definition= | ||
+ | '''Левый символ''' для позиции <tex>i</tex> строки <tex>S</tex> {{---}} это символ <tex>S(i-1)</tex>. | ||
+ | }} | ||
+ | |||
+ | Что бы найти максимальную строку, ветвящуюся влево и вправо, строится суффиксный массив из которого исключается суффикс равный самой строке, к примеру для строки <tex>aabcabd</tex> : | ||
+ | {| class="wikitable" border = 1 | ||
+ | |- | ||
+ | !Суффиксный массив | ||
+ | |- style = "text-align = right" | ||
+ | | 1 |<tex>abcabd</tex> | ||
+ | |- | ||
+ | | 2 |<tex>abd</tex> | ||
+ | |- | ||
+ | | 3 |<tex>bcabd</tex> | ||
+ | |- | ||
+ | | 4 |<tex>bd</tex> | ||
+ | |- | ||
+ | | 5 |<tex>cabd</tex> | ||
+ | |- | ||
+ | | 6 |<tex>d</tex> | ||
+ | |} | ||
+ | |||
+ | Далее вычисляется <tex>LCP</tex> для суффиксного массива, и находятся левые символы суффиксов: | ||
+ | {| class="wikitable" border = 1 | ||
+ | |- | ||
+ | !Левый символ | ||
+ | !Суффиксный массив | ||
+ | !LCP | ||
+ | |- style = "text-align = center" | ||
+ | | 1 |<tex>a</tex>||<tex>abcabd</tex>||<tex>\#</tex> | ||
+ | |- | ||
+ | | 2 |<tex>c</tex>||<tex>abd</tex>||<tex>2</tex> | ||
+ | |- | ||
+ | | 3 |<tex>a</tex>||<tex>bcabd</tex>||<tex>0</tex> | ||
+ | |- | ||
+ | | 4 |<tex>a</tex>||<tex>bd</tex>||<tex>1</tex> | ||
+ | |- | ||
+ | | 5 |<tex>b</tex>||<tex>cabd</tex>||<tex>0</tex> | ||
+ | |- | ||
+ | | 6 |<tex>b</tex>||<tex>d</tex>||<tex>0</tex> | ||
+ | |} | ||
+ | Максимальная строка, ветвящаяся влево и вправо, находится путём проверки значений <tex>LCP</tex> и левого символа: | ||
+ | Ветвление вправо: | ||
+ | *Если <tex>LCP</tex> от пары суффиксов <tex>s_1</tex> и <tex>s_2</tex> больше нуля и не равен длинам этих суффиксов, то строка <tex>s</tex>, равная <tex>s_1[1..LCP(s_1,s_2)]</tex>, ветвится вправо. | ||
+ | Ветвление влево: | ||
+ | *Если левые символы <tex>s_1</tex> и <tex>s_2</tex> не равны, то строка <tex>s</tex>, равная <tex>s_1[1..LCP(s_1,s_2)]</tex>, ветвится влево. | ||
+ | |||
+ | Если выполнены оба условия, то строка ветвится вправо и влево. | ||
+ | С помощью этой проверки находится максимальная строка, ветвящаяся влево и вправо, за <tex>O(n)</tex>. | ||
==См. также== | ==См. также== |
Версия 22:00, 26 мая 2015
Определение: |
Cуффиксным массивом (англ. suffix array) строки | называется массив целых чисел от до , такой, что суффикс — -й в лексикографическом порядке среди всех непустых суффиксов строки .
Содержание
Пример
Значит, суффиксный массив для строки
равен .Применения
- Позволяет найти все вхождения образца в строку за время .
- Позволяет вычислить наибольший общий префикс (англ. longest common prefix, LCP) для всех соседних в лексикографическом порядке суффиксов строки за , то есть построить массив , где — длина наибольшего общего префикса суффиксов и .
- Позволяет найти количество различных подстрок в строке за время и дополнительной памяти.
- Позволяет найти наименьший циклический сдвиг строки за время .
- Позволяет найти максимальную по длине строку, ветвящуюся влево и вправо за время , где — время построения суффиксного массива.
Поиск строки максимальной длины, ветвящейся влево и вправо
Определение: |
Строка | называется ветвящейся вправо в (англ. right branching string), если существуют символы и , такие что : и — подстроки . Аналогично, ветвящаяся влево (англ. left branching), если и — подстроки .
Определение: |
Левый символ для позиции | строки — это символ .
Что бы найти максимальную строку, ветвящуюся влево и вправо, строится суффиксный массив из которого исключается суффикс равный самой строке, к примеру для строки :
Суффиксный массив |
---|
Далее вычисляется
для суффиксного массива, и находятся левые символы суффиксов:Левый символ | Суффиксный массив | LCP |
---|---|---|
Максимальная строка, ветвящаяся влево и вправо, находится путём проверки значений
и левого символа: Ветвление вправо:- Если от пары суффиксов и больше нуля и не равен длинам этих суффиксов, то строка , равная , ветвится вправо.
Ветвление влево:
- Если левые символы и не равны, то строка , равная , ветвится влево.
Если выполнены оба условия, то строка ветвится вправо и влево. С помощью этой проверки находится максимальная строка, ветвящаяся влево и вправо, за
.См. также
- Построение суффиксного массива с помощью стандартных методов сортировки
- Алгоритм поиска подстроки в строке с помощью суффиксного массива
- Алгоритм Касаи и др.
Источники
- Дэн Гасфилд — Строки, деревья и последовательности в алгоритмах: Информатика и вычислительная биология — СПб.: Невский Диалект; БХВ-Петербург, 2003. — 654 с: ил.
- MAXimal :: algo :: Суффиксный массив
- Википедия — Суффиксный массив
- Wikipedia — Suffix array
- Habrahabr — Суффиксный массив — удобная замена суффиксного дерева