Суффиксный автомат: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
м сортировка служебных отметок
Продолжаю расширять статью. Все приведённые утверждения так или иначе встречаются в упомянутых источниках, по мере расширения статьи буду проставлять конкретные ссылки.
Строка 1: Строка 1:
'''Суффиксный автомат''' ([[Английский язык|англ.]] ''suffix automaton'', ''directed acyclic word graph'', ''DAWG'') — детерминированный [[конечный автомат]], принимающий все суффиксы данной строки <math>S</math> и только их, и обладающий наименьшим возможным числом состояний среди всех таких автоматов. Автомат был впервые описан Блумером и др. в 1983 г.<ref>{{Статья|автор=A. Blumer, J. Blumer, A. Ehrenfeucht, D. Haussler, R. McConnell|год=1984|isbn=9783540133452, 9783540388869|страницы=109–118|заглавие=Building the minimal DFA for the set of all subwords of a word on-line in linear time|ссылка=http://dx.doi.org/10.1007/3-540-13345-3_9|место=Berlin, Heidelberg|издательство=Springer Berlin Heidelberg|издание=Automata, Languages and Programming}}</ref>, в той же работе впервые было показано, что размер суффиксного автомата линеен по длине строки, а также был предложен {{Не переведено 5|Онлайн-алгоритм|онлайн-алгоритм||Online algorithm}} для построения автомата с линейным [[Вычислительная сложность|временем работы]]. В 1987 г. Блумер и др. по аналогии с [[Суффиксное дерево|суффиксным деревом]] описали сжатый суффикный автомат (англ. ''compact directed acyclic word graph'', ''CDAWG'')<ref>{{Статья|автор=A. Blumer, J. Blumer, D. Haussler, R. McConnell, A. Ehrenfeucht|год=1987-07-01|doi=10.1145/28869.28873|issn=0004-5411|выпуск=3|страницы=578–595|издание=Journal of the ACM|заглавие=Complete inverted files for efficient text retrieval and analysis|ссылка=http://dx.doi.org/10.1145/28869.28873|том=34}}</ref>, получаемый из суффиксного автомата удалением состояний с [[Полустепень исхода|полустепенью исхода]], равной единице, а в 1997 г. Крошемор и Верин разработали линейный алгоритм для его непосредственного построения<ref>{{Статья|автор=Maxime Crochemore, Renaud Vérin|ответственный=Jan Mycielski, Grzegorz Rozenberg, Arto Salomaa|год=1997|doi=10.1007/3-540-63246-8_12|isbn=9783540692423|язык=en|страницы=192–211|заглавие=On compact directed acyclic word graphs|ссылка=https://doi.org/10.1007/3-540-63246-8_12|место=Berlin, Heidelberg|издательство=Springer Berlin Heidelberg|издание=Structures in Logic and Computer Science: A Selection of Essays in Honor of A. Ehrenfeucht}}</ref>. В 2001 г. Иненага и др. разработали линейный онлайн-алгоритм для построения сжатого суффиксного автомата<ref>{{Статья|автор=Shunsuke Inenaga, Hiromasa Hoshino, Ayumi Shinohara, Masayuki Takeda, Setsuo Arikawa|год=2005-03-01|doi=10.1016/j.dam.2004.04.012|issn=0166-218X|выпуск=2|страницы=156–179|издание=Discrete Applied Mathematics|заглавие=On-line construction of compact directed acyclic word graphs|ссылка=http://www.sciencedirect.com/science/article/pii/S0166218X04003464|том=146}}</ref>, а также линейный алгоритм для построения сжатого суффиксного автомата для набора строк, заданного [[Префиксное дерево|бором]]<ref>{{Статья|автор=S. Inenaga, H. Hoshino, A. Shinohara, M. Takeda, S. Arikawa|заглавие=Construction of the CDAWG for a trie|ссылка=https://www.researchgate.net/profile/Thierry_Lecroq/publication/2485748_Approximate_String_Matching_in_Musical_Sequences/links/09e415108d23eeaa5a000000/Approximate-String-Matching-in-Musical-Sequences.pdf#page=44|язык=|издание=Proceedings of the Prague Stringology Conference ’01 (PSC’01), Czech Technical University|тип=|год=2001|месяц=|число=|том=|номер=|страницы=37-48|issn=}}</ref>.
'''Суффиксный автомат''' ([[Английский язык|англ.]] ''suffix automaton'', ''directed acyclic word graph'', ''DAWG'') — детерминированный [[конечный автомат]], принимающий все суффиксы данной строки <math>S</math> и только их, и обладающий наименьшим возможным числом состояний среди всех таких автоматов. Автомат был впервые описан Блумером и др. в 1983 г.<ref>{{Статья|автор=A. Blumer, J. Blumer, A. Ehrenfeucht, D. Haussler, R. McConnell|год=1984|isbn=9783540133452, 9783540388869|страницы=109–118|заглавие=Building the minimal DFA for the set of all subwords of a word on-line in linear time|ссылка=http://dx.doi.org/10.1007/3-540-13345-3_9|место=Berlin, Heidelberg|издательство=Springer Berlin Heidelberg|издание=Automata, Languages and Programming}}</ref>, в той же работе впервые было показано, что размер суффиксного автомата линеен по длине строки, а также был предложен {{Не переведено 5|Онлайн-алгоритм|онлайн-алгоритм||Online algorithm}} для построения автомата с линейным [[Вычислительная сложность|временем работы]].
В 1985 г. Чен и Сейферас показали, что алгоритм Вайнера<ref>{{Статья|автор=P. Weiner|год=1973-10|doi=10.1109/SWAT.1973.13|страницы=1–11|заглавие=Linear pattern matching algorithms|ссылка=https://ieeexplore.ieee.org/abstract/document/4569722|издание=14th Annual Symposium on Switching and Automata Theory (swat 1973)}}</ref>, предложенный в 1973 г. для построения [[Суффиксное дерево|суффиксного дерева]] строки <math>S</math>, также строит суффиксный автомат для развёрнутой строки <math>S</math> в качестве вспомогательной структуры<ref>{{Статья|автор=M. T. Chen, Joel Seiferas|ответственный=Alberto Apostolico, Zvi Galil|год=1985|doi=10.1007/978-3-642-82456-2_7|isbn=9783642824562|язык=en|страницы=97–107|заглавие=Efficient and Elegant Subword-Tree Construction|ссылка=https://link.springer.com/chapter/10.1007/978-3-642-82456-2_7|издательство=Springer Berlin Heidelberg|издание=Combinatorial Algorithms on Words}}</ref>. В 1987 г. Блумер и др. по аналогии с суффиксным деревом описали сжатый суффикный автомат (англ. ''compact directed acyclic word graph'', ''CDAWG'')<ref>{{Статья|автор=A. Blumer, J. Blumer, D. Haussler, R. McConnell, A. Ehrenfeucht|год=1987-07-01|doi=10.1145/28869.28873|issn=0004-5411|выпуск=3|страницы=578–595|издание=Journal of the ACM|заглавие=Complete inverted files for efficient text retrieval and analysis|ссылка=http://dx.doi.org/10.1145/28869.28873|том=34}}</ref>, получаемый из суффиксного автомата удалением состояний с [[Полустепень исхода|полустепенью исхода]], равной единице, а в 1997 г. Крошемор и Верин разработали линейный алгоритм для его непосредственного построения<ref>{{Статья|автор=Maxime Crochemore, Renaud Vérin|ответственный=Jan Mycielski, Grzegorz Rozenberg, Arto Salomaa|год=1997|doi=10.1007/3-540-63246-8_12|isbn=9783540692423|язык=en|страницы=192–211|заглавие=On compact directed acyclic word graphs|ссылка=https://doi.org/10.1007/3-540-63246-8_12|место=Berlin, Heidelberg|издательство=Springer Berlin Heidelberg|издание=Structures in Logic and Computer Science: A Selection of Essays in Honor of A. Ehrenfeucht}}</ref>. В 2001 г. Иненага и др. разработали линейный онлайн-алгоритм для построения сжатого суффиксного автомата<ref>{{Статья|автор=Shunsuke Inenaga, Hiromasa Hoshino, Ayumi Shinohara, Masayuki Takeda, Setsuo Arikawa|год=2005-03-01|doi=10.1016/j.dam.2004.04.012|issn=0166-218X|выпуск=2|страницы=156–179|издание=Discrete Applied Mathematics|заглавие=On-line construction of compact directed acyclic word graphs|ссылка=http://www.sciencedirect.com/science/article/pii/S0166218X04003464|том=146}}</ref>, а также линейный алгоритм для построения сжатого суффиксного автомата для набора строк, заданного [[Префиксное дерево|бором]]<ref>{{Статья|автор=S. Inenaga, H. Hoshino, A. Shinohara, M. Takeda, S. Arikawa|заглавие=Construction of the CDAWG for a trie|ссылка=https://www.researchgate.net/profile/Thierry_Lecroq/publication/2485748_Approximate_String_Matching_in_Musical_Sequences/links/09e415108d23eeaa5a000000/Approximate-String-Matching-in-Musical-Sequences.pdf#page=44|язык=|издание=Proceedings of the Prague Stringology Conference ’01 (PSC’01), Czech Technical University|тип=|год=2001|месяц=|число=|том=|номер=|страницы=37-48|issn=}}</ref>.

== Структура автомата ==
Как и любой конечный автомат, суффиксный автомат, заданный формальной пятёркой <math>\mathcal A = (\Sigma, Q, q_0, F, \delta)</math> может быть представлен в виде ориентированного графа такого что:
* Множество вершин графа соответствует множеству состояний автомата <math>Q</math>,
* В графе выеделена некоторая вершина, соответствующая начальному состоянию <math>q_0 \in Q</math>,
* В графе выделен набор вершин, соответствующих множеству финальных состояний <math>F \subset Q</math>,
* Множество дуг в графе соответствует множеству переходов <math>\delta \subset Q \times \Sigma \times Q</math>,
* При этом переходу <math>(q_1, \sigma, q_2) \in \delta</math> соответствует дуга из <math>q_1</math> в <math>q_2</math>, помеченная символом <math>\sigma \in \Sigma</math>.

При этом вершины и дуги графа отождествляются с состояниями и переходами автомата соответственно. В таком естественном представлении автомат принимает строку <math>S=s_1 s_2 \dots s_n</math> в том и только том случае если существует путь из начального состояния <math>q_0</math> в некоторое финальное состояние <math>q \in F</math> такой что если последовательно выписать символы, которые встретились на этом пути, то получится последовательность <math>s_1, s_2, \dots, s_n</math><ref>{{Книга|автор=Серебряков В.А., Галочкин М.П., Гончар Д.Р., Фуругян М.Г.|заглавие=Теория и реализация языков программирования|ответственный=|издание=|место=Москва|издательство=МЗ Пресс|год=2006|страницы=|страниц=352|isbn=5-94073-094-9|isbn2=|ссылка=http://www.ccas.ru/depart/MMSP/furugyan/doc/_TRYAPBOOK_pdf.pdf}}</ref>.

=== Контексты строк и состояний ===
''[[Правый контекст|Правым контекстом]]'' слова <math>\omega</math> относительно языка <math>L</math> называют множество <math>[\omega]_R=\{\alpha | \omega\alpha \in L\}</math>. То есть, это множество строк <math>\alpha</math>, при приписывании которых к слову <math>\omega</math> справа получается слово из языка <math>L</math>. Аналогичным образом определяется ''[[левый контекст]]'' <math>[\omega]_L=\{\beta | \beta \omega \in L\}</math>. Также для каждого состояния автомата <math>q \in Q</math> можно определить его правый контекст как множество слов <math>\alpha</math>, которые переводят <math>q</math> в некоторое финальное состояние. Другими словами, это такие строки <math>\alpha</math>, что существует путь из <math>q</math> в некоторое финальное состояние такой что символы, встретившиеся на этом пути образуют строку <math>\alpha</math>.

Если автомат <math>\mathcal A</math> [[Конечный автомат#Детерминированность|детерминированный]], то каждому слову <math>\omega \in \Sigma^*</math> соответствует единственное состояние автомата <math>q(\omega)</math> такое что из <math>q_0</math> в <math>q(\omega)</math> есть путь, символы на котором образуют слово <math>\omega</math>. При этом правые контексты <math>\omega</math> и <math>q(\omega)</math> по определению совпадают, откуда следует, что если <math>q(\alpha)=q(\beta)</math>, то <math>[\alpha]_R = [\beta]_R</math>. То есть, правые контексты слов, принимаемых одним и тем же состоянием совпадают.

В случае суффиксных автоматов из этого также следует, что строки, принимаемые одним и тем же состоянием, являются суффиксами друг друга.

=== Суффиксные ссылки ===
Пусть строка <math>\omega</math> является самой длинной из строк, принимаемых состоянием суффиксного автомата <math>q</math>. Тогда ''суффиксная ссылка'' <math>link(q)</math> от состояния <math>q</math> указывает на состояние <math>q'</math>, которое принимает самый длинный суффикс <math>\omega</math>, который не принимается состоянием <math>q</math>. Суффиксные ссылки образуют дерево с корнем в начальном состоянии и несут важную роль при построении суффиксного автомата. Более того, дерево суффиксных ссылок суффиксного автомата для строки <math>S</math> изоморфно суффиксному дереву для развёрнутой строки <math>S^T</math>, что наглядно демонстрирует следующая иллюстрация:<gallery widths="378" heights="320" caption="Суффиксные структуры" class="center">
Файл:Suffix automaton for abbcbc.svg|Суффиксный автомат для строки abbcbc
Файл:Suffix tree for cbcbba.svg|Суффиксное дерево для строки cbcbba<br>(дерево суффиксных ссылок для автомата слева)
</gallery>


== Применения ==
== Применения ==

Версия от 01:40, 25 июля 2019

Суффиксный автомат (англ. suffix automaton, directed acyclic word graph, DAWG) — детерминированный конечный автомат, принимающий все суффиксы данной строки и только их, и обладающий наименьшим возможным числом состояний среди всех таких автоматов. Автомат был впервые описан Блумером и др. в 1983 г.[1], в той же работе впервые было показано, что размер суффиксного автомата линеен по длине строки, а также был предложен онлайн-алгоритм[англ.] для построения автомата с линейным временем работы.

В 1985 г. Чен и Сейферас показали, что алгоритм Вайнера[2], предложенный в 1973 г. для построения суффиксного дерева строки , также строит суффиксный автомат для развёрнутой строки в качестве вспомогательной структуры[3]. В 1987 г. Блумер и др. по аналогии с суффиксным деревом описали сжатый суффикный автомат (англ. compact directed acyclic word graph, CDAWG)[4], получаемый из суффиксного автомата удалением состояний с полустепенью исхода, равной единице, а в 1997 г. Крошемор и Верин разработали линейный алгоритм для его непосредственного построения[5]. В 2001 г. Иненага и др. разработали линейный онлайн-алгоритм для построения сжатого суффиксного автомата[6], а также линейный алгоритм для построения сжатого суффиксного автомата для набора строк, заданного бором[7].

Структура автомата

Как и любой конечный автомат, суффиксный автомат, заданный формальной пятёркой может быть представлен в виде ориентированного графа такого что:

  • Множество вершин графа соответствует множеству состояний автомата ,
  • В графе выеделена некоторая вершина, соответствующая начальному состоянию ,
  • В графе выделен набор вершин, соответствующих множеству финальных состояний ,
  • Множество дуг в графе соответствует множеству переходов ,
  • При этом переходу соответствует дуга из в , помеченная символом .

При этом вершины и дуги графа отождествляются с состояниями и переходами автомата соответственно. В таком естественном представлении автомат принимает строку в том и только том случае если существует путь из начального состояния в некоторое финальное состояние такой что если последовательно выписать символы, которые встретились на этом пути, то получится последовательность [8].

Контексты строк и состояний

Правым контекстом слова относительно языка называют множество . То есть, это множество строк , при приписывании которых к слову справа получается слово из языка . Аналогичным образом определяется левый контекст . Также для каждого состояния автомата можно определить его правый контекст как множество слов , которые переводят в некоторое финальное состояние. Другими словами, это такие строки , что существует путь из в некоторое финальное состояние такой что символы, встретившиеся на этом пути образуют строку .

Если автомат детерминированный, то каждому слову соответствует единственное состояние автомата такое что из в есть путь, символы на котором образуют слово . При этом правые контексты и по определению совпадают, откуда следует, что если , то . То есть, правые контексты слов, принимаемых одним и тем же состоянием совпадают.

В случае суффиксных автоматов из этого также следует, что строки, принимаемые одним и тем же состоянием, являются суффиксами друг друга.

Суффиксные ссылки

Пусть строка является самой длинной из строк, принимаемых состоянием суффиксного автомата . Тогда суффиксная ссылка от состояния указывает на состояние , которое принимает самый длинный суффикс , который не принимается состоянием . Суффиксные ссылки образуют дерево с корнем в начальном состоянии и несут важную роль при построении суффиксного автомата. Более того, дерево суффиксных ссылок суффиксного автомата для строки изоморфно суффиксному дереву для развёрнутой строки , что наглядно демонстрирует следующая иллюстрация:

Применения

Суффиксный автомат строки строится за и может использоваться для решения таких задач как:

  • Подсчёт количества различных подстрок за в режиме онлайн,
  • Поиск самой длинной подстроки , которая входит в неё хотя бы два раза за ,
  • Поиск наибольшей общей подстроки строк и за ,
  • Подсчёт числа вхождений строки в в качестве подстроки за ,
  • Поиск всех вхождений в за , где — количество вхождений.

Здесь стоит считать, что некоторая строка подаётся на вход когда автомат уже построен и готов к использованию.

Примечания

  1. A. Blumer, J. Blumer, A. Ehrenfeucht, D. Haussler, R. McConnell. Building the minimal DFA for the set of all subwords of a word on-line in linear time // Automata, Languages and Programming. — Berlin, Heidelberg: Springer Berlin Heidelberg, 1984. — С. 109–118. — ISBN 9783540133452, 9783540388869.
  2. P. Weiner. Linear pattern matching algorithms // 14th Annual Symposium on Switching and Automata Theory (swat 1973). — 1973-10. — С. 1–11. — doi:10.1109/SWAT.1973.13.
  3. M. T. Chen, Joel Seiferas. Efficient and Elegant Subword-Tree Construction (англ.) // Combinatorial Algorithms on Words / Alberto Apostolico, Zvi Galil. — Springer Berlin Heidelberg, 1985. — P. 97–107. — ISBN 9783642824562. — doi:10.1007/978-3-642-82456-2_7.
  4. A. Blumer, J. Blumer, D. Haussler, R. McConnell, A. Ehrenfeucht. Complete inverted files for efficient text retrieval and analysis // Journal of the ACM. — 1987-07-01. — Т. 34, вып. 3. — С. 578–595. — ISSN 0004-5411. — doi:10.1145/28869.28873.
  5. Maxime Crochemore, Renaud Vérin. On compact directed acyclic word graphs (англ.) // Structures in Logic and Computer Science: A Selection of Essays in Honor of A. Ehrenfeucht / Jan Mycielski, Grzegorz Rozenberg, Arto Salomaa. — Berlin, Heidelberg: Springer Berlin Heidelberg, 1997. — P. 192–211. — ISBN 9783540692423. — doi:10.1007/3-540-63246-8_12.
  6. Shunsuke Inenaga, Hiromasa Hoshino, Ayumi Shinohara, Masayuki Takeda, Setsuo Arikawa. On-line construction of compact directed acyclic word graphs // Discrete Applied Mathematics. — 2005-03-01. — Т. 146, вып. 2. — С. 156–179. — ISSN 0166-218X. — doi:10.1016/j.dam.2004.04.012.
  7. S. Inenaga, H. Hoshino, A. Shinohara, M. Takeda, S. Arikawa. Construction of the CDAWG for a trie // Proceedings of the Prague Stringology Conference ’01 (PSC’01), Czech Technical University. — 2001. — С. 37-48.
  8. Серебряков В.А., Галочкин М.П., Гончар Д.Р., Фуругян М.Г. Теория и реализация языков программирования. — Москва: МЗ Пресс, 2006. — 352 с. — ISBN 5-94073-094-9.