大きなファイルを1行ずつ解析して、各行の部分文字列を読み込みます。私は各部分文字列から1行につき〜30の整数値を取得し、ファイルから最も高い5の値を返す必要があります。どのようなデータ構造が、5つの最大値を追跡するのに最も効率的でしょうか?Javaでストリームを解析中に見つかった最大値を追跡する最良の方法
1
A
答えて
1
ソート順のLinkedList挿入を使用できます。それぞれ新しいint、あなたはそれが最大であることを確認するために最後をチェックします。次に、降順で繰り返し、newInt>ノードのintであれば、そこに新しいintを挿入し、長さ5を維持するためにremoveLast()を挿入します。
配列も機能しますが、シャッフルする必要があります。
2
TreeSet
(基本的にソートされたセット)を使用し、セットに追加するたびにfirst
(最低)の要素を削除します。 これは、重複をdicardします。
SortedSet<Integer> set = new TreeSet<>();
for (...) {
...
if (set.size() < 5) {
set.add(num);
} else if (num > set.first()) {
set.remove(set.first());
set.add(num);
}
}
1
グアバライブラリは、O(N)時間とO(K)の空間にIterable
から最大k個の要素を返すOrdering.greatestOf
方法を有しています。
実装はパッケージプライベートTopKSelector
クラスにあります。
5
この問題は通常、heap,で解決されますが、(おそらく反直感的に)最小ヒープを使用します(最小の要素はヒープの「トップ」です)。
アルゴリズムは、基本的にはこれです:
for each item parsed if the heap contains less than n items, add the new item to the heap else if the new item is "greater" than the "smallest" item in the heap remove the smallest item and replace it with the new item
作業が完了したら、あなたは最低から最大にヒープから要素をpopすることができます。
か、具体的に:
static <T extends Comparable<T>> List<T> top(Iterable<? extends T> items, int k) {
if (k < 0) throw new IllegalArgumentException();
if (k == 0) return Collections.emptyList();
PriorityQueue<T> top = new PriorityQueue<>(k);
for (T item : items) {
if (top.size() < k) top.add(item);
else if (item.compareTo(top.peek()) > 0) {
top.remove();
top.add(item);
}
}
List<T> hits = new ArrayList<>(top.size());
while (!top.isEmpty())
hits.add(top.remove());
Collections.reverse(hits);
return hits;
}
あなたはtop of the heap efficiently,に新しい項目を比較することができますし、厳密にすべての時間を注文したすべての要素を維持する必要はありませんので、これは完全に注文したよりも高速ですTreeSet
のようなコレクション。
5つの要素の非常に短いリストについては、配列の反復処理が高速になる場合があります。しかし、 "トップヒット"コレクションのサイズが大きくなると、このヒープベースのメソッドが勝つでしょう。
関連する問題
- 1. loadashで最小値と最大値を見つける方法
- 2. ファイル内の最小値/最大値を見つける方法
- 3. 数字の中で最大の正方形を見つける方法(Java)
- 4. 解析プロセス中にSAXパーサが読み込んでいるストリームを閉じる最も良い方法は?
- 5. 条件に合った最小値を見つける良い方法は?
- 6. 現在のオンラインユーザーを追跡する最良の方法
- 7. Pythonループの結果を追跡する最良の方法
- 8. バックグラウンドで最良の方法で解析を保存する
- 9. OpenCV:矩形を追跡する最良の方法
- 10. Javaストリーム最小/最大でネストされたコレクションをフィルタリングする
- 11. Rubyでテーブルを解析する最良の方法
- 12. Excelでダイナミックセルの最大値と最小値を見つける方法
- 13. Javaで自分のコードで最大値と最小値を見つける
- 14. java opencvで最大の輪郭を見つける方法
- 15. 新しい列に見つかった最大値を新しい配列に追加する(java)
- 16. データ構造の中で最大の最小値と最大のキーの値を見つける
- 17. DFの各行で最大と最大の最大値を見つけるR
- 18. SAS(上位3)の中で最大の値を見つける
- 19. チャペルでアレイの最大値を見つける方法
- 20. Java 8ストリームの最小値と最大値の両方を取得する簡潔な方法
- 21. テキストを解析するJava 8の最良の方法date to millisecond timestamp
- 22. 番号リストの最小値と最大値を見つける方法
- 23. DataFrame apache sparkから最大値アルファベットを見つける方法?
- 24. numpy.ndarrayで最大値の最後の出現を見つける方法
- 25. REST APIの引数を解析する最も良い方法
- 26. Java - 整数の順序で最小値と最大値を見つける方法は?
- 27. FibonacciHeapは最小ヒープですか? FibonacciHeapを使って最大値を見つける方法は?
- 28. 配列から最小値と最大値を見つける
- 29. sql - カテゴリで最大値を見つける方法
- 30. 多次元配列で最大値を見つける方法
(長さ5の) 'int'配列です。 –
上位5つの数字のいずれかが重複している場合はどうなりますか? – 4castle
位置5に値が重複している場合は、問題は発生しません。 – Badger