Изменения

Перейти к: навигация, поиск

Сжатое суффиксное дерево

684 байта добавлено, 17:21, 1 мая 2014
Построение из суффиксного массива
# Строка <tex>s</tex> заканчивается специальным символом, который больше не встречается в строке.
# (Следствие) <tex>lcp[i] < len[i - 1]</tex>, где <tex>len[i - 1]</tex> {{---}} длина суффикса, соответствующего <tex>suf[i - 1]</tex>.
 
Будем строить дерево, добавляя суффиксы в лексикографическом порядке. Чтобы ускорить добавление, будем использовать то, что <tex>i</tex>-ый суффикс имеет с предыдущим <tex>lcp[i]</tex> общих символов. Тогда добавление из корня не отличается от того, что мы поднимемся вверх из предыдущего суффикса до глубины <tex>lcp[i]</tex> и продолжим построение оттуда. Инвариант позволяет нам утверждать, что ни один лист мы не сможем продолжить, и нам всегда нужно будет хоть раз подняться из него вверх. Поскольку суффиксы отсортированы лексикографически, мы не будем спускаться по ребру после того, как уже поднялись из него из-за несовпадения символа. Все это позволяет сформулировать алгоритм добавления суффикса по известной вершине предыдущего суффикса:
# Подняться из вершины вверх до глубины <tex>lcp</tex>
# Если эта глубина находится на ребре, разрезать ребро по ней.
# Вставить новую вершину как сына вершины с глубиной <tex>lcp</tex>
В вершинах дерева <tex>Node</tex> мы будем хранить предка <tex>parent</tex>, [[Стек| стек]] детей в лексикографическом порядке ребер <tex>children</tex>, глубину вершины в символах от корня <tex>depth</tex>.
Соответственно, конструктор вершины имеет вид <code>Node(Node parent, '''int''' depth)</code>.
 
Будем добавлять суффиксы в лексикографическом порядке и запоминать последнюю добавленную вершину <tex>previous</tex>.
Тогда <tex>i</tex>-ый добавленный суффикс будет иметь с предыдущим <tex>lcp[i]</tex> общих символов, что позволит ускорить добавление.
 
Алгоритм добавления суффикса:
# Если мы находимся в корне, либо <tex>depth = lcp</tex>, новый суффикс нужно добавить к детям.
# Если <tex>parent.depth < lcp</tex>, новый суффикс будет идти из середины ребра к предку. Вставим между нами и предком вершину с глубиной <tex>lcp</tex>.
# Вызовем добавление суффикса у нашего предка.
<code>
120
правок

Навигация