Я использовал видео чтобы понять префиксный три (хотя в конце концов я пытаюсь добраться до трифона с суффиксом), однако ссылка на пример кода не работает, поэтому я пришел к этому из видео, есть две функции: вставка и поиск, как показано ниже
void insert(string word)
{
node* current=head;
current->prefix_count++;
for(unsigned int i=0;i<word.length();++i)
{
int letter=(int)word[i]-(int)'a';
if (current->child[letter]==NULL)
current->child[letter]=new node();
current->child[letter]->prefix_count++;
current=current->child[letter];
}
current->is_end=true;
}
bool search(string word)
{
node *current=head;
for(int i=0;i<word.length();++i)
{
if(current->child[((int)word[i]-(int)'a')]==NULL)
return false;
current=current->child[((int)word[i]-(int)'a')];
}
return current->is_end;
}
Затем реализовано основное следующим образом:
int main(){
node* head=NULL;
string s="abbaa";
init();
insert(s);
if(search("ab")==true) cout<<"Found"<<endl;
else cout<<"Not found"<<endl;
}
И я получаю следующий вывод: не найден
Это сбивает с толку, так как ab находится в строке s.
И, наконец, я пытаюсь понять эту строку:
int letter=(int)word[i]-(int)'a';
Означает ли это, что мы получаем код ASCII для «а», а затем вычитаем из кода ASCII текущего символа?
Спасибо
Есть некоторая разница между суффиксами и деревьями префиксов.
Префиксное дерево — это дерево, которое содержит все слова (или некоторые другие куски, разделенные некоторым символом) из данного текста. Например. для текста «у вас есть текст» дерево префиксов содержит 4 слова: [«вы», «иметь», «а», «текст»] (но не «hav»).
Суффикс дерево — это префиксное дерево, который содержит все суффиксы из данного слова. Например. для строки «abacaba» дерево суффиксов содержит 7 слов: [«abacaba», «bacaba», «acaba», «caba», «aba», «ab», «a»]].
Наивная реализация дерева суффиксов основана на реализации дерева префиксов, которая заполняется всеми подстроками некоторой входной строки в O (N ^ 2) (поэтому в вашем коде вы должны вставить все суффиксы строки S в Trie), но вы можете найти умнее Алгоритм Укконена который работает в линейном времени.
Обычно дерево префиксов используется, когда вы хотите найти слово (например, из некоторого словаря и т. Д.) В тексте; дерево суффиксов, используемое для поиска некоторого шаблона в качестве подстроки текста.
Таким образом, вы должны выбрать, какое дерево вам нужно, в зависимости от вашей проблемы.
И да, вы правы в своем последнем вопросе.
Других решений пока нет …