Алгоритм Фараха — различия между версиями
Slavian (обсуждение | вклад) (→описание алгоритма) |
Slavian (обсуждение | вклад) (→шаг 0: суффиксное дерево для сжатой строки) |
||
Строка 9: | Строка 9: | ||
Мы опишем алгоритм Фарача в виде пяти выполняемых шагов. Используем в качестве примера строку <tex>s = 121112212221</tex>, определенную на алфавите <tex>А = {1, 2} </tex> (в этом примере N = 12). | Мы опишем алгоритм Фарача в виде пяти выполняемых шагов. Используем в качестве примера строку <tex>s = 121112212221</tex>, определенную на алфавите <tex>А = {1, 2} </tex> (в этом примере N = 12). | ||
== шаг 0: суффиксное дерево для сжатой строки== | == шаг 0: суффиксное дерево для сжатой строки== | ||
+ | |||
+ | * Строка <tex>s</tex> разбивается на пары: <tex> 12 11 12 21 22 21 </tex> | ||
+ | * Пары сортирутся поразрядной сортировкой: <tex>11 12 12 21 21 22 </tex>. | ||
+ | * Удаляются копии: <tex>11 12 21 22</tex>. | ||
+ | * Парам даются номера (условно, в массиве они и так есть): <tex>11-(0), 12-(1), 21-(2), 22-(3)</tex> | ||
+ | * Создаётся новая строка из номеров пар: 1 0 1 2 3 2 | ||
+ | * Из полученной строки создаётся суффикcное дерево: | ||
+ | |||
== шаг 1: построение нечетного дерева == | == шаг 1: построение нечетного дерева == | ||
Версия 13:47, 13 мая 2014
Алгоритм Фарача — алгоритм построения суффиксного дерева для заданной строки , который выполняется за время , при этом даже не требуется выполнения условия конечности алфавита. Такая эффективность достигается за счет того, что строковые последовательности определяются на индексированном алфавите или, что эквивалентно, на целочисленном алфавите , при этом накладывается дополнительное условие, что . Такие алфавиты часто встречаются на практике.
описание алгоритма
Основная идея алгоритма, заключается в том что мы уменьшаем размер исходной строки. Для этого мы разбиваем символы сходной строки на пару и пронумеровываем их, а из полученных номеров составляем новую строку, которая уже в 2 раза короче.
Мы опишем алгоритм Фарача в виде пяти выполняемых шагов. Используем в качестве примера строку
, определенную на алфавите (в этом примере N = 12).шаг 0: суффиксное дерево для сжатой строки
* Строкаразбивается на пары: * Пары сортирутся поразрядной сортировкой: . * Удаляются копии: . * Парам даются номера (условно, в массиве они и так есть): * Создаётся новая строка из номеров пар: 1 0 1 2 3 2 * Из полученной строки создаётся суффикcное дерево:
шаг 1: построение нечетного дерева
Определение: |
Нечетное дерево | является деревом суффиксов для строки , узлы-листья которого ограничены нечетными позициями строки .