2017-12-05 7 views
0

入力1:整数の長いリストを含む.csvファイル。例:非常に大きな整数のcsvファイルを効率的に反復処理する方法はありますか?

1 
10 
23 
2450 
12 
560 
320 
705 
... 

入力2:整数のリストを.csvファイル、およびそれぞれの整数の次の空白位置

5 - 
12 - 
15 - 
13 - 
350 - 

出力:入力、入力1からの整数のカウントを探します2の整数は.csvファイルに等しいかそれ以上であり、数値を.csvファイルに追加します。

これはDNAシーケンシングを伴うことであり、入力1には100万を超えるデータエントリがあります。この問題にアプローチする効率的な方法は何でしょうか?

私の考えは、入力1のすべてのエントリを1つの大きな配列に読み込んでソートすることでしたが、これは非効率的で多くのメモリが必要です。どんな指針も大変ありがとうございます。

編集:

出力(入力2と同じファイル):

int型、値で、ソートマップに第二のファイルから数字を入れ

5 1 
12 3 
15 3 
13 3 
350 5 
+0

入力2の方がはるかに小さい場合は、入力2の整数をメモリに格納してソートし、入力1の各intに対して入力2の次の大きい整数を取り、1を加算します。最後に、入力2の各整数 'x'には、前の数字と' x'の間にある数字の数があります。すべてのより小さい数の 'x'を持つためには、前のすべての数を合計してください。これは、入力2のメモリと、入力1に関する線形時間のみを必要とします。これは、私が理解するように、はるかに長くなります。 – fairtrax

+1

"csv"ファイルにカンマが表示されません。彼らはテキストファイルではありませんか? –

+1

あなたは何をしようとしているのか分かりません。出力例を教えてください。 –

答えて

0

を数えますゼロ:

TreeMap<Integer, Integer> counts = new TreeMap<>(); 
for (Integer i : fromFile2) { 
    counts.put(i, 0); 
} 

次に、最初のファイルからの広告、その数までカウント増分:この第二のループは、ファイル全体をメモリに読み込むためにあなたを必要としないこと

for (Integer i : fromFile1) { 
    counts.headMap(i).replaceAll((k, v) -> v + 1); 
} 

注意:あなたはちょうどそれらを一つずつ読むことができます。

また、headMap(i)は、キーが完全にi未満のエントリを返します。 i < Integer.MAX_VALUEと仮定すると、その値に1を加えるだけです。

+0

これで少しでも改善することができます。入力1から読み取られた値ごとに、少なくとも入力2の*最初の要素の記録されたカウントをインクリメントするだけでよい。各アイテムの出力時に、そのアイテムのカウントとそれよりも小さいアイテムを合計します。これは、入力2の大きさが定数によって制限されない限り、漸近的な複雑さを改善する。この場合、係数は依然として減少する。 –

関連する問題