こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

実行速度を速くする方法

javaで整数がランダムに記述されたテキストファイルを読み込み、ソートし、テキストファイルに出力させるプログラムを考えています。

テキストファイルからの読み込みはあらかじめ配列を作っておき、scannerで読み込んでいます。

アルゴリズム(バブルソート)を変更せずに実行速度を速くするにはテキストファイルの読み込みを速くしたいのですが、どのように変更すれば良いでしょうか。

ソート数としては10万くらいを考えています。
またプログラムの記述が変なところがあれば教えていただければありがたいです。


import java.io.*;
import java.util.Scanner;

class test1_4{
public static void main(String args[]){
long start = System.currentTimeMillis();
try{
File filein = new File("./input.txt");
BufferedReader br = new BufferedReader(new FileReader(filein));

int x[] = new int[100000];
br = new BufferedReader(new FileReader(filein));

Scanner scan = new Scanner(new File("./input.txt"));
int k=0;
while(scan.hasNext()){
x[k] = scan.nextInt();
k++;
}

br.close();

for(int i=0; i<k; i++){
for(int j=k; j>0; j--){
int z = j-1;
if(x[z] > x[j]){
int tmp = x[j];
x[j] = x[z];
x[z] = tmp;
}
}
}

try{
File fileout = new File("./output.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(fileout));
PrintWriter pw = new PrintWriter(bw);

for(int i=1; i<k+1; i++){
if(x[i]>0){
pw.print(x[i]);
pw.print(" ");
if (i%10 == 0) {
pw.print("\r\n");
}
}
}
pw.close();
bw.close();
}
catch(IOException e){
System.out.println(e);
}
long stop = System.currentTimeMillis();
System.out.println("実行にかかった" + (stop - start) + " ミリ秒です");
}
catch(FileNotFoundException e){
System.out.println(e);
}
catch(IOException e){
System.out.println(e);
}
}
}

投稿日時 - 2011-02-14 00:59:54

QNo.6521234

暇なときに回答ください

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

そう, BufferedReader を 2回作ってるのはおかしい.
で, その br はどこで使ってるの?

投稿日時 - 2011-02-16 23:12:04

お礼

回答ありがとうございます。

確かに使っていませんでした。
別のプログラムからコピーした際に消し忘れたということと、明らかに知識が不足していることを認識しました。

投稿日時 - 2011-02-17 02:16:29

ANo.2

時間についての話は終わったので別件.

File filein = new File("./input.txt");
BufferedReader br = new BufferedReader(new FileReader(filein));

int x[] = new int[100000];
br = new BufferedReader(new FileReader(filein));

Scanner scan = new Scanner(new File("./input.txt"));

の部分をじっと見てください. おかしなことに気づきませんか?

投稿日時 - 2011-02-15 17:47:58

お礼

回答ありがとうございます。

配列を作った後に
br = new BufferedReader(new FileReader(filein));
で再びインスタンスを生成していました。

この他にも使い方等でおかしなところがありましたら指摘していだだけるとありがたいです。

投稿日時 - 2011-02-16 02:14:29

ANo.1

ファイルの読み書き時間は、そのデータ量にほぼ依存するので、同じデータ量で劇的に速く、というのは難しいです。

バブルソートは比較ソートの中ではこれといった高速化ギミックが無い「もっとも遅いアルゴリズム」です。
普通は、ソートのアルゴリズムを変更するものですが....


このプログラムでは、全体の時間しか測ってませんが、読み込み、ソート、書き込みに分けてそれぞれの時間を測定してはどうでしょう。ファイルの読み書きには言うほど時間かかってないかもしれません。

投稿日時 - 2011-02-14 04:47:36

お礼

回答ありがとうございます。

実際に10万行の整数で測ったところ読込みには300msくらいの時間がかかっていました。
また全体にかかる時間は30秒程度かかっていることから、読込みにかかる時間は全体の1%程度しかかかっておらずほとんどの時間をソートに費やしているため、これ以上の高速化はほとんど無意味とわかりました。

投稿日時 - 2011-02-14 23:37:31

あなたにオススメの質問