私は4つのファイルをバイトごとに読み取り、それらの4つのバイトすべてを比較して、これらの4つのバイトから最後の1バイトを作成しています。それが機能する方法は次のとおりです。
- すべてのバイトが
0
、の場合、出力0
- 1バイトを除くすべてが
0
、の場合、奇数バイト出力を出力します(バイトがの場合、0, 0, 1, 0
私はを出力します1
) - 2バイトの場合、非バイト
0
の1つをランダムに出力します0
- 1バイトが
0
、の場合、他の3バイトから最も多く発生するバイトを出力します。それ以外の場合、同点の場合は、そのセットからランダムバイトを出力します。 - すべてのバイトが非
0
の場合、最も出現するバイトを出力します。それ以外の場合、同点の場合は、そのセットからランダムなバイトを出力します。
注意すべき重要なことの1つは、「ランダム」は文字通りランダムである必要はなく、最も便利なものを選択できるということです。
だから私はこれにいくつかの考えを与えました、しかし私はまだこれらの数から出力を得る絶対的な最速の方法を思い付くことができません。私がそれらに気づいたことの1つは、私が読んだ最初の2バイトが同じでゼロ以外の場合、次の2バイトをスキップして、最初の2バイトの1つを出力することができるということです。最初の3バイトが0
、の場合、最後のバイトを出力できます。3番目のバイトを1番目のバイトと2番目のバイトでチェックして、それらが等しいかどうかを確認して、4番目のバイトに進まないようにすることもできますが、これは文字通りできるだけ効率的である必要があります。このアルゴリズムを約80億回実行する必要があるため、少しでも重要です=)
とにかく、これを行うための最も効率的な方法は何ですか?(擬似コード?またはその他)
これはプログラムがどのように見えるかです(少なくともそのシェル):
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class reconstructerv2 {
public static void main(String[] args) throws IOException {
FileInputStream in1 = null;
FileInputStream in2 = null;
FileInputStream in3 = null;
FileInputStream in4 = null;
FileOutputStream out = null;
try {
in1 = new FileInputStream("1.dd");
in2 = new FileInputStream("2.dd");
in3 = new FileInputStream("3.dd");
in4 = new FileInputStream("4.dd");
BufferedInputStream in1b = new BufferedInputStream(in1);
BufferedInputStream in2b = new BufferedInputStream(in2);
BufferedInputStream in3b = new BufferedInputStream(in3);
BufferedInputStream in4b = new BufferedInputStream(in4);
out = new FileOutputStream("final.dd");
int a;
int b;
int c;
int d;
int o;
while ((a = in1.read()) != -1) {
b = in2.read();
if (a == b && a != 0)
o = a;
else {
c = in3.read();
d = in4.read();
}
System.out.println((byte) c);
out.write((byte) o);
}
} finally {
if (in1 != null) {
in1.close();
in2.close();
in3.close();
in4.close();
}
if (out != null) {
out.close();
}
}
}
}
編集:800万ではなく80億
EDIT2:コメントで指摘されているように、同期のために文字を読み飛ばすことはできません。