2012-02-29 15 views
1

私はtrieのデータ構造で練習しています(コースワークは関係ありません)。このクラスは、文字列の部分文字列を格納するために使用されます。長さがnの文字列の場合、合計部分文字列はn(n+1)/2です。特に、trieのこの実装は、自然順序付けを保持し、ランダムな文字列のTreeMapまたはTreeSetより効率的です。文字列全体ではなく、単一の文字を格納するだけでなく、メモリに保存されます。Java Trieの最適化

サフィックス配列を格納する方がよいかもしれませんが、新しいプロジェクトを開始する前に、このtrieクラスの速度が合理的に最適化されていることを確認したかったのです。

class Trie 
{ 
    final Trie my_parent; 
    final Trie[] my_children; 
    final char my_value; 

    public Trie(final Trie the_parent, final char the_value) 
    { 
     my_parent = the_parent; 
     my_value = the_value; 
     my_children = new Trie[26]; 
    } 

    public int insertIterative(final char[] the_text) 
    { 
     int number = 0; 
     Trie parent = this; 

     for(int ator = 0; ator < the_text.length; ator++) 
     { 
      final int key = the_text[ator] - 97; 
      Trie child = parent.my_children[key]; 

      if(child == null) 
      { 
       child = new Trie(parent, the_text[ator]); 
       parent.my_children[key] = child; 
       number++; 
      } 

      parent = child; 
     } 

     return number; 
    } 

    public String getString() 
    { 
     final StringBuilder builder = new StringBuilder(); 
     Trie parent = this; 

     while(parent.my_parent != null) 
     { 
      builder.append(parent.my_value); 
      parent = parent.my_parent; 
     } 

     return builder.reverse().toString(); 
    } 
} 
+0

あなたが欲しい特定のパフォーマンス上の問題に気がつきましたか?プロファイラを使用してコードを実行すると、どの部分が最も時間がかかっているかを確認できますか?あなたが "最適化"と言うときは、スピードやメモリを意味しますか? – DNA

+0

私は比較するものがないので、スピードの面で言うのは難しいです。私はプロファイラーがそれを見なければならないと聞いたことはありません。 – ntin

+0

他のTrieの実装と比較することができます。たとえば、次の質問を参照してください。http://stackoverflow.com/questions/623892/where-do-i-find-a-standard-trie-based-map-implementation-in- javaまたはこれ:http://stackoverflow.com/questions/3806788/trie-data-structures-java – DNA

答えて

4

は、上記の私のコメントを参照してください、とにかく、いくつかの観察は:

あなたは26の子供は関係なく、彼らが使用されているかどうかの、すぐに試み割り当てます。あなたはこれらをゆっくりと作成できます(つまり、特定の文字に遭遇した場合のみ)。

あなたのコードは、プレーンなASCII文字のみで動作し、外国語の文字、ハイフン、アポストロフィ、大文字小文字の混在は処理しません。レイジー割り当てもこれを助けます。

実装では、charごとにTrieオブジェクトを使用し、いくつかの空きスペアを使用しているため、メモリ使用量が非常に多い可能性があります。

の結果を追加して反転するのではなく、正しい順序で収集する方が良いですが、これをベンチマークする必要があります。 Trieの深さを追跡していれば、StringBuilderではなく正しい長さの配列を割り当てることができますが、深さを追跡することは独自のメモリコストを伴います。

+0

私は実際には考えませんでしたが、空の配列はまだ4バイト(32ビット)または8になるnullポインタのためのメモリを割り当てる必要がありますバイト(64ビット)。 Trieに10万のノードがある場合は、かなりの量の無駄なストレージが追加されます。 – ntin