アルゴリズムと計算量の問題
種類の文字 からなる長さ の文字列があり、各文字の出現回数は次の表のとおりである。
| 文字 | A | B | C | D | E | F | G | H |
|---|---|---|---|---|---|---|---|---|
| 出現回数 |
各文字に、 種類の記号 からなる長さ 以上の符号語を つずつ割り当てる。ただし、異なる文字の符号語は異なり、どの符号語も他の符号語の先頭部分(接頭語)になっていない(語頭符号である)ものとする。文字列の各文字をその符号語に置きかえてつなげたとき、得られる記号列の長さ(記号の個数)の最小値を求めよ。
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
語頭符号を、各節点の子が高々 3 個の木の葉に文字を置いたものとみなし、ハフマン符号の貪欲法(小さいものから合併)を 3 分木に拡張して考えましょう。
ヒント 2
3 個ずつ合併すると個数は 2 ずつ減るので、最後に 1 個になるには葉の数が奇数でなければなりません。文字は 8 個なので、出現回数 0 のダミーを 1 個加えます。記号列の長さは合併で作った節点の重みの総和です。
ヒント 3
重み 0, 4, 6, 8, 10, 12, 15, 20, 25 から始めて、最初の合併は 0+4+6=10、次は 8+10+10=28 です。残りの合併を続けて、作った重みをすべて足しましょう。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
語頭符号は、各節点が高々 個の子をもつ根付き木( 分木)の葉に文字を対応させたものと同じである。文字の深さがその符号語の長さなので、記号列の長さは であり、これは木の内部節点ごとに「その節点の下にある葉の出現回数の合計」を足し合わせたものに等しい。
ダミーの追加. 最適な木では、内部節点はすべて 個の子をもつとしてよい(空きの枠は最も深い所に寄せられる)。 個の子をもつ内部節点だけからなる木の葉の数は、内部節点が 個増えるごとに 増えるので奇数である。文字は 個(偶数)なので、出現回数 のダミー文字を 個加えて 個の葉にする。こうすると、 進のハフマン法(出現回数の小さい 個を合併することを繰り返す貪欲法)で最適な符号が得られる。
合併の手順. 初期の重み:
- →
- →
- →
- → 終了
合併で作られた節点の重みの和が記号列の長さなので
確認(深さから計算). 根の子は 、重み の節点、重み の節点である。重み の節点の子は 、重み の節点の子は と重み の節点、重み の節点の子は とダミーである。よって符号語の長さは が 、 が 、 が で
したがって最小値は である。
別解
3 元符号の最適語頭符号はハフマン法で求まる。3 元ハフマン法では葉の個数が奇数である必要があるので、出現回数 0 の架空の文字を 1 つ加えて 9 個にする。
重み: 25, 20, 15, 12, 10, 8, 6, 4, 0
1. 小さい 3 つ 0, 4, 6 を併合して 10 になる。
2. 8, 10, 10 を併合して 28 になる。
3. 12, 15, 20 を併合して 47 になる。
4. 25, 28, 47 を併合して 100 になる。
符号長の合計は、併合で作った節点の重みの和に等しい。
検算として深さから数える。A は深さ 1、C, D, B は深さ 2、F, E も深さ 2、G, H は深さ 3 である。
したがって最小値は 185 である。