Суффиксное дерево - Алгоритм фарача

11:36 11.03.2011 Proteus lawnmower-man@mail.ru

Алгортим общее описание

Основная идея алгоритма, заключается в том что мы уменьшаем размер исходной строки. Для этого мы разбиваем символы исходной строки на пару и пронумеровываем их, а из полученных номеров составляем новую строку. Опишу весь алгоритм по шагам. Для примера возмём строку: 121112212221

Подробности

Замечания

Как видите все временные оценки алгоритма упираются в геометрическую прогрессию, т.е. в то что на каждом вызове строка уменьшается ровно в 2 раза, а сумма якобы сходиться к линейной по времени. Т.е. пункты 2-5 алгоритма работают линейно по времени, а пункт 1 рекурсивно (каждый раз затрачивая вдвое меньше времени) - иначе оценка к линейной не сходится. В принципе алгоритм довольно мутный и работает никак не быстрее Укконена, и жрёт много памяти. Хотя на самом деле не так уж много и достаточно быстро, если всё нормально сделать. Но писать его никакого смысла нету, да никто и на самом деле этого и не писал, даже сам автор (он чисто теоретический). Основное преимущество алгоритма в том что он не зависит от размера алфавита. Алгоритм и был создан потому, что автор думал о построении дерева на больших и наоборот бинарных алфавитах. Потому что этот алфавит всё равно становится безразмерным где-нибудь на 3-ем слое рекурсии. Т.е. им можно строить суффиксные деревья для массивов из 32-х разрядных чисел и т.п.

На разных шагах приходится применять суфф. деревья или суфф. массивы. Преобразование дерева в массив и обратно делается за линейное время.

Заключение

up. пришлось теорию немного додумать - получилась рабочая программа. Достаточно быстрая, достаточно экономная:

[тут реализация] - я выложил рассказ о практической реализации, и немного о суф. деревьях