アルゴリズムと計算量の問題
種類の文字 からなる長さ の文字列があり、各文字の出現回数は次のとおりである。
| 文字 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| 出現回数 |
この文字列を、次の貪欲法(ハフマン符号の構成法)で作った 進符号で符号化する。
- 各文字を、出現回数を重みとする 頂点だけの木とする。
- 木が 本以上ある間、重みが最も小さい木と 番目に小さい木を取り出し、それらを左右の子とする新しい根を作って 本の木にまとめる。新しい木の重みは つの木の重みの和とする(重みが等しい木が複数あるときは、どれを選んでもよい)。
- 最後に残った木で、根から各文字の葉までの道の各辺に、左の子へ進む辺は 、右の子へ進む辺は を割り当て、その道に沿って並べた の列をその文字の符号語とする。
文字列の各文字をその符号語に置き換えて並べたとき、得られる の列の長さ(ビット数)を求めよ。
この問題で使うもの
- 貪欲法が最適でない場合の判定(説明と入口の問題)
この問題を解けるようになるまで(2 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
一覧で見る(前提が先)
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
各文字の符号語の長さは、完成した木でのその文字の葉の深さに等しい。まず貪欲法の手順どおりに木を作ろう。
ヒント 2
ビット数 は、木をまとめるたびにできる新しい木の重みをすべて足したものに等しい。
ヒント 3
最初の 回のまとめで重み ()と ()の木ができ、残りの重みは になる。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
各文字の符号語の長さは、その文字の葉の深さ(根からの辺の数)に等しい。したがって求めるビット数は
である。
木の構成 重みの小さい 本を順にまとめていく。
1. 重み から (A)と (B)をまとめて重み の木を作る。残りは 。
2. (C)と重み の木 本をまとめて重み の木を作る(重み の木は D と、A・B をまとめた木の 本があり、どちらを選んでもよい)。残りは 。
3. と をまとめて重み 。残りは 。
4. と をまとめて重み 。残りは 。
5. と をまとめて重み 。これで 本の木になる。
ビット数の計算 各文字の出現回数は、その葉の祖先にあたる内部頂点(まとめるたびに作った根)それぞれの重みに 回ずつ足し込まれている。祖先の内部頂点の個数は葉の深さに等しいので、ビット数は、まとめるたびに作った新しい木の重みの和に等しい。
確認 手順 2 の選び方で木の形は 通りあるが、どちらも同じビット数になることを深さから直接確かめる。
(i) 手順 2 で C と D をまとめた場合:手順 3 で A・B の木(重み )と E がまとまり、手順 4 で C・D の木と F がまとまる。各文字の深さは次のとおり。
| 文字 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| 深さ |
(ii) 手順 2 で C と A・B の木をまとめた場合:手順 3 で D と E がまとまり、手順 4 で A・B・C の木(重み )と F がまとまる。各文字の深さは次のとおり。
| 文字 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| 深さ |
どちらの場合も となり、内部頂点の重みの和から求めた値と一致する。
よって答えは 。
別解
重み でハフマン法を実行する。
1. → 残り
2. → 残り
3. → 残り
4. → 残り
5.
符号化後の総ビット数は、各文字の(出現回数)×(符号長)の和で、これは併合で作った内部節点の重みの和に等しい: 。
検算(符号長): 2 手目で重み 7 の木は の木か D のどちらか。例えば と D(7) を併合した場合: 符号長は F:2, E:3, {A,B}(7):3 → A,B は 4, C:3, D:3 ... 実際に計算すると F:2(15×2=30)、E:3(30)、C:3(18)、D:3(21)、A:4(12)、B:4(16) で にならないため整理し直す。
正しくは、手順 2 で 6 と併合するのは未併合の D(7) か {A,B}(7) のどちらでもよい(等しい重み)。{A,B}(7) と 6 を併合した場合: ({A,B},C)=13 → 3 手目 7(D)+10(E)=17 → 4 手目 13+15=28 → 5 手目 17+28=45。符号長: F=2, ({A,B},C) は深さ 2 で C=3, A,B=4, D=3, E=3。ビット数: F 15×2=30、C 6×3=18、A 3×4=12、B 4×4=16、D 7×3=21、E 10×3=30 で 。
これは内部節点の和 110 と合わないので再確認する。木は 根(45) → 子 17 と 28。17=D+E なので D,E は深さ 2。28 = 13(({A,B},C)) + F(15) なので F は深さ 2、13 は深さ 2、C は深さ 3、{A,B}(7) は深さ 3、A,B は深さ 4。したがって D:2, E:2, F:2, C:3, A:4, B:4。ビット数 。上の 127 は深さの数え間違いだった。
よって総ビット数は 。