Алгоритм Укконена — различия между версиями
| DrozdovVA (обсуждение | вклад) м | |||
| Строка 81: | Строка 81: | ||
| {{Определение | {{Определение | ||
| |definition= Пусть <tex>x\alpha</tex> обозначает произвольную строку, где <tex>x</tex> {{---}} ее первый символ, а <tex>\alpha</tex> {{---}} оставшаяся подстрока(возможно пустая). Если для внутренней вершины с путевой меткой <tex>x\alpha</tex> существует другая вершина <tex>s(v)</tex>  с путевой меткой <tex>\alpha</tex> то ссылка из <tex>v</tex> в <tex>s(v)</tex> называется суффиксной ссылкой.}} | |definition= Пусть <tex>x\alpha</tex> обозначает произвольную строку, где <tex>x</tex> {{---}} ее первый символ, а <tex>\alpha</tex> {{---}} оставшаяся подстрока(возможно пустая). Если для внутренней вершины с путевой меткой <tex>x\alpha</tex> существует другая вершина <tex>s(v)</tex>  с путевой меткой <tex>\alpha</tex> то ссылка из <tex>v</tex> в <tex>s(v)</tex> называется суффиксной ссылкой.}} | ||
| + | |||
| + | ===Лемма 1. Существование суффиксных ссылок === | ||
| + | {{Лемма | ||
| + | |statement= | ||
| + | Для любой внутренней вершины суффиксного дерева, существует суффиксная ссылка, ведущая в некоторую внутреннюю вершину. | ||
| + | |proof= | ||
| + | Рассмотрим внутренную вершину <tex>v</tex> с путевой меткой <tex>t1_ ... t_k</tex>. Так как эта вершина внутренняя, ее путевая метка ветвится справа в исходной строке. Тогда очевидно подстрока <tex>t2_ ... t_k</tex> тоже ветвится справа в исходной строке, и ей соответствует некоторая внутренняя вершина <tex>u</tex>. По определению суффиксная ссылка вершины <tex>v</tex> ведет в <tex> u</tex> | ||
| + | }} | ||
| == Источник == | == Источник == | ||
Версия 23:04, 5 мая 2011
Алгоритм Укконена — алгоритм построения суффиксного дерева для заданной строки за линейное время.
Содержание
Первая версия алгоритма
Рассмотрим сначала метод, который строит дерево за время , где — длина исходной строки . В дальнейшем данный алгоритм будет оптимизирован таким образом, что будет достигнута линейная скорость работы.
Описание
Алгоритм делится на фаз. В фазе с номером в дерево добавляются все суффиксы подстроки . При добавлении суффикса алгоритм сначала находит конец пути из корня, помеченного подстрокой , затем добавляет к найденной вершине новое ребро с листом , если этот символ не был добавлен ранее.
Псевдокод
Приведенный алгоритм можно записать с помощью псевдокода:
for to do for to do insert()
Поскольку операция insert может занимать линейное время, очевидно, что время работы данного алгоритма составляет .
Возможные исходы операции insert
Ниже приведены три возможных случая, которые могут возникнуть при добавлении подстроки в дерево.
Оптимизация алгоритма Укконена
Рассмотрим две леммы, позволяющие ускорить алгоритм Укконена до .
Лемма 1. Стал листом — листом и останешься
| Лемма: | 
| Если в какой-то момент работы алгоритма Укконена будет создан лист с меткой  (для суффикса, начинающегося в позиции  строки ), он останется листом во всех последовательных деревьях, созданных алгоритмом. 
 | 
| Доказательство: | 
| Это верно потому, что у алгоритма нет механизма продолжения листового ребра дальше текущего листа. Если есть лист с суффиксом , правило продолжения 1 будет применяться для продолжения на всех последующих фазах. | 
Лемма 2. Правило 3 заканчивает дело
| Лемма: | 
| В любой фазе, если правило продолжения 3 применяется в продолжении , оно будет реализовываться во всех дальнейших продолжениях(от  по ) до конца фазы. 
 | 
| Доказательство: | 
| При использовании правила продолжения 3 путь, помеченный в текущем дереве, должен продолжаться символом , и точно так же продолжается путь, помеченный , поэтому правило 3 применяется в продолжениях | 
Когда используется правило 3, никакой работы делать не нужно, так как требуемый суффикс уже в дереве есть. Поэтому можно заканчивать каждую фазу  после первого же использования правила прохождения 3. Если это случится в продолжении j, то уже не требуется явно находить концы строк  с .
Алгоритм Укконена за квадратичное время
Рассмотрим правила продолжения суффиксов.
При использовании правила 1 по лемме 1 в последующих фазах будет выполняться правило 1. Поэтому скажем, что мы создаём лист не только для рассмотренной части строки, а для всей всей строки до конца. 
При использовании правила 2 появится новый лист, который далее будет продлеваться по правилу 1. 
При использовании правила 3 по лемме 2 никакой работы делать не нужно, поскольку суффикс в дереве уже есть. Следовательно, можно остановиться и не добавлять следующие суффиксы.
Таким образом, операция insert позволяет суффиксы не только для подстрок , но и сразу для всего суффикса .
Псевдокод
Приведенный алгоритм можно записать с помощью псевдокода:
for to do insert()
Поскольку операция insert по-прежнему занимает линейное время, очевидно, что время работы данного алгоритма составляет .
Суффиксные ссылки
| Определение: | 
| Пусть обозначает произвольную строку, где — ее первый символ, а — оставшаяся подстрока(возможно пустая). Если для внутренней вершины с путевой меткой существует другая вершина с путевой меткой то ссылка из в называется суффиксной ссылкой. | 
Лемма 1. Существование суффиксных ссылок
| Лемма: | 
| Для любой внутренней вершины суффиксного дерева, существует суффиксная ссылка, ведущая в некоторую внутреннюю вершину. | 
| Доказательство: | 
| Рассмотрим внутренную вершину с путевой меткой . Так как эта вершина внутренняя, ее путевая метка ветвится справа в исходной строке. Тогда очевидно подстрока тоже ветвится справа в исходной строке, и ей соответствует некоторая внутренняя вершина . По определению суффиксная ссылка вершины ведет в | 
Источник
Дэн Гасфилд — Строки, деревья и последовательности в алгоритмах: Информатика и вычислительная биология — СПб.: Невский Диалект; БХВ-Петербург, 2003. — 654 с: ил.



