「Zlib は約 4 分の 1 に縮小します。」100K のファイルがマイナス300K を占めるようになったことを意味します。それはどの定義から見てもかなり印象的です:-)。75%、つまり元のサイズの 1/4 に縮小することを意味していると思います。
最適化された圧縮の 1 つの可能性は次のとおりです (32 ビットの整数と、要素ごとに変化する最大 3 ビットを想定しています)。
- 最初の整数 (32 ビット) を出力します。
- ビット変化数を出力します(n=0~3、2ビット)。
- n ビット指定子 (0-31、各 5 ビット) を出力します。
この圧縮の最悪のケースは、元のサイズの 17/32 (46.875% 圧縮) に向かう傾向があるすべての整数 (2+5+5+5 ビット) で 3 ビットの変更です。
最初の整数は常に 32 ビットであるため、「傾向がある」と言いますが、まともなサイズの配列の場合、その最初の整数は無視できます。
最良のケースは、同一の整数のファイルです (すべての整数に対してビットの変更はなく、2 つのゼロ ビットのみ)。これは、元のサイズの 2/32 (93.75% 圧縮) になる傾向があります。
連続する整数ごとに平均2ビット異なる場合(一般的なケースであると言えます)、整数ごとに2 + 5 + 5ビットが得られ、12/32または62.5%の圧縮に向かう傾向があります。
あなたの損益分岐点(zlibが75%の圧縮を与える場合)は、整数あたり8ビットです。
- 単一ビットの変化 (2+5 = 7 ビット) : 遷移の 80%。
- ダブルビット変更 (2+5+5 = 12 ビット) : 遷移の 20%。
これは、これを価値のあるものにするために、平均が整数あたり 1.2 ビットの変更である必要があることを意味します。
私が見ることをお勧めするのは 7zip です - これには非常に自由なライセンスがあり、あなたのコードにリンクすることができます (ソースも利用できると思います)。
Windows プラットフォームでは WinZip よりもはるかに優れたパフォーマンスを発揮するため、 zlibよりもパフォーマンスが優れている可能性があります。