entプログラムは「最適圧縮」をどのように計算しますか?

entプログラムは「最適圧縮」をどのように計算しますか?

これ耳鼻咽喉科プログラムをファイルで実行して、次の出力を提供できます。

エントロピー=バイトあたり4.731183ビット。

最適な圧縮は、この15731バイトのファイルのサイズを40%まで削減します。

15731サンプルのカイ二乗分布は235086.62であり、この値をランダムに超える回数は0.01%未満です。

データバイトの算術平均は87.3796(127.5 =ランダム)です。 Piのモンテカルロ値は4.000000000(誤差27.32%)です。系列相関係数は0.140065です(完全に相関しない= 0.0)。

プログラムは、「最適な圧縮」が何を達成できるかをどのように決定しますか?

私はgzipでさえこの推定値を超えることが多いことに気づきました。

ベストアンサー1

エントロピーは、ファイルに含まれる情報の多様性を提供し、つまりファイルに存在する固有値の数を表すと、最良の圧縮、より正確には最良のエンコーディングがその記憶領域を正確に使用することになります。

あなたの場合、ファイルの長さは現在15,731バイトですが、バイトあたり4.731183ビットを格納するため、合計4.731183×15,731ビットの情報が含まれます。つまり74,426.24ビットの情報または9,303.28バイト。最適な圧縮を使用すると、元のファイルの59.14%に対応する9,304バイトのファイルが生成されます。ファイル長を参照せずに同じ計算を実行できます。 4.733183 は 8 の 59.16% です。略式で表現すると(8 - 4.733183)は8の40.84%であり、実行された計算です。ent、パーセンテージを整数に切り捨てます。

           printf("Entropy = %f bits per %s.\n", ent, samp);
           printf("\nOptimum compression would reduce the size\n");
           printf("of this %lld %s file by %d percent.\n\n", totalc, samp,
            (short) ((100 * ((binary ? 1 : 8) - ent) /
                  (binary ? 1.0 : 8.0))));

実際の圧縮ツールは、繰り返しをより簡潔な方法で表現することによってこの問題を克服します。結果の比較

$ (printf %5000s; printf %5000s | tr ' ' '1') | ent
Entropy = 1.000000 bits per byte.

Optimum compression would reduce the size
of this 10000 byte file by 87 percent.

$ (printf %5000s; printf %5000s | tr ' ' '1') | gzip | wc -c
48

入力は多数のバイトで構成されていますが、2つの固有の値のみがあり、両方とも数字が同じであるため、エントロピーはバイトあたり1ビットです。ent入力をバイトごとに1ビットにエンコードできると思ったら、つまり8倍に減りました。gzipただし、これはスペースと数字の連続を表し、結果ファイルはgzipヘッダーを含めても208倍小さくなります。

おすすめ記事