Алгоритм Фараха — различия между версиями
Slavian (обсуждение | вклад) (→описание алгоритма) |
Slavian (обсуждение | вклад) (→шаг 1: построение четного дерева) |
||
| Строка 51: | Строка 51: | ||
которого ограничены нечетными позициями <tex>2,4,6,{...} </tex> строки <tex>s\$</tex>.}} | которого ограничены нечетными позициями <tex>2,4,6,{...} </tex> строки <tex>s\$</tex>.}} | ||
| + | Из дерева сжатой строки получаем частичное (чётное) дерево исходной строки. Частичное потому в нём будут только половина суффиксов, т.е. тех которые стоят в чётных позициях. : | ||
| + | [[Файл:Tree101232even-pre.png|300px|thumb|left|Очевидно, что для этого достаточно умножить все расстояния в дереве на 2]] | ||
| + | |||
| + | |||
| + | [[Файл:Tree101232even.png|300px|thumb|center|Корректируются все развилки дерева (так как они могут совпадать в первых символах)]] | ||
| + | |||
| + | {|class="wikitable" | ||
| + | |+ | ||
| + | !width="20%"|ID !!width="20%"|LCP !!width="20%"|STR | ||
| + | |- align = "center" | ||
| + | |2 | ||
| + | |0 | ||
| + | |1112212221 | ||
| + | |- align = "center" | ||
| + | |0 | ||
| + | |1 | ||
| + | |121112212221 | ||
| + | |- align = "center" | ||
| + | |4 | ||
| + | |2 | ||
| + | |12212221 | ||
| + | |- align = "center" | ||
| + | |6 | ||
| + | |0 | ||
| + | |212221 | ||
| + | |- align = "center" | ||
| + | |10 | ||
| + | |2 | ||
| + | |21 | ||
| + | |- align = "center" | ||
| + | |8 | ||
| + | |1 | ||
| + | |2221 | ||
| + | |} | ||
== шаг 2: построение нечетного по четному == | == шаг 2: построение нечетного по четному == | ||
Версия 14:39, 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: построение четного дерева
| Определение: |
| Четное дерево является деревом суффиксов для строки , узлы-листья которого ограничены нечетными позициями строки . |
Из дерева сжатой строки получаем частичное (чётное) дерево исходной строки. Частичное потому в нём будут только половина суффиксов, т.е. тех которые стоят в чётных позициях. :
| ID | LCP | STR |
|---|---|---|
| 2 | 0 | 1112212221 |
| 0 | 1 | 121112212221 |
| 4 | 2 | 12212221 |
| 6 | 0 | 212221 |
| 10 | 2 | 21 |
| 8 | 1 | 2221 |
шаг 2: построение нечетного по четному
| Определение: |
| Нечетное дерево является деревом суффиксов для строки , узлы-листья которого ограничены нечетными позициями строки . |


