回 1-7 道 1 数と論理と計算量
ハフマン符号化は、
読み終えたらよく
この頁の流れ
データの
よく 出る 字を 短く すると、 なぜ縮むのか
よく
コンピュータの
この
ハフマン符号化は どう 符号を 決めるのか
ハフマン符号化は、
符号化とは、 字を 0 と 1 の 並びに 置き換えること
符号化は、
abracadabra には
| 字 | 回数 | 固定の長さ | ハフマン符号 |
|---|---|---|---|
| a | 5 | 000 | 0 |
| b | 2 | 001 | 110 |
| r | 2 | 010 | 111 |
| c | 1 | 011 | 100 |
| d | 1 | 100 | 101 |
右の
情報量は、 確からしさの低さ
情報量は、
表で
| 確率 | 情報量 |
|---|---|
| 1/2 | 1 ビット |
| 1/4 | 2 ビット |
| 1/8 | 3 ビット |
表が
情報量の
ハフマン木の作り方
ハフマン木は、
- 字ごとに
出る 回数を 数え、 それぞれを 1 つの葉にする - 回数の
一番少ない 2 つを 取り出し、 束ねて 1 つに する。 束の 回数は 2 つの合計 - 束が
1 つに なるまで、 2 を繰り返す - 根から
葉へ たどり、 左へ 進むと 0、 右へ 進むと 1 を 並べた ものを、 その字の 符号にする
abracadabra では、
次にheappop で
動かす 結んだ 2 つを 1 段ずつ出す
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
c 1 + d 1 = 2
b 2 + r 2 = 4
cd 2 + br 4 = 6
a 5 + cdbr 6 = 111
Huffman の
区切りが 無くても 読めるのは、 接頭語の 性質のおかげ
ハフマン符号は、
たとえば
動かして確かめる
まず、
動かす 字ごとの情報量とエントロピー
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
a 5 0.455 1.14
b 2 0.182 2.46
c 1 0.091 3.46
d 1 0.091 3.46
r 2 0.182 2.46
H 2.04
下限 22.45 回出る
次に、heapq は、
動かす ハフマン木を作り符号にする
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
a 0
b 110
c 100
d 101
r 111
01101110100010101101110
23 33 88
2.091符号の
最後に、
動かす 区切り無しで元に戻す
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
0 a
110 b
111 r
0 a
100 c
0 a
101 d
0 a
110 b
111 r
0 a
abracadabra1 ビットずつ足していき、
縮まないのは どんなときか
ハフマン符号化は
偏りが 無ければ、 エントロピーは 固定の 長さと同じ
4 種類の
動かす 偏りがあるときと無いとき
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
abcdabcdabcdabcd 2.0
aaaaaaaaaaaaabcd 0.993
aaaaaaaaaaaaaaaa 0.04 種類が
どんな 圧縮も、 全部を 縮める ことはできない
8 ビットの
動かす 縮めた先の数を数える
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
8 ビット 256
7 ビット以下 255長さ 0 の
縮まない データと、 縮んだ データを もう 一度縮める
Python の zlib は、
動かす zlib で縮むデータと縮まないデータ
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
1000 1011 1022
1200 29上の
崩れる
- どんな
データも 圧縮すれば 縮む、という 前提。 偏りの 無い データや、 圧縮済みの データは 縮まず、 少し増える - 圧縮した
長さは 秘密と 関係無い、という 前提。 中身の 偏りが 長さに 出るので、 長さから 中身を 当てられる ことがある (下の実例) - 小さい
ファイルは 展開しても 小さい、という 前提。 同じ 並びの 繰り返しは 極端に 縮むので、 小さい 圧縮ファイルが 展開すると 巨大に なることがある
仕事で どう 確かめるか
仕事では、
1 つ目は、zlib.compress で
2 つ目は、
3 つ目は、
関わる実例
圧縮した
TLS の 圧縮を 突いた CRIME CVE-2012-4929 (NVD の 公開 2012 年 9 月 15 日)
米国の
崩れた
よくある問い
ハフマン符号化は 可逆圧縮ですか
ハフマン符号化は
エントロピー符号化と ハフマン符号化の 違いは何ですか
エントロピー符号化は、
ハフマン符号化は どこで 使われていますか
ZIP やzlib が
情報量の ビットと、 データの 大きさの ビットは 同じですか
単位の
確認クイズ
答えだと
1 問目
ハフマン木を
2 問目
この
符号を足し合わせる
code = {"a": "0", "b": "10",
"c": "11"}
s = "aaab"
print(sum(len(code[ch])
for ch in s))3 問目
a を
4 問目
ZIP で
説明課題
次の
- よく
出る 字ほど 短い 符号に すると、 全体が縮む理由 - 偏りの
無い データが 縮まない理由
自分の
この回の 先の一歩
圧縮の
一次資料
どれも
- A Mathematical Theory of Communication (C. E. Shannon、
The Bell System Technical Journal 27 巻、 1948年7月と 10月、英語)。底を 2 に した ときの 単位を bits と 呼び、 その 呼び名が J. W. Tukey の 案である こと、 6 節で 不確かさの 量 (エントロピー) を 定めること - A Method for the Construction of Minimum-Redundancy Codes (D. A. Huffman、
Proceedings of the IRE 40 巻 9 号、 1952年9月、英語)。冗長さが 一番少ない 符号の作り方 - RFC 1951 DEFLATE Compressed Data Format Specification version 1.3 (IETF、
1996年5月、英語)。DEFLATE が LZ77 と ハフマン符号を 組み合わせる 可逆の 形式であること - zlib Compression compatible with gzip (Python 公式文書、英語)。
zlib.compressがgzip と 互換の 圧縮をすること - heapq Heap queue algorithm (Python 公式文書、英語)。
heappopが一番小さい 物を 取り出すこと - zipfile Work with ZIP archives (Python 公式文書、英語)。展開の
落とし穴として、 圧縮爆弾が ディスクを 使い切る おそれがあること - CVE-2012-4929 (米国 NIST の
NVD、英語)。TLS 1.2 以前で、 圧縮した データの 長さを 隠さずに 暗号に した ため、 長さの 違いから HTTP の 頭の 秘密を 当てられた こと (CRIME) - RFC 7457 Summarizing Known Attacks on TLS and DTLS (IETF、英語)。2.6 節で
CRIME を 圧縮を 突く 攻撃として 挙げていること
次へ
道 1 数と論理と計算量の回
- 1-12 進数と
16 進数桁の 重み、 変換、 表せる範囲頁で読む - 1-2文字コードと文字化けUnicode、
UTF-8、 Shift_JIS、BOM頁で読む - 1-3計算量を数えるBig-O、
ループの回数頁で読む - 1-4論理と真理値表AND、
OR、 NOT、 ド・モルガン準備中 - 1-5リトルエンディアンと
ビッグエンディアンバイトの 並び順、 ネットワーク、ファイル頁で読む - 1-6Base64 の仕組み64 字の
表、 = の 詰め物、 長さ 4/3頁で読む - 1-7情報量と
ハフマン符号化ビット、 確からしさ、圧縮この回 - 1-8チューリングマシンと停止問題テープ、
状態、 計算できない問題頁で読む
