Я чувствую себя немного толстым в этот момент. Я потратил дни, пытаясь полностью обернуть голову вокруг конструкции дерева суффиксов, но поскольку у меня нет математического фона, многие из объяснений ускользают от меня, когда они начинают чрезмерно использовать математическую символику. Самое близкое к хорошему объяснению, которое я нашел, Быстрый поиск строк с деревьями суффикса, но он замалчивает различные точки и некоторые аспекты алгоритма остаются неясными.
Пошаговое объяснение этого алгоритма здесь на Qaru было бы неоценимым для многих других, кроме меня, я уверен.
Для справки, здесь статья Укконена по алгоритму: http://www.cs.helsinki.fi/u/ukkonen/SuffixT1withFigs.pdf
Мое основное понимание, до сих пор:
- Мне нужно перебирать каждый префикс P заданной строки T
- Мне нужно перебирать каждый суффикс S в префиксе P и добавлять его к дереву
- Чтобы добавить суффикс S к дереву, мне нужно выполнить итерацию по каждому символу в S, причем итерации состоят либо в том, что они идут по существующей ветке, которая начинается с того же набора символов C в S и может разделить ребро на потомство узлы, когда я получаю различный символ в суффиксе, ИЛИ, если не было подходящего края, чтобы спуститься. Если для C не найдено совпадающего края, для C создается новый край листа.
Основным алгоритмом является O (n 2), как указано в большинстве объяснений, так как нам нужно пройти все префиксы, тогда нам нужно пройти через каждый из суффиксы для каждого префикса. Алгоритм Укконена, по-видимому, уникален из-за метода указателя суффиксов, который он использует, хотя я думаю, что это то, что у меня возникли проблемы с пониманием.
У меня также возникли проблемы с пониманием:
- точно, когда и как "активная точка" назначается, используется и изменяется
- то, что происходит с аспектом канонизации алгоритма
- Почему реализации, которые я видел, должны "фиксировать" ограничивающие переменные, которые они используют
Вот завершенный С# исходный код. Он работает не только корректно, но и поддерживает автоматическую канонизацию и отображает более удобный текстовый график вывода. Исходный код и выходные данные:
Обновление 2017-11-04
Спустя много лет я нашел новое использование для деревьев суффиксов и реализовал алгоритм в JavaScript. Гист внизу. Он должен быть без ошибок. Выгрузите его в файл js, npm install chalk
из того же места, а затем запустите с помощью node.js, чтобы увидеть какой-нибудь яркий выход. Там урезанная версия в том же Gist, без какого-либо кода отладки.
https://gist.github.com/axefrog/c347bf0f5e0723cbd09b1aaed6ec6fc6