2012-03-14 7 views
2

я собираюсь реализовать суффикс дерево для данной строки, я думаю, что это должно delcared как этогосуффикса построение дерева

struct suffix 
{ 

char letter; 
suffix * left,*right; 

}; 
suffix *insert(suffix *node,char *s){ 

} 

// здесь я собираюсь построить дерево со всеми появлениями из подстрок и символами но не знаете, как использовать левую и правую часть, это дерево сортировано и упорядочено строгим упорядочением символов, таких как дерево двоичного поиска? или? пожалуйста, помогите мне, я не хочу использовать какой-то код в Интернете, мне нужно реализовать его myselft, поэтому, пожалуйста, дайте мне несколько советов, немного кода

ответ

4

Посмотрите на Wikipedia description:

Suffix tree

Обратите внимание, прежде всего, что дерево суффиксов не бинарное дерево так что ваш план реализации является в корне ошибочным.

Затем недостаточно одного символа на узел/ветвь; ветвь дерева суффиксов представляет собой подстроку , которая может быть длиннее одного символа. Также обычно сохраняется только начальный и конечный индексы подстроки внутри строки, а не сама строка; в противном случае дерево суффикса будет потреблять много ненужной памяти.

И наконец, don’t use pointers здесь. Они ничего не покупают и только вызывают проблемы. Вместо этого используйте что-то вроде boost::container::vector<suffix> (я бы предложил std::vector<suffix>, но, к сожалению, standard library containers cannot deal with incomplete types).

+0

так это значит, что я должен использовать цикл в методе insert? Один цикл для цельной строки, еще один цикл для поиска всей последующей подстроки и добавления ее в узел? –

+0

@dato Ну, вы, конечно, не обойдете петлю. –

+0

извините за ответ позже, потому что я был вне дома, когда создаю вектор Я не могу получить доступ к содержимому структуры, почему? Например, в struct suffix i объявлена ​​строка s, как я могу получить доступ к этой строке? –

4

Википедия - это начало.

Однако на самом деле это делается для понимания алгоритма построения дерева суффикса, алгоритма Вайнера или Укконена.

Алгоритм Ukkonen проще: http://europa.zbh.uni-hamburg.de/pubs/pdf/GieKur1997.pdf

Кроме того, эта связь менее академическая и более практичный: http://www.cise.ufl.edu/~sahni/dsaaj/enrich/c16/suffix.htm

Попытки начать понимать алгоритм.

После этого удачи, это одна из самых сложных структур данных. Единственное худшее - сжатые и оптимизированные версии дерева суффиксов.

Но все великие программисты, как большие проблемы.

Смежные вопросы