Алгоритм Фараха — различия между версиями
Slavian (обсуждение | вклад) (→шаг 0: суффиксное дерево для сжатой строки) |
Slavian (обсуждение | вклад) (→описание алгоритма) |
||
Строка 46: | Строка 46: | ||
|} | |} | ||
− | == шаг 1: построение | + | == шаг 1: построение четного дерева == |
+ | {{Определение | ||
+ | |definition= Четное дерево <tex>T^{even}_s</tex> является деревом суффиксов для строки <tex>s</tex>, узлы-листья | ||
+ | которого ограничены нечетными позициями <tex>2,4,6,{...} </tex> строки <tex>s\$</tex>.}} | ||
+ | |||
+ | == шаг 2: построение нечетного по четному == | ||
{{Определение | {{Определение | ||
|definition= Нечетное дерево <tex>T^{odd}_s</tex> является деревом суффиксов для строки <tex>s</tex>, узлы-листья | |definition= Нечетное дерево <tex>T^{odd}_s</tex> является деревом суффиксов для строки <tex>s</tex>, узлы-листья | ||
которого ограничены нечетными позициями <tex>1,3,5,{...} </tex> строки <tex>s\$</tex>.}} | которого ограничены нечетными позициями <tex>1,3,5,{...} </tex> строки <tex>s\$</tex>.}} | ||
− | |||
== шаг 3: слияние четного и нечетного дерева == | == шаг 3: слияние четного и нечетного дерева == | ||
== шаг 4: построение LCP-дерева == | == шаг 4: построение LCP-дерева == |
Версия 14:14, 13 мая 2014
Алгоритм Фарача — алгоритм построения суффиксного дерева для заданной строки , который выполняется за время , при этом даже не требуется выполнения условия конечности алфавита. Такая эффективность достигается за счет того, что строковые последовательности определяются на индексированном алфавите или, что эквивалентно, на целочисленном алфавите , при этом накладывается дополнительное условие, что . Такие алфавиты часто встречаются на практике.
описание алгоритма
Основная идея алгоритма, заключается в том что мы уменьшаем размер исходной строки. Для этого мы разбиваем символы сходной строки на пару и пронумеровываем их, а из полученных номеров составляем новую строку, которая уже в 2 раза короче.
Мы опишем алгоритм Фарача в виде пяти выполняемых шагов. Используем в качестве примера строку
, определенную на алфавите (в этом примере N = 12).шаг 0: суффиксное дерево для сжатой строки
* Строкаразбивается на пары: * Пары сортирутся поразрядной сортировкой: . * Удаляются копии: . * Парам даются номера (условно, в массиве они и так есть): * Создаётся новая строка из номеров пар: 1 0 1 2 3 2 * Из полученной строки создаётся суффикcное дерево:
ID | LCP | STR |
---|---|---|
1 | 0 | 0 1 2 3 2 |
0 | 0 | 1 0 1 2 3 2 |
2 | 1 | 1 2 3 2 |
3 | 0 | 2 3 2 |
5 | 1 | 2 |
4 | 0 | 3 2 |
шаг 1: построение четного дерева
Определение: |
Четное дерево | является деревом суффиксов для строки , узлы-листья которого ограничены нечетными позициями строки .
шаг 2: построение нечетного по четному
Определение: |
Нечетное дерево | является деревом суффиксов для строки , узлы-листья которого ограничены нечетными позициями строки .