В настоящее время я работаю над своей собственной реализацией суффикс-дерева (используя С++, но вопрос остается агностиком языка). Я изучил оригинальную бумагу из Укконена. Статья очень ясна, поэтому я начал работать над своей реализацией и попытался решить проблему для генерализованных деревьев суффикса.
В дереве каждая подстрока, ведущая из node в другую, представляется с использованием пары целых чисел. Хотя это простое для обычного дерева суффикса, возникает проблема, когда несколько строк сосуществуют в одном и том же дереве (которое становится обобщенным деревом суффикса). Действительно, теперь такой пары недостаточно, нам нужна другая переменная, чтобы указать, какую ссылочную строку мы используем.
Быстрый пример. Рассмотрим строку coconut
:
- Подстрока
nut
будет(4,6)
. - Мы добавим
troublemaker
в дерево,(4,6)
теперь может быть:-
nut
, если мы ссылаемся на первую строку. -
ble
, если мы ссылаемся на вторую строку.
-
Чтобы справиться с этим, я подумал о добавлении идентификатора, представляющего строку:
// A pair of int is a substring (regular tree)
typedef std::pair<int,int> substring;
// We need to bind a substring to its reference string:
typedef std::pair<int, substring> mapped_substring;
В настоящее время проблема заключается в следующем:
Я получаю запрос на добавление строки в дерево. Во время алгоритма мне, возможно, придется проверять существующие переходы, связанные с другими зарегистрированными строками, представленными как триплет (идентификатор ссылочной строки, k, p). Некоторые операции обновления основаны на индексах подстрок, , как я могу выполнять их в таких условиях?
Примечание: вопрос является агностиком языка, поэтому я не добавил С++ -tag, хотя показан небольшой фрагмент.