我正在逐字节读取四个文件并比较所有四个字节以从这四个字节中生成一个最终字节。它的工作方式是:
- 如果所有字节都是
0
,则输出0
- 如果除了 1 个字节之外的所有字节都是
0
,则输出奇数字节输出(如果字节是0, 0, 1, 0
,那么我将输出 a1
) - 如果 2 个字节是
0
,那么我随机输出一个非0
字节 - 如果 1 个字节是
0
,则我从其他 3 个字节中输出出现次数最多的字节,否则在平局的情况下,我从该集合中输出一个随机字节 - 如果所有字节都不是
0
,那么我输出出现次数最多的字节,否则在平局的情况下,我从该集合中输出一个随机字节
需要注意的重要一点是,“随机”并不一定是随机的,我可以选择最方便的一个。
所以我对此进行了一些思考,但我仍然无法想出从这些数字中获得输出的绝对最快的方法。我注意到的一件事是,如果我读取的前两个字节相同且非零,那么我可以跳过接下来的两个字节并只输出前两个字节中的一个。如果前三个字节是0
,那么我可以输出最后一个字节。我还可以用第一个字节和第二个字节检查第三个字节,看看它们是否相等,这样我就可以避免进入第 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();
}
}
}
}
编辑:80亿,不是800万
EDIT2:正如评论中所指出的,由于同步,我不能跳过阅读字符。