Суффиксный автомат (15 сентября 2016)
- Определение, связь с суффиксным деревом, единственность, конечные вершины
- Бор, несжатое суфдерево, суфдерево − какой-то автомат.
- Суфавтомат = минимальный по числу вершин автомат.
- Как из дерева получить автомат? Начинаем сжимать одинаковые вершины. Примеры: ababc, ababb
- Заметим, что формально вершины одинаковы = равны их правые контексты. Rs(v) = {x | дополнить vx − суффикс s}
- Определим VA = {u | Rs(u) = A} − все строки с правым контекстом A. Заметим, что каждому классу VA должна соответствовать какая-то вершина автомата.
- Рёбра между классами проводятся однозначно: x ∈ A, xc ∈ B ⇒ между A и B есть ребро по символу "c"
- Устройство классов VA. Lm 1: Rs(v) = Rs(u) ⇒ v и u суффиксы друг друга, Lm 2: v ≤ w ≤ u ⇒ и w тоже.
- Какие вершины являются конечными? Определим last, len[V], min[V], suf[V]. Получили ответ: last, suf[last], suf[suf[last]], ...
- Онлайн алгроитм построения за O(n)
- Что будем поддерживать? start, last, suf[], len[], next[][] (рёбра)
- База: s = ε start = last = 1
- Переход s → sa ⇒ Rs(v) = {z1, ..., zk} → Rsa(v) = {z1a, ..., zka} +? ε
- В каких случаях добавляется ε? v − суффикс sa.
- Что произойдёт с вершинами? Добавится новая: sa ∈ V{ε}. Строки из разных классов не могли оказаться в одном. Строки из одного могли оказаться в разных!
- Что произойдёт с рёбрами? Если два класса VA, VB не поменялись, наличие ребра между ними осталось. Поменяются только рёбра смежные с изменившимися вершинами.
- Rs(x) = Rs(y), Rsa(x) ≠ Rsa(y), x ≤ y ⇒ x − суффикс sa, y − не суффикс sa
- Рассмотрим z − самый длинный суффикс sa: v[z] = VRs(z) разделится. Тогда suf[v[z]], suf[suf[v[z]]] и т.д. содержат только суффиксы sa, а суффиксы sa содержатся только в них.
- Т.е. доказали, что если что-то разделится, то только v[z]. Как её найти? Суффикс sa = суффикс s + символ a. Будем перебирать суффиксы s.
- last, suf[last], suf[suf[last]]... если нет ребра по символу "a", пропускаем. Первое ребро по символу "a" ведёт из p в q=v[z].
- Правда ли, что все строки в q являются суффиксами sa? Самый длинный суффикс sa в q имеет длину len[p]+1, самая длинная строка в q имеет длину len[q]. Сравним.
- Раздваивание вершины: newQ = суффиксы sa, q = не суффиксы sa. Рёбра по "a" из части цепочки выше p направим в newLast, рёбра по "a", шедшие в q, направим в newQ.
- Написание алгоритма
- Оценка размера автомата
- Не более 2n вершин
- Не более (2n-1) + (n-1) = 3n-2 рёбер
- Оценка времени работы
- Потенциал длина суффиксной цепочки last, suf[last], suf[suf[last]], ...
- Изменение: часть длины ti заменили на часть длины 1, общий префикс уменьшился по принципу Дирихле
- Применение: проверка, лежит ли строка в тексте.