PHPで文字列圧縮と圧縮のお話
「PHPで文字列圧縮したい!」って思うことありませんか?
「配列だとオーバーヘッド激しすぎるんで、CSV文字列にしたけど、もっと圧縮しておきたい!」みたいな。
無いですか?まあ、念のため保険って事で…。
半分は、テスト的な要素を兼ねているけれど、試しにプログラムを組んでみました。
出力を見てもらうと分かりますが、ランダムな文字列では圧縮率が低くなります。
逆に、繰り返しが多い文字列では21%程度まで圧縮が出来ます。
1つの文字の繰り返しだけで構成された文字列では4%程度まで圧縮されます。
ちなみに、短い文字列ではかえって文字列が長くなります。
圧縮のお勉強をした人なら、この結果が当たり前だと言うことは分かると思います。
なぜなら、基本的に圧縮は「データの偏りを利用している」から。
圧縮の方法は様々ですが、一番有名なのはハフマン符号化で、出現回数の多い順に短い符を与えていき、出現回数が少ないほど長い符号が与えられるというもの。
こうすることで、出現回数の多いデータには短い符号が与えられるので、圧縮が可能になると言うわけです。
ですがそのためには、元に戻すための「辞書」が必要になります。長い文字列ほど「辞書」を持つことの効果が出るというわけです。
逆にある程度より短い文字列では、この「辞書」が付加される分だけ長くなってしまうというわけです。