2

私は4つのファイルをバイトごとに読み取り、それらの4つのバイトすべてを比較して、これらの4つのバイトから最後の1バイトを作成しています。それが機能する方法は次のとおりです。

  1. すべてのバイトが0、の場合、出力0
  2. 1バイトを除くすべてが0、の場合、奇数バイト出力を出力します(バイトがの場合、0, 0, 1, 0私はを出力します1
  3. 2バイトの場合、非バイト 0の1つをランダムに出力します0
  4. 1バイトが0、の場合、他の3バイトから最も多く発生するバイトを出力します。それ以外の場合、同点の場合は、そのセットからランダムバイトを出力します。
  5. すべてのバイトが非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:コメントで指摘されているように、同期のために文字を読み飛ばすことはできません。

4

2 に答える 2

1

すべてのバイトが0の場合、0を出力します

a + b + c+dを出力します。

1バイトを除くすべてが0の場合、奇数バイト出力を出力します(バイトが0、0、1,0の場合、1を出力します)

同上。これはすでにあなたのケースを救います。3バイトがゼロの場合は、合計を出力します。

2バイトが0の場合、0以外のバイトの1つをランダムに出力します。1バイトが0の場合、他の3バイトから最も多く発生するバイトを出力します。それ以外の場合、同点の場合は、そのセットからランダムバイトを出力します。すべてのバイトが0以外の場合は、最も出現しているバイトを出力します。それ以外の場合は、同点の場合は、そのセットからランダムなバイトを出力します。

これらのケースは実際にはすべて同じです。ゼロ以外のバイトの中で最も発生しているバイト、または同点の場合はランダムなバイトを出力します。

したがって、考慮すべきケースは実際には2つだけです。少なくとも3つのゼロバイトと2つ以下です。

実際のところ、すべてのケースは同じです。上記の2番目のソリューションをすべてのケースに適用できます。それらをまったく分離しない方が速いかもしれません。

しかし、最初にそれらのFileInputStreamsの周りにBufferedInputStreamsを追加しました。

于 2012-10-28T20:59:08.837 に答える
1

このwhileループは機能しません:

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);
}

file1とfile2を読むこともあれば、4つのファイルすべてを読むこともあるからです。

もう1つのポイント:4つのファイルすべてを読み取るoと、設定されていないか、前のラウンドの値があります。cこれは、file1とfile2のみを読み取る場合にも当てはまります。したがって、これを修正するには、常に4つのファイルすべてを読み取る必要があります。そうすれば、ループのパフォーマンスはそれほど重要ではなくなります。

于 2012-10-28T21:08:23.440 に答える