私は、900万レコードのリストの別の単語セットに一致する単語のセットを見つけることができる最速のアルゴリズムを探しています。大きな単語リスト内の単語のセットを見つけるアルゴリズム
問題:私は約100,000セットの単語を持つリストを持っており、単語セットのそれぞれを900万セットの別のリストで検索する必要があります。
私の現在の解決策はこのようになり、テキストファイルからすべてのレコードを読み込み、メモリに保持します(配列の形で、「検索リスト」と呼ばせてください)。この配列を構築している間、私はアルファベット順に単語のセットをソートし、すべての単語セットが追加されると、リスト全体をソートします。私は他の大きなリストと同じことをして、その 'データリスト'と呼ぶことにしましょう。
ここで、検索リストの各要素を繰り返して、一致する部分を見つけようとします。一致が見つかると、それは一致した位置と同じ位置から次の検索を覚えています。これにより、検索リスト内の各要素について繰り返しデータ・リスト全体を反復する必要がなくなります。
私はそれが超高速であることを前提としましたが、残念ながらそうではありません。検索リストの完全な反復を完了するのにほぼ15〜20分かかります。これは受け入れられません。ここで
は私のコードのスニペットが
int lastPointer = 0
for(int i=0; i<search list.size(); i++){
def this_matched_out = []
inmem_json_arr[i][0]
for(int j=lastPointer; j<data list.size(); j++){
if(data list[j].containsAll(search list[i])){
this_matched_out.add(data list[j])
lastPointer = j
}
}
if(this_matched_out.size()>0) - println "found a match for search "+list[i]
else println "No match found for "+list[i]
}
で誰が私に、より良いアルゴリズムを提案することはできますか私はここで何も悪いことをやっていますか?
検索用語をマップ/連想配列に格納してから、長いリストの各単語を検索する方が簡単ではないでしょうか?あなたは長いリストを並べ替える必要がありません。 (項目を挿入するときにリストを並べ替える理由がわかりません。読み込み後に各配列を一度ソートするだけでは不十分ですか?) –
これは、データベースに挿入して非常に単純な結合クエリ。 –
より多くの質問をする前に、[良い質問をするには?](http://stackoverflow.com/help/how-to-ask)をお読みください。 –