Бор, сжатый бор, алгоритм Укконена (17 апреля 2014)
- Реализации
- Бор. Несжатый. На массивах. [code]
- Бор. Сжатый. Построение суфф.дерева за O(n2) и O(n) памяти [code]
- Алгоритм Укконена построения суфф.дерева за O(n)
- Онлайн алгоритм: нужно все суффиксы удлинить на 1
- Жизненный цикл суффикса: движется по дереву, порождает новое разветвление и лист, удлиняет лист
- Разветвляется в первую очередь самый длинный не разветвившийся суффикс (Lm: если i не разветвился, то ∀j > i: j тоже не разветвился
- Осталось быстро переходить к следующему суффиксу (отрезать один символ). Для этого будем поддерживать от всех вершин суфф.ссылку. Суфф.ссылка от вершины − обязательно вершина.
- suf[v] = Down(suf[parent[v]]). Линейнойсть времени работы: смотрим на величину "количество вершин на пути до корня". suf[] и parent[] уменьшают на 1, Down на каждом шагу увеличивает
- Реализация Укконена
- Текущая позиция: (v,char,position). Можно пытаться вместо (v,char) хранить edge, но тогда неудобно задавать корень.
- Суфф.ссылки будем считать лениво. Причем запоминать суфф.ссылку будем только если она ведет в вершину.
- Когда строим суфф.дерево для фиксированной строки (нам не нужна online-овость), можно создавать лист, как ребро edge(si, i, n-i), где n − длина строки
- Реализация за O(n2): [code]
- Реализация за O(n): [code]
- Преобразование структур
- Массив → Дерево. O(n).
- Дерево → Массив. O(n).
- Автомат → Дерево. O(n).
- Автомат обратной строки → Дерево. O(n).