Суффиксный массив
Суффиксный массив — лексикографически отсортированный массив всех суффиксов строки. Эта структура данных была разработана Юджином Майерсом и Уди Манбером как более экономная альтернатива суффиксному дереву с точки зрения необходимой памяти. Она часто применяется там, где необходим быстрый поиск подстрок, например в преобразовании Барроуза — Уилера (BWT), а также в качестве структуры данных в поисковом индексе.
Пример
Рассмотрим строку «abracadabra» длиной 11 символов.
a b r a c a d a b r a 1 2 3 4 5 6 7 8 9 10 11
Отсортированный список её суффиксов:
a abra abracadabra acadabra adabra bra bracadabra cadabra dabra ra racadabra
Суффиксный массив этой строки — {11,8,1,4,6,9,2,5,7,10,3}, потому что суффикс «a» начинается с 11-го знака, суффикс «abra» — с 8-го, и так далее, вплоть до последнего суффикса «racadabra», который начинается с третьего символа исходного слова.
Теперь с помощью этого массива можно легко найти все подстроки. Например, если нужно найти подстроку «ab», достаточно найти все суффиксы, которые начинаются на «ab». За счёт сортировки по алфавиту они находятся рядом друг с другом. Используя бинарный поиск, мы находим 2-й и 3-й суффиксы «abra» и «abracadabra», которым соответствуют 2-й и 3-й элемент суффиксного массива (8 и 1). Это означает, что искомая подстрока «ab» встречается на первом и восьмом символе в исходном слове.
Построение
Суффиксный массив можно построить как с помощью суффиксного дерева, так и без него, дополнив строку до циклической длины степени двойки, и применив к нему конкретный алгоритм.
Через суффиксное дерево
|
Сложность построения — [math]\displaystyle{ O(|T|) }[/math], линия включает в себя построение суффиксного дерева и обход в глубину.
Поиск
Поиск в суффиксном массиве можно осуществить через бинарный поиск. Его худшая оценка [math]\displaystyle{ O(n\log{m}) }[/math]. Но можно ускорить до [math]\displaystyle{ O(n + \log_2{m}) }[/math].
Наивный бинарный поиск
|
Простое ускорение
|
Ускорение через LCP
Наибольший общий префикс (Шаблон:Lang-en) — для двух строк [math]\displaystyle{ S_1 }[/math], [math]\displaystyle{ S_2 }[/math] [math]\displaystyle{ LCP(S_1, S_2) }[/math] — длина наибольшего совпадающего префикса.
В этом алгоритме будем считать, что [math]\displaystyle{ LCP }[/math] для любых двух суффиксов вычисляется за [math]\displaystyle{ O(1) }[/math]. Функция вычисляется на этапе препроцессинга при построении дерева. Также верно утверждение: [math]\displaystyle{ LCP(i, j) = min(LCP(k, k + 1)), i\leq k \lt j }[/math].
Благодаря этой функции можно оптимизировать бинарный поиск по суффиксному массиву.
Лемма: Если на левой и правой границе ([math]\displaystyle{ L }[/math], [math]\displaystyle{ R }[/math] соответственно индексы суффиксного массива) совпадают первые [math]\displaystyle{ k }[/math] символов суффикса, то столько же символов будет совпадать для всех суффиксов на отрезке [math]\displaystyle{ [L,R] }[/math].
|
Такое сверхускорение даёт время [math]\displaystyle{ O(|P|+\log_2{|T|}) }[/math], так как выполняется [math]\displaystyle{ \log_2{|T|} }[/math] итераций по суффиксному массиву.
Связанные алгоритмы
- Алгоритм Касаи построения массива наибольших общих префиксов.
См. также
Ссылки
- Суффиксный массив. Алгоритм построения и применения
- Суффиксный массив и BWT
- Визуализатор алгоритма (требуется Java)
- Дискретная математика: алгоритмы. Суффиксные массивы
- Реализация суффиксного массива на Java
Литература
- {{#if:Шаблон:Nobr|Шаблон:Nobr }}{{#if: |{{#if: |[{{{ссылка часть}}} {{{часть}}}]| {{{часть}}}}} // }}{{#if:|[[:s:{{{викитека}}}|Строки, деревья и последовательности в алгоритмах: Информатика и вычислительная биология]]|{{#if:|[ Строки, деревья и последовательности в алгоритмах: Информатика и вычислительная биология]|Строки, деревья и последовательности в алгоритмах: Информатика и вычислительная биология}}}}{{#if:| = {{{оригинал}}} }}{{#if:Пер. с англ. И. В. Романовского| / Пер. с англ. И. В. Романовского.|{{#if:||.}}}}{{#if:Строки, деревья и последовательности в алгоритмах: Информатика и вычислительная биология|{{#if:| {{#if:| = {{{оригинал2}}} }}{{#if:| / {{{ответственный2}}}.|{{#if:||.}}}}}}}}{{#if:2-е изд| — 2-е изд.}}{{#switch:{{#if:СПб.|м}}{{#if:Невский Диалект|и}}{{#if:2003|г}}
|миг= — {{#if:СПб.|{{#switch:СПб.|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.=Шаблон:СПб.|СПб.}} }}: Невский Диалект, 2003.
|ми= — {{#if:СПб.|{{#switch:СПб.|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.=Шаблон:СПб.|СПб.}} }}: Невский Диалект.
|мг= — {{#if:СПб.|{{#switch:СПб.|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.=Шаблон:СПб.|СПб.}} }}, 2003.
|иг= — Невский Диалект, 2003.
|м= — {{#if:СПб.|{{#switch:СПб.|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.=Шаблон:СПб.|СПб..}} }}
|и= — Невский Диалект.
|г= — 2003.
}}{{#if:| — {{{том как есть}}}.}}{{#if:| — Т. {{{том}}}.}}{{#if:| — Vol. {{{volume}}}.}}{{#if:| — B. {{{band}}}.}}{{#if:| — {{{страницы как есть}}}.}}{{#if:| — С. {{{страницы}}}.}}{{#if:| — {{{страниц как есть}}}.}}{{#if:654| — 654 с.}}{{#if:| — P. {{{pages}}}.}}{{#if:| — S. {{{seite}}}.}}{{#if:| — p.}}{{#if:| — s.}}{{#if:| — ({{{серия}}}).}}{{#if:| — Шаблон:Nobr}}{{#if:| — ISBN {{{isbn}}}}}
- {{#if:Шаблон:Nobr|Шаблон:Nobr }}{{#if: |{{#if: |[{{{ссылка часть}}} {{{часть}}}]| {{{часть}}}}} // }}{{#if:|[[:s:{{{викитека}}}|Методы и алгоритмы вычислений на строках]]|{{#if:|[ Методы и алгоритмы вычислений на строках]|Методы и алгоритмы вычислений на строках}}}}{{#if:Computing Patterns in Strings| = Computing Patterns in Strings }}{{#if:| / .|{{#if:||.}}}}{{#if:Методы и алгоритмы вычислений на строках|{{#if:| {{#if:| = {{{оригинал2}}} }}{{#if:| / {{{ответственный2}}}.|{{#if:||.}}}}}}}}{{#if:| — .}}{{#switch:{{#if:М.|м}}{{#if:Вильямс|и}}{{#if:2006|г}}
|миг= — {{#if:М.|{{#switch:М.|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.=Шаблон:М.|М.}} }}: Вильямс, 2006.
|ми= — {{#if:М.|{{#switch:М.|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.=Шаблон:М.|М.}} }}: Вильямс.
|мг= — {{#if:М.|{{#switch:М.|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.=Шаблон:М.|М.}} }}, 2006.
|иг= — Вильямс, 2006.
|м= — {{#if:М.|{{#switch:М.|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.=Шаблон:М.|М..}} }}
|и= — Вильямс.
|г= — 2006.
}}{{#if:| — {{{том как есть}}}.}}{{#if:| — Т. {{{том}}}.}}{{#if:| — Vol. {{{volume}}}.}}{{#if:| — B. {{{band}}}.}}{{#if:| — {{{страницы как есть}}}.}}{{#if:| — С. {{{страницы}}}.}}{{#if:| — {{{страниц как есть}}}.}}{{#if:496| — 496 с.}}{{#if:| — P. {{{pages}}}.}}{{#if:| — S. {{{seite}}}.}}{{#if:| — p.}}{{#if:| — s.}}{{#if:| — ({{{серия}}}).}}{{#if:| — Шаблон:Nobr}}{{#if:5-8459-1081-1, 0-201-39839-7| — ISBN 5-8459-1081-1, 0-201-39839-7}} Шаблон:Строки
