単純なテーブル参照を繰り返すことによりハフマンデコードする場合のデコードテーブルのサイズについて考えてみる。
2014-01-19 更新: 証明を詰めて結論が変わりました。
まず、ハフマン符号に対する仮定は以下の通りとする(Ut Video Codec Suite で使われているものと同一)
- シンボルは 8bit である。シンボル数 である。必ずしも 256 ではないのは、出現しないシンボルは存在しないものとして扱うからである。
- 符号語の長さの上限 は 24 とする。
- 長い符号語ほどゼロで始まる符号語を割り当てる。たとえば、符号語の長さの集合が 3, 3, 2, 1 の場合、000, 001, 01, 1 という符号語を割り当てる。
そして以下のようなアルゴリズムを考える(こちらは Ut Video Codec Suite で使われているものとは異なる)
符号列の先頭から m ビット見て、それでテーブルを lookup する。
- もし先頭の符号語の長さが m ビット以下であったら、対応するシンボルが lookup により分かるためそこでデコードは完了し、次のシンボルに移る。
- もし先頭の符号語が m ビットより長かったら、m ビットより長い符号語に共通の prefix の長さだけ読み飛ばし、また m ビット見て新たなテーブルを lookup する。以下繰り返し。
なお、m = 12 あたりを想定している。
さて、繰り返し回数 = テーブルの個数 の上限(あるいは上界)はいくつか、という事が気になる。
- 上限が十分に小さいのであれば、最初からその上限固定サイズの構造体を使うことができる。
- 上限が妥当に小さく大抵の場合は十分に小さいのであれば、とりあえず小さいテーブルを確保 (malloc) して必要に応じて拡張 (realloc) する方法を使うことができる。
- 上限が妥当ではない大きさになってしまう場合、あるいは繰り返し回数が有限にならない場合は、このアルゴリズム自体をあきらめる必要がある。
定式化
を各シンボルに対応する符号語の長さとする。 である。
m ビットより長い符号語に共通の prefix の長さが最大になるように符号語を割り当てているため、この prefix の長さ となる。 も m も整数なので、 とも書ける。(注:情報科学の分野なので単に log と書いたら底は2である)
なので、 である。つまり、 である。
なお、既に lookup を繰り返して q ビット読み飛ばしている状態にある場合、「q + m ビットより長い符号語に~」となるが、その場合 になるので、追加で読み飛ばすビット数の下界は同じ式で表すことができる。
今、 を想定しているので つまり である。 なので がテーブル数の上界となる。
なお、8bit シンボル, m=12 でテーブル数3だとテーブルサイズは 2^12 * 2 * 3 = 24KB となって、最近の Intel CPU の1次キャッシュのサイズに近くなる。しかし、ほとんどの場合は最初のテーブルだけにアクセスし、後ろのテーブルほどアクセスされる確率が極端に小さくなるため、デコードテーブルによってキャッシュが圧迫される心配はしなくてよい。
no comment untill now