2011-01-17 8 views
21

具体的には、どのようなプログラムがあり、最も高い圧縮率がありますか?私はグーグルでそれを試みたが、それは経験が検索結果よりも勝っていると思われるので、私は尋ねる。達成できるランダムバイナリデータの最適なファイル圧縮は何ですか?

+21

真にランダムなデータファイルを解凍しながら、できません圧縮される。 ;-)より役立つ答えは長くなります:圧縮されるデータのプロパティは何ですか? (サウンド、画像、ビデオ、バイナリ実行ファイルなど)あなたは情報の損失を許容することができますか? – Throwback1986

+0

例として、lzw(つまりgif)形式の圧縮では、写真のファイルサイズとjpeg圧縮が低下しません。一方、漫画のような "人工的な"画像のjpeg圧縮は、画質の顕著な低下を招きます。 – Throwback1986

+0

ランダムなバイナリデータはどのような形式であるかがはっきりしています。 – DieLaughing

答えて

47

ファイルサイズをビットに対して正確に指定できる場合、任意のファイルサイズNに対して、正確にはNビット以下の2 ^(N + 1)-1個のファイルが存在する可能性があります。サイズXのファイルをより小さいサイズYにマップするには、サイズY以下のファイルをサイズX以上のファイルにマップする必要があります。ロスレス圧縮が機能する唯一の方法は、ある可能性のあるファイルが他のファイルよりも可能性が高いと識別できるかどうかです。そのシナリオでは、可能性の高いファイルが縮小され、その可能性の低いファイルは増加します。

単純な例として、ビットがランダムで独立しているファイルを無損失で保存したいとしますが、ビットの50%が設定されているのではなく、33%のみが保存されているとします。そのようなファイルを圧縮するには、ビットの各ペアを取り、両方のビットがクリアであれば "0"を書き、第1ビットがセットされていれば "10"、第2ビットがセットされていれば "110"両方のビットがセットされていれば "111"となる。その効果は、ビットの各対が時間の1ビット44%、時間の2ビット22%、および時間の3ビット33%になることである。いくつかのデータ列は成長しますが、他のデータ列は縮小します。確率分布が予想どおりになった場合、収縮したペア数は成長する人数を上回ります(4/9ファイルは少し小さくなりますが、2/9は同じままになり、3/9は大きくなるためペアがオンになります)。平均は1/9ビット縮小し、ファイルは平均で1/18に縮小します[1/9数字はペアあたりのビット数であるため)。

実際にビットが50%の分布を持つ場合、ペアの25%のみが1ビットになり、25%は2ビットに留まり、50%は3ビットになります。したがって、ビットの25%が縮小し、50%が増加するため、平均でペアが25%、ファイルが12.5%増加します。ブレーク・イーブン・ポイントは、設定されているビットの約38.2%(2つのゴールデン・ミディアム)であり、ビット・ペアの38.2%が縮小し、同じ割合が増加する。

+2

私はそれを取ることは、コルモゴロフの複雑さの簡単な説明です。悪くない。 – DieLaughing

+0

もっと詳しい説明は多くの読者の目を曇らせる傾向があります。一度に2ビットを1〜3の出力ビットに圧縮するアプローチは簡単ですが、チャレンジの性質をかなりよく伝えていると思います。 1-3の入力ビットを2つの出力ビットに圧縮することは別のアプローチである。 (000,001,01,1)、関連する確率を計算することはより困難になる。 – supercat

+0

「なぜ」圧縮の優れた説明です。私はいつも眼鏡の犠牲者であった。 +1 –

8

普遍的に最良の圧縮アルゴリズムはありません。異なるデータを扱うために、異なるアルゴリズムが発明されています。

たとえばJPEG圧縮では、画像の赤が0xFFまたは0xFE(通常)の場合はあまり重要ではないので、画像をかなり圧縮できます。ただし、テキストドキュメントを圧縮しようとすると、このような変更は悲惨です。

また、同じ種類のデータを扱うように設計された2つの圧縮アルゴリズムの間でも、結果はデー​​タによって異なります。

例:時にはgzipを使用するtarballが小さく、bzip tarballを使用することがより小さいことがあります。

最後に、十分な長さの本当にランダムなデータの場合、データは元のデータとほとんど同じサイズ(またはそれ以上)になる可能性があります。

+0

普遍的に最良の圧縮アルゴリズムが1つあります。私は、同じ圧縮率の複数のアルゴリズムがベストのために結びつけられていない限り、ロジックが真であることを要求すると思います。 – DieLaughing

+0

実際には、特定のタイプのデータに対して最良の圧縮率のために "結び付いている"と考えられる多くの方法があります。また、これらのタイプのデータの一般的なパフォーマンスよりも優れた特定のタイプのデータに特化した多くの方法メソッド(オーディオ、画像、ムービーなど)。あなたは、あなたのデータについてどのような前提ができるのかを判断する必要がありますが、通常はその前提がより多いため、その特定のタイプのデータの圧縮率が高くなります。 – helloworld922

1

ファイルアーカイバ7zは現在、最も圧縮率の高い若い圧縮アルゴリズムであるLZMA(Lempel Ziv Markow Algorithm)を使用しています(Linux Compression Comparison参照)。

高い圧縮率の横にあるもう一つの利点:

  • 速い展開、約10
  • 圧縮よりも早く20倍に小さなメモリフットプリント
+1

LZMAは実際にランダムなデータを大きくし、小さくはない辞書コーダーなので、これはまったく答えません! – jleahy

+2

'dd if =/dev/stdoutの/ dev/urandom bs = 1024 count = 1024 | lzma -c - | wc -c'は1048576バイト、1062936を出力します。これは1.3%の増加です。それはランダム性のために変わるでしょうが、その周りの数字を期待するべきです。 – jleahy

+0

ランダムなデータを圧縮できないという科学的または数学的な証拠はありますか? バイトのブロックを考えると非常に奇妙に思える私には、単純な乗算や、次のような単純な乗算や合計の形に等しいかもしれません。 (x^y)+ z または - z 確かにいくつかの数字のために働くだろうか? –

関連する問題