また,実行速度はプログラマの質による差異が.速いプログラムと遅いプロ グラムでは、100倍、1000倍速度が違うことは珍しくない。このような速度の 差は,使用するプログラミング言語の違いにより生じることもあるが,あるこ とをやる際のアルゴリズム(計算法)による違いによる場合が多い.
ここでは,全順序関係の成り立つ要素を順序関係に従って整列しなおす(これ をソートと呼ぶ)プログラムを例に,アルゴリズムと実行速度の関係について, 学ぶことにする.
% java Catと実行すると,キーボードから入力して画面上に出力するプログラムになるが (終了はCtrl-dでおこなう),
% java Cat < Cp.java > tmpと実行するとCat.javaから読み込んだファイルが tmpに出力される.
// BufferedReaderなどを使うので,java.io.*を import する.
import java.io.*;
class Cat {
// 入出力の途中で,IOExceptionの例外が起きる可能性があるので,
// throws IOException をつける.
public static void main(String [] args) throws IOException{
BufferedReader is=new BufferedReader(new InputStreamReader(System.in));
String s;
while((s=is.readLine())!=null){
System.out.println(s);
}
}
}
入力用のストリームは,FileReaderから BufferedReaderを作ることにより,行単位の入出力をおこなうことができ る.出力用のストリームはFileWriterから PrintWriterを作ることにより,println等が実行できる.
これを使った Cpプログラムを見てみる.
// BufferedReaderなどを使うので,java.io.*を import する.
import java.io.*;
class Cp {
// 入出力の途中で,IOExceptionの例外が起きる可能性があるので,
// throws IOException をつける.
public static void main(String [] args) throws IOException{
if(args.length!=2) usage();
BufferedReader is=new BufferedReader(new FileReader(args[0]));
PrintWriter ps=new PrintWriter(new FileWriter(args[1]));
String s;
while((s=is.readLine())!=null){
ps.println(s);
}
is.close();
ps.close();
}
static void usage(){
System.err.println("使い方: java Cp コピー元のファイル コピー先のファイル");
System.exit(1);
}
}
不要になったストリームを close するのを忘れないように.
java Cp Cp.java sokoを実行すると Cp.javaの内容が sokoというファイルにコピーされる.
% man sortで確認できると思う.ここでは,その最も単純な行の先頭からの辞書順序での ソートをおこなうプログラムを扱ってみる.
まずは準備として,ファイルから読み込んで1行毎の文字列の配列を作成する という部分を見てみる.
// BufferedReaderなどを使うので,java.io.*を import する.
import java.io.*;
// Vectorを使うので java.util.* を importする.
import java.util.*;
class SortTest {
// このメソッドの中で linesの並び替えをおこなう.
static void sort(String[] lines){
}
// IOExceptionを catchしていないので,throws IOExceptionをつける.
public static void main(String args[]) throws IOException{
// ファイル名と思って BufferedReader
BufferedReader is=new BufferedReader(new FileReader(args[0]));
// 何行になるかわからないので,Vectorで記憶しておく
Vector v=new Vector();
String s;
// 1行読み込んでファイルの終端に到達しない間
while((s=is.readLine())!=null){
// Vectorの最後に要素を加える
v.addElement(s);
}
// 入力ストリームを閉じる
is.close();
// Vectorから配列に変換するために,領域を確保する
String[] lines=new String[v.size()];
// Vectorから配列に変換する.
v.copyInto(lines);
// ソートする
sort(lines);
// ソートした結果を出力する.
for(int i=0;i< lines.length;i++)
System.out.println(lines[i]);
}
}