3

私はいくつかのデータを持っています:

A
AXNHJNEHWXNOECMEJK
DNFJNXYEEQWhsdbchjsxs
XMJQWsdsEOJdfsKMDJE

....

各行は配列で、各文字はオブジェクトです。私は、文字 A が文字 a と同等であると言うことができる比較関数を持っています (実際には文字ではありません。ロシア語の単語であり、比較関数は形態学を使用して、単語が等しいことを知らせます。ロシア語の文. 例: "Мама мыла раму")。次のようなツリーデータ構造を作成したい:

1) A
2.1) BA
2.2) DHBAFH
3.1) BEDMEWA
etc...

それ以外の場合、子ノードには親ノードからの文字が含まれている必要があります。google adwords の使い方を知っていれば、私を理解できると思います。私の質問は、そのFASTを行う方法です。何千もの配列を持つツリーを作成する必要があります。比較機能の動作が非常に遅い (大きな辞書を使用する) ため、速度が問題になります。

いくつかの簡単なデータ (ロシア語で申し訳ありません):

ここに文のセットがあります

сайты        
сайты недорого
сайты дешево
сайты дешево и быстро
красивый сайт по доступным ценам 
хочу купить хороший стул 
стул по доступным ценам

次のツリーデータ構造を作成する必要があります

1) сайты
1->2.1) сайты недорого
1->2.2) сайты дешево
1->2.3) красивый сайт по доступным ценам 
1->2.2->3) сайты дешево и быстро

他の親ノード:

1) хочу купить хороший стул 
1) стул по доступным ценам

子ノードには、親よりも多くの単語を含める必要があります。

4

2 に答える 2

1

単語が 1 つの文から始めます。それらはすべて親ノードになるため、これは簡単です。

次に、2 単語の文を続けます。比較関数が遅いため、それぞれを 1 語の親ノードごとに一致させる必要があります。これは非常に遅くなります。ただし、2 つの最適化を行うことができます。まず、単語がまったく同じかどうかを確認します。これは自分で行うことができ、高速になります。もう 1 つは、比較された単語のペアごとに比較関数の結果を記憶することです。いくらかのメモリを浪費することになりますが、速度はいくらか向上します。

ノードが一致したら、それに文を追加します。文がどのノードとも一致しない場合は、それを親ノードにします。

徐々に長さが増加する文の場合、文を追加する正しい場所を見つけるために、一致したノードの子を照合する必要があることを除いて、同じことを行います。

于 2011-05-21T21:35:16.133 に答える
1

良い、

このリンクはあなたの問題に役立つようです

接尾辞ツリーによる高速文字列検索: http://marknelson.us/1996/08/01/suffix-trees/

サフィックスツリー

http://en.wikipedia.org/wiki/Suffix_tree

于 2011-05-21T15:30:19.573 に答える