Я написал программу для реализации базового Trie на C ++, каждый узел имеет 26 дочерних указателей (для алфавитов английского языка), а класс Node выглядит следующим образом:
class Node
{
public:
Node* parent;
Node* child[26];
unsigned int number_of_children;
....
}
Теперь может быть много слов, таких как {snapple, dapple}, {distract, привлечь} и т. Д., В которых совпадают более 3 алфавитов. Я хочу сохранить отдельные записи этих подслов (как в примере выше — яблоко, тракт) и позволить другим указывать на них (например, {sn-ptr_to_apple, d-ptr_to_apple}, {dis-ptr_to_tract, at-ptr_to_tract} ). Я считаю, что лучше всего обрабатывать это, вставляя само слово, вместо того, чтобы иметь функцию, которая выполняет это после завершения вставки.
Мне нужна помощь в разработке этого, в настоящее время я не смотрю на эффективность выполнения, скорее код / дизайн должен быть компактным. В настоящее время я посещаю узел и проверяю всех ненулевых братьев и сестер (путем обхода дочерних братьев и сестер) на соответствие входному слову, а затем сохраняю указатели на случай совпадения, скажем, 4 слов (но код получает дольше и запутывает).
Традиционные попытки сжимают общие префиксы. Вы, по сути, хотите сжать общие суффиксы. Самый простой способ — просто построить свои записи в обратном направлении.
Теперь это означает, что вы должны прочитать строку назад в три.
Других решений пока нет …