2013-04-18 17 views
6

Javaプログラムでたくさんの単語(+ 200k)を在庫しなければならず、本当に高速にアクセスしたいのですが。 与えられた単語が私の "辞書"に属しているかどうかだけ知る必要があります。私は<word, smthg>のようなペアは必要ありません。 可能であれば、私は標準ライブラリのソリューションを探しています。Java:ワードロットのデータ構造

PS:おそらくデータ構造を使用してこれを行うより良い方法はありませんか?単語を含むファイルがより効率的になるたびに読む?

編集:これは小さなプロジェクトです。私は有効性と記憶に対処しなければならない

最後の編集:私は最終的にHashSetを選択します。

+2

[HashSet](http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html)のようなサウンドが適しています。 – Keppil

+0

[Lucene](http://lucene.apache.org/)の使用に関する考え方はありますか – SenthilPrabhu

+0

@Keppil HashSetの問題はソートされていないことです。したがって、検索はより遅くなります。 –

答えて

5

セットはTreeSetのような線形ソートされたデータ構造であるため、java集合を使用します。だから、検索のために、バイナリ検索のような技術を実装することができ、それらは繰り返しなしで高速です。

これはjavaの構造です。

enter image description here

また、それは重複が故に、冗長性を削減し、あなたの記憶を保存します許可するつもりはありません。

さまざまな検索アルゴリズムを知りたい場合は、このリンクを参照してください。ここで

http://bigocheatsheet.com/

+0

セットは多くのメモリを無駄にします。このようなタスクのための特殊なデータ構造があります。 –

+1

@IvayloStrandjev HashSetに格納されている平均10文字の200kワードで、メモリが5〜10MBになることがあります。それは多くではありません... – assylias

+3

ちょうど試して、それは20メガバイトに近いですが、それほど多くはありません。 – assylias

3

単語の分布に応じてTrieまたはのいずれかを使用します。私は個人的にはPatriciaツリーを使用します(実装するのは難しいですが)。

+5

OPのユースケースのようなかなり少量のオブジェクトに対しては、HashSetはうまくいくでしょう。また、標準のJDKにはTrie/Patricia Treeの実装はありません。 – assylias

0

はおそらく、あなたは私のTrieMapまたはTrieSet実装(found here)をテストしたいと思いますか?私は特にこのような場合のためにそれらを書いた。今まで私はStringbyte[]のキーの試行を実装しました。

TrieSet<String> t = Tries.newStringTrieSet(); 

    t.add("hello"); 
    t.add("help"); 
    t.add("hell"); 
    t.add("helmet"); 
    t.add("hemp"); 

    List<String> resultsA = new ArrayList<>(); 
    t.findElements("hel", true, resultsA); // search for prefix 

    List<String> resultsB = new ArrayList<>(); 
    t.findElements("ell", false, resultsB); // search for substring 

    System.out.println("A: " + resultsA); 
    System.out.println("B: " + resultsB); 

これは印刷になります。パフォーマンスは

//put all your words to an ArrayList and sort the list. 
List <String> arr = new Arraylist<>(); 
while(there is next) 
    arr.add(theWord) 
Collections.sort(arr); 

//this is your search method 
boolean mysearch(keyword){ 
    return Collections.binarySearch(arr, keyword) 
} 

です:

A: [hell, hello, helmet, help] 
B: [hell, hello] 
+0

> 1.5 KLOCとは一度だけのテストではありませんか? –

0

は、この私にはかなりOK見て、私は私が何らかの理由で間違っている場合は知らないO(n*log_n)用データを挿入して検索するとO(log_n)

たとえば、各文字列は20Bで、 verage。 20B *200000 = 4MBスペース。