ZIP圧縮し辛いファイルを求めて
ちなみに16進Champernowne定数では駄目だった.ZIP圧縮できてしまった.考えてみれば例えば "123" という文字列が "123", "1123", "2123", ... "10123", ... という具合に無限回出現するから,そこが圧縮できてしまうのかな.
次はとりあえず円周率10000桁とかどっかから拾ってきて試してみよう.(多分,乱数列でいいんだろうけど
ちなみにヘッダ長が固定らしく(?)十分に短い(数bytesの)ファイルでも圧縮結果は一律に150 bytesを超えてしまうが,そういうのはちょっとね.
- Wikipedia:"ZIP (ファイルフォーマット)"
- http://www.marguerite.jp/Nihongo/Labo/Image/Deflate.html デフレート圧縮(LZ77圧縮)処理の概要 - ウェブで用いられる画像形式。
上のページのLZ77アルゴリズム解説によれば "sliding window" の幅が32,768 = 2^15であり,つまり2^15文字より離れた重複パターンのペアを探すことはしないらしい.文字すなわち1 byteのデータには2^8 = 256通りあるので,2文字の文字列を全通り作って並べれば2*(2^8)^2 = 2^17 = 131072文字の文字列ができて "window" を十分埋め尽くせる.重複パターンとしては3文字以上のみを探すのでその中に一対の重複パターンも存在しない.つまりLZ77では圧縮できない.
次のHuffman符号化だが,何をアルファベットとするのかまだ理解できない.今日はここまでだな.でも16進Champernowne定数でいいと思うんだけどなぁ... いや,2^15までカウントしたらまた0に戻ればいいのか?(ついでに桁も固定で
nodakai@co:~$ i=16; while [ $i -lt 10000000 ]; do ruby -e "$i.times{|i| printf('%x',i)}" | xxd -r -p > ch$i.dat; i=$((i*16)); done nodakai@co:~$ i=16; while [ $i -lt 10000000 ]; do zip ch$i.zip ch$i.dat; i=$((i*16)); done adding: ch16.dat (stored 0%) adding: ch256.dat (stored 0%) adding: ch4096.dat (deflated 1%) adding: ch65536.dat (deflated 5%) adding: ch1048576.dat (deflated 14%) nodakai@co:~$ ll -rS ch* -rw-r--r-- 1 nodakai nodakai 8 2008-01-28 01:11 ch16.dat -rw-r--r-- 1 nodakai nodakai 156 2008-01-28 01:11 ch16.zip -rw-r--r-- 1 nodakai nodakai 248 2008-01-28 01:11 ch256.dat -rw-r--r-- 1 nodakai nodakai 398 2008-01-28 01:11 ch256.zip -rw-r--r-- 1 nodakai nodakai 6008 2008-01-28 01:11 ch4096.dat -rw-r--r-- 1 nodakai nodakai 6118 2008-01-28 01:11 ch4096.zip -rw-r--r-- 1 nodakai nodakai 122979 2008-01-28 01:11 ch65536.zip -rw-r--r-- 1 nodakai nodakai 128888 2008-01-28 01:11 ch65536.dat -rw-r--r-- 1 nodakai nodakai 2231232 2008-01-28 01:11 ch1048576.zip -rw-r--r-- 1 nodakai nodakai 2586488 2008-01-28 01:11 ch1048576.dat nodakai@co:~$ xxd ch256.dat 0000000: 0123 4567 89ab cdef 1011 1213 1415 1617 .#Eg............ 0000010: 1819 1a1b 1c1d 1e1f 2021 2223 2425 2627 ........ !"#$%&' 0000020: 2829 2a2b 2c2d 2e2f 3031 3233 3435 3637 ()*+,-./01234567 0000030: 3839 3a3b 3c3d 3e3f 4041 4243 4445 4647 89:;<=>?@ABCDEFG 0000040: 4849 4a4b 4c4d 4e4f 5051 5253 5455 5657 HIJKLMNOPQRSTUVW 0000050: 5859 5a5b 5c5d 5e5f 6061 6263 6465 6667 XYZ[\]^_`abcdefg 0000060: 6869 6a6b 6c6d 6e6f 7071 7273 7475 7677 hijklmnopqrstuvw 0000070: 7879 7a7b 7c7d 7e7f 8081 8283 8485 8687 xyz{|}~......... 0000080: 8889 8a8b 8c8d 8e8f 9091 9293 9495 9697 ................ 0000090: 9899 9a9b 9c9d 9e9f a0a1 a2a3 a4a5 a6a7 ................ 00000a0: a8a9 aaab acad aeaf b0b1 b2b3 b4b5 b6b7 ................ 00000b0: b8b9 babb bcbd bebf c0c1 c2c3 c4c5 c6c7 ................ 00000c0: c8c9 cacb cccd cecf d0d1 d2d3 d4d5 d6d7 ................ 00000d0: d8d9 dadb dcdd dedf e0e1 e2e3 e4e5 e6e7 ................ 00000e0: e8e9 eaeb eced eeef f0f1 f2f3 f4f5 f6f7 ................ 00000f0: f8f9 fafb fcfd feff ........