解決済みの質問
質問:No.3388055
困ってます
お気に入り投稿に追加する (0人が追加しました)
回答数3
閲覧数221
100万個の整数のソート
2491
482
112
..
1044

のように、100万個の整数をテキストファイルから読み込んで、ソートするプログラムを作ることになりました。

これをjavaでやるのは現実的でしょうか?
(1日で終わる?)

java だと Arrays.sort というメソッドがあるとまでは聞いたのですが、個数が多くてもプログラムがちゃんと動くのか不安です。
投稿日時 - 2007-09-29 23:41:35
質問者が選んだベストアンサー
回答:No.3
ファイルのソートの方法はとりあえず2種類あると思います。

1.ファイルから1件(行?)ずつ読み込みながら、別ファイルに書き込んでいくやり方
・データ件数が多いときにメモリの圧迫を防ぐ。
・HDDフル稼働になる。
※NECソフトのソートマージツール(¥50万)では、
100バイト×1000万行=130秒で処理可能。

2.すべてメモリに読み込み、
  メモリ内でソートするやり方
・データ件数が多いときにメモリが圧迫される。
・メモリ上で操作するので速い。
※クイックソートと同等のスピードでメモリの肥大化を防ぐ、
コムソート(combsort)というソートのやり方があります。

整数値の平均が6バイトとして、
6バイト×100万件=6Mバイト
まぁ大丈夫でしょう…。

ちなみにコムソートのロジックはこんな感じです。
  public void ComSort(long[] data) {
    double sf = 1.3;
    long gap = data.length;
    boolean flag = true;
    int j = 0;
    while (flag || (gap > 1)) {
      gap = (long) Math.floor(gap / sf);
      if (gap == 9 || gap == 10) gap = 11;
      if (gap < 1)
        gap = 1;
      flag = true;
      for (int i = 0; i < data.length - gap; i++) {
        j = i + gap;
        if (data[i] > data[j]) {
          long buf;
          buf = data[i];
          data[i] = data[j];
          data[j] = buf;

          flag = false;
        }
      }
    }
  }
投稿日時 - 2007-09-30 08:53:21
この回答を支持する
(現在0人が支持しています)
お礼
ありがとうございました!
投稿日時 - 2007-10-19 23:44:51
この質問は役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答
回答:No.2
ソート対象の数が多いときにどうなのかという質問だとして、

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/util/Arrays.html#sort(int[])

public static void sort(int[] a)

指定された int 値の配列を数値の昇順でソートします。ソートアルゴリズムは調整されたクイックソートで、『Software-Practice and Experience, Vol. 23(11)』(1993 年 11 月) の 1249 ~ 1265 ページの Jon L. Bentley と M. Douglas McIlroy による「Engineering a Sort
Function」という記事から応用したものです。このアルゴリズムは、他のクイックソートアルゴリズムでは n の二乗のパフォーマンスに低下させる多くのデータセットにおいて、n*log(n) のパフォーマンスを提供します。

ということなので、アルゴリズム的な問題はないと思います。
とりあえず乱数で百万個の整数を生成してそれをソートするという
プログラムを組んで試してみましたが

>java SortArray
start :Sun Sep 30 01:28:29 JST 2007
finish :Sun Sep 30 01:28:32 JST 2007

>java SortArray
start :Sun Sep 30 01:32:31 JST 2007
finish :Sun Sep 30 01:32:31 JST 2007

>java SortArray
start :Sun Sep 30 01:32:33 JST 2007
finish :Sun Sep 30 01:32:33 JST 2007

>java SortArray
start :Sun Sep 30 01:32:42 JST 2007
finish :Sun Sep 30 01:32:43 JST 2007

>java SortArray
start :Sun Sep 30 01:32:48 JST 2007
finish :Sun Sep 30 01:32:48 JST 2007

それなりのマシンで動かすならそんなに心配する必要はないのでは?
ファイルの読み込みをするとそれで時間がかかることは明らかですが、
ざっと一行あたり10バイトとしてそれが百万行で一千万バイト。
ほぼ10メガバイトとみても一日仕事にはならないでしょう。
投稿日時 - 2007-09-30 01:37:52
この回答を支持する
(現在0人が支持しています)
お礼
ありがとうございました!
投稿日時 - 2007-10-19 23:45:14
回答:No.1
現実的とはどういう意味なのかが良くわかりませんが、
javaでそのようなプログラムを作ることは可能ですし、
経験者であればさほど時間も掛からないと思います。
未経験であっても、それなりにjavaを学習していれば問題ないレベルだと思います。
また、java以外でと考えているのであればCのほうがより機械語に近いので処理速度的には早いでしょう。
ただしCの場合は領域の確保をよりシビアにしないといけないかもしれません。
領域の確保を気にしないのであればC++のほうがクラスを使って楽に作れそうな気もします。
投稿日時 - 2007-09-29 23:51:49
この回答を支持する
(現在0人が支持しています)
お礼
ありがとうございました!
投稿日時 - 2007-10-19 23:45:07
もっと聞いてみる
関連するQ&Aはこちら
WEB制作初心者、勉強中のものです。 javascritpのsortメソッドについて質問です。 無名関数を使って偶数と奇数を並び替えるコードについてですが、 下記の場合、function(a,b)の...
VBの勉強をしております。(WindowsXP、VB6.0) MSFlexGridのSortは、内部的にはどの種類のソートなのでしょうか? ご存知の方がおられたら教えていただけますでしょうか? 課...
RubyのEnemuratableモジュール内で定義されているメソッドのひとつsort メソッドの使い方が良くわかりません。 ブロックや<=>演算子を用いて何か分かりやすい例はありますでしょうか? ...
この他の関連するQ&Aをキーワードで探す
プログラミングのサブカテゴリ
カテゴリ:Java
RSS
-PR-
PR
-PR-