View
2.660
Download
5
Category
Preview:
Citation preview
2013/04/14
圧縮アルゴリズムZopflikazoo04
!! ___|二ニー-、、;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:;:|;::;:;:;:;:;:;:;:;:;:;:;:;:l /rヽ三三三三三─--- 、;:;:;:;:;:;:;:|;:;:;:;:;:;:;:;:;:;:;:;:;:;l ',i ,-三三三三三、 _,.ニ、ー-、!;: --二‾彡′ ',、、ヾ三三'"‾‾ `ー-" ヾ-'" .〉′ ヽ ヽヾ三,' :::..,. --- 、 _,,..--、、,' `ー',ミミ ::.弋ラ''ー、 i'"ィ'之フ l /:l lミミ ::::.. 二フ́ l ヽ、.ノ ,' ,.--フ:::::| |,ミ l / /r-'":::::::::| |ヾ /__. l / _,. --"i .|::::::::::::::::::',.',. \ ⌒ヽ、,ノ /ヽ,_ " l ヽ:::::::::::::::::ヽヽ. \ _,_,.、〃 /l | ___,. -、 ',\\:::::::::::::::ヽ\ \ 、.‾⌒"‾/:::::| | ( ヽ-ゝ _i,.>-t--、 \\\;::::::::::::\\ `、.__ ‾́‾/::::::::::l | `''''フく _,. -ゝ┴-r-、 ヽ \`ー-、::::::ヽ ヽ ‾フフ::::::::::::::ノ ./ ,.-''"́ /‾,./́ ゝ_'ヲ `ー-二'-┴┴、__/-'-́二ー'".ノ / _,. く / ゝ_/‾| ‾`ー─--─-''"‾ / にニ'/,.、-t-┴―'''''ヽ / / .(_ヽ-'__,.⊥--t-⊥,,_ / / / ‾ ) ノ__'-ノ / / ゝニ---、- | / /-<_ ヽ |ヽ
Zopfli
✤ Googleが今年開発した圧縮アルゴリズム!
✤ zlib≒gzip≒zipと互換で、解凍は既存のもので可能!
✤ 圧縮率が3%~8%ほど改善される!
✤ ただし圧縮にかかる時間は数十倍~数百倍
_人人人人人_!> すごい <!‾Y^Y^Y^Y^‾
( ^o^) < Zopfli は gzip 互換なのに無慈悲な圧縮率!
!
( ˘⊖˘) 。o(待てよ、どういう仕組みになってるんだ…?)
!
|Google| ┗(☋` )┓三
!
( ◠‿◠ )☛ソースコードを読め。あとRFC1951もな。
!
▂▅▇█▓▒░('ω')░▒▓█▇▅▂うわあああああああ
Deflate
✤ zlibやgzipで使われてるアルゴリズムというか仕様!
✤ 要するにzip!
✤ 詳しくはRFC1951見て!
✤ アルゴリズムはLZ77を改良したLZSS + ハフマン符号
ふたつのポイント
✤ 良い感じにLZSS+Huffman符号化する!
✤ 良い感じにデータを分割する
LZSS(LZ77)
ABCDEFABCDEFABCDEF!!
↓!!
ABCDEF[6,6][12,6]!!
6文字戻って6文字コピー12文字戻って6文字コピー
それでいいかな?
ABCDEFABCDEFABCDEF!!
↓!!
ABCDEF[6,12]!!
より短い表現が可能(詳しくはRFC1951見て)
結構いろんな表記方法がある
✤ いろんな表記があるものの、解凍した結果は同じ!
✤ グリーディーにやっていってもあまり圧縮率は良くない!
✤ 遅延評価的なことをしてなるべく短くなるようにする(Lazy Maching)!
✤ 真面目にやろうとすると遅くなるので普通は適当にやっておく!
✤ 最適な表記を探すのはNP困難らしい
Huffman符号化も考えると
✤ A = 65 = 01000001, B = 01000010, C = 01000011, ...!
✤ A, B, Cしか出現しないなら A = 00, B = 01, C = 11 にしたほうがいい!
✤ 各文字の出現率も考えて可変符号にするとまた変わってくる!
✤ Aがよく出現するなら A=0, B=10, C=11 とかね!
✤ A=0, B=1, C=10 じゃダメ!!
✤ “A Fast and Space-Economical Algorithm for Length-Limited Coding ”
じゃあ結局どうすればいいの
✤ レベルを上げて物理で殴ればいい!
✤ いろんな条件を何度も試して一番良かった奴を採用する
BlockSplitter
✤ 各シンボル(文字)の出現率は場所によって異なると考えられる!
✤ テキストと画像を一緒に圧縮するときとか顕著
BlockSplitter
✤ ときどきHaffman符号のテーブルを変えたほうがいい!
✤ でも変更したら変更したテーブルを保存しなきゃいけない!
✤ つまり余計に容量を食う!
!
✤ というトレードオフがある
じゃあ結局どうすればいいの
✤ レベルを上げて物理で殴ればいい!
✤ いろんな条件を何度も試して一番良かった奴を採用する
まとめ
✤ LZSSは同じデータでも色々な表現方法がある!
✤ しかもHuffman符号化やブロックの都合もある!
✤ 色々な条件で圧縮してみて一番小さくなったものを採用!
✤ zopfliは圧縮するときに何回施行するかオプションで指定できる
おわり
✤ 最適な組み合わせをメタヒューリスティックな方法で求めたりしたら高速化できるんじゃね?(妄想)
Recommended