2017-10-20 9 views
4

私は次の質問をしました。intの大きな配列をソートするには?

私たちはリクエストを送信し、intsのデータストリームを受け取ることができます(おそらくINT_MAX未満です)。私たちは、これを実行する必要があります。

Int Data ----> Our ----> Sorted Int Data 
Stream   App  Data Stream 

次のようにだから私は方法を記述します。

public int[] sort(int[] array){ 
    Arrays.sort(array); 
    return array; 
} 

問題が大きいarrayがスタックに適合することができないとヒープに置かれるということですパフォーマンスが低下します。どのように良い方法でそれをリファクタリングする

+0

データがスタックに収まらない場合は、フィットするような魔法はないと私は考えています。 – Felk

+0

@Felkはい、それで別の方法にアプローチする方法を尋ねます。 –

+0

あなたは、データを複数のまとまりに分割し、何らかの形でチャンクを処理するロジックを考え出す必要があります。ヒープの並べ替えなどを使用してください。 – Lino

答えて

10

プログラミング言語の独立した、大量のデータをソートする通常の方法は以下の通りです:のみソート

  • データ
  • のチャンクは、並べ替えをマージ使用して、すべてのソートされたチャンクをマージします。

一部の最適化された実装では、CPUのキャッシュに大まかに適合するデータセット(たとえば、タイム・ソート)にも挿入ソートなどを実行します。

しかし、データがRAMに収まるため、Javaのネイティブ実装は、すでに取得したものとほぼ同じくらい速くなければなりません。 RAMを超える場合、またはRAM使用量を制限する場合は、external sortingを使用する必要があります。それはまあ、ディスク

+0

私はこの手法で60GBのデータをソートするために外部ソートを使用しました。ファイルは.csv形式であり、すべての行に2つの大きな10進数が含まれていました。実装するのはそれほど難しくありませんでした。私は、このファイルをチャンクごとに64MB(tempファイル)に分割しました。それから私はすべてのチャンクをそれ自体でソートしました。残りはソートを最終ファイルにマージしたものです。それはうまくいって、合計で約32分かかっていました。チャンクサイズを調整することも、時間に影響する可能性があります。 –

0

に行くので、彼らはデータをソートする方法をにお聞きし、ソートするデータを提供していない場合、は、Arrays.sort()が動作する必要がある場合でも、それは......、definetely遅いです良い。ただし、ソートする最善の方法はデータに依存しますが、QuicksortとInsertionは整数の配列をソートするのに最も速いですが、浮動小数点配列の場合は特殊なソート方法が必要です。

https://en.wikipedia.org/wiki/Sorting_algorithm

は^それはそれぞれに数学的な欠点とソートアルゴリズムの多くの許容可能な方法、の完全なリストです。

関連する問題