算術符号:区間を刻んで1点に
文字列を [0,1) の区間に閉じ込め、記号ごとに区間を入れ子で狭めて、最後に残った区間内の1つの小数で全体を表します。
入力文字列(記号 A・B・C のみ。最大8文字)
例:BACA / AAB / CAB。A・B・C 以外の文字は自動で除かれます。
記号の確率(合計が 1 になるよう自動正規化)
A
0.50
B
0.33
C
0.17
アニメ表示する記号数(区間ズームの深さ)
4 / 4
現在の区間 [low, high)
—
区間の幅 = 出現確率
—
代表する小数(符号)
—
理論ビット数 −log₂(幅)
—
この1文字での区間分割
区間ズーム(上から下へ入れ子で拡大)
算術符号では、文字列全体を 1つの数 で表します。最初は
たとえば確率 A=0.5, B=0.3, C=0.2 なら、区間を
最後に残った狭い区間の中のどれか1つの小数を選べば、それが文字列全体の符号です。 区間の幅 = その文字列の出現確率であり、確率が低い(珍しい)文字列ほど区間が狭く、必要なビット数が増えます。
[0, 1) という区間から始め、
記号を1文字読むたびに、その記号の確率に応じて区間を入れ子に狭めていきます。たとえば確率 A=0.5, B=0.3, C=0.2 なら、区間を
A:[0,0.5) / B:[0.5,0.8) / C:[0.8,1) に分け、
最初の文字が B なら次は [0.5,0.8) の中を同じ比で再分割……と繰り返します。最後に残った狭い区間の中のどれか1つの小数を選べば、それが文字列全体の符号です。 区間の幅 = その文字列の出現確率であり、確率が低い(珍しい)文字列ほど区間が狭く、必要なビット数が増えます。
いま何が起きている?
ここがポイント
- 区間の幅 = 文字列の確率 ── 各記号の確率を掛け合わせた値が、最終区間の幅になる。
- 狭いほど高コスト ── 区間幅 w を表すには約
−log₂(w)ビット必要。珍しい文字列ほど符号は長い。 - 確率を変えると分割比が変わる ── 頻出記号の確率を上げると、その記号で区間があまり狭まらず符号が短くなる。
- 復号は逆ズーム ── 符号の小数がどの小区間に入るかを順にたどれば、元の文字列が一意に復元できる。