2012-03-14 16 views
2

私は与えられた文字列の接尾辞木を実装するつもりですが、私はすべてのサブストリングのoccurancesと文字 が、いけないとツリーを構築するつもりです//ここで、それはこの接尾辞木構築

struct suffix 
{ 

char letter; 
suffix * left,*right; 

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

} 

ようdelcaredべきだと思いますどのように左と右の部分を使用するかを知っている、このツリーはソートされ、バイナリ検索ツリーのような文字の厳密な順序によって整理されていますか?または助けてください、私はオンラインでいくつかのコードを使用したくない、私はmyselftを実装する必要があります私はいくつかのヒント、いくつかの小さなコード

答えて

4

を見てくださいWikipedia descriptionを見て:

0接尾辞木は、バイナリツリーではないことを、すべての最初の

Suffix tree

注意は、ので、あなたの実装の概要は根本的に欠陥があります。

次に、ノード/ブランチごとに1文字を格納するだけでは不十分です。サフィックスツリーブランチは、サブ文字列を表します。これは、1文字よりも長くなることがあります。文字列自体ではなく、文字列内の部分文字列の開始インデックスと終了インデックスだけを格納するのも普通です。さもなければ、接尾辞ツリーは多くの不必要なメモリを消費します。

最後に、don’t use pointersここに。彼らはあなたに何も買わず、トラブルを引き起こすだけです。代わりにboost::container::vector<suffix>のようなものを使用してください(私はstd::vector<suffix>を提案しますが、残念ながらstandard library containers cannot deal with incomplete types)。

+0

これは、挿入メソッドでループを使用する必要があることを意味します。文字列全体に対して1つのループ、すべての後続部分文字列を探してノードに追加するための別のループ? –

+0

@datoさて、あなたは確かにループを回らないでしょう。 –

+0

私は家にいたので、後で返信してしまいました。なぜ構造体のコンテンツにアクセスできないのですか?たとえば、構造体の接尾辞の文字列を宣言した場合、どうすればこの文字列にアクセスできますか? –

4

ウィキペディアは始まりです。

しかし実際には接尾辞ツリー構築アルゴリズム、WeinerまたはUkkonenアルゴリズムを理解することです。

Ukkonenアルゴリズムは単純である: http://europa.zbh.uni-hamburg.de/pubs/pdf/GieKur1997.pdf

また、このリンクは少なく、学術、より実用的である: http://www.cise.ufl.edu/~sahni/dsaaj/enrich/c16/suffix.htm

は、アルゴリズムを理解することを開始するようにしてください。

この幸運の後、これは最も厳しいデータ構造の1つです。最悪の唯一のものは、サフィックスツリーの圧縮され最適化されたバージョンです。

しかし、すべての偉大なプログラマーは大きな課題を抱えています。

関連する問題