アルゴリズムと計算量の問題
英大文字からなる文字列に対して、次の 種類の操作を考える。
- 挿入: 好きな位置に 文字を挿入する(コスト )
- 削除: 文字を削除する(コスト )
- 置換: 文字を別の 文字に置き換える(コスト )
操作を何回か行って文字列 を文字列 に変えるとき、使った操作のコストの合計の最小値を と書く。
のとき、 を求めよ。
この問題で使うもの
- 編集距離(説明と入口の問題)
この問題を解けるようになるまで(2 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
一覧で見る(前提が先)
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
の先頭 文字を の先頭 文字に変える最小コスト を考え、表を埋める動的計画法を使いましょう。
ヒント 2
( なら 、そうでなければ )、初期値は 、 です。
ヒント 3
表の途中では (B が一致し、R を A に置換)、、、 となります。残りは を計算するだけです。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
、 とし、 の先頭 文字を の先頭 文字に変える最小コストを とおく()。
漸化式 最適な操作列で、 の先頭 文字の最後の文字 と の先頭 文字の最後の文字 の扱いを考えると、次のどれかになる。
- を削除する:
- を挿入する:
- を に対応させる(同じ文字ならそのまま、異なれば置換): 。ただし のとき 、 のとき
よって
であり、初期値は (すべて削除)、(すべて挿入)である。
表の計算 行を の先頭 文字、列を の先頭 文字として、上の行から順に埋める。
| B | A | D | G | E | R | ||
|---|---|---|---|---|---|---|---|
| 0 | 2 | 4 | 6 | 8 | 10 | 12 | |
| B | 2 | 0 | 2 | 4 | 6 | 8 | 10 |
| R | 4 | 2 | 3 | 5 | 7 | 9 | 8 |
| I | 6 | 4 | 5 | 6 | 8 | 10 | 10 |
| D | 8 | 6 | 7 | 5 | 7 | 9 | 11 |
| G | 10 | 8 | 9 | 7 | 5 | 7 | 9 |
| E | 12 | 10 | 11 | 9 | 7 | 5 | 7 |
いくつかの成分の計算を示す。
- : なので 。
- : なので 。
- : なので 。
- : なので 。
- : なので 。
- : なので 。
したがって である。
最適な操作列の例 表をたどると、次の操作列が得られる。
1. を に置換(コスト ):
2. を削除(コスト ):
3. 末尾に を挿入(コスト ):
合計コストは である。なお、挿入と削除だけを使うと、最長共通部分列 (長さ )を残して削除 回・挿入 回が必要になり、コストは になる。置換 回が削除と挿入の組(コスト )より安いことが効いて、最小値は になる。
別解
重み付き編集距離の最小値を、アラインメント(対応づけ)で考える。
まず上界を求める。次の操作列で を に変えられる。
- B は一致するのでコスト
- R を A に置換する(コスト )
- I を削除する(コスト )
- D, G, E は一致するのでコスト
- 末尾に R を挿入する(コスト )
合計は である。
次に、これより小さくできないことを確かめる。
- 最長共通部分列は BDGE(長さ )である。
- BDGE を一致させる場合、X 側の余りは R, I で、Y 側の余りは A と、末尾の R である。
- B と D の間は、X 側が RI、Y 側が A である。コスト最小は置換と削除の組合せで である。
- E の後は、Y 側にだけ R がある。挿入で かかる。
- 合計は である。
- 置換が で、挿入と削除の和 より安いので、置換を使うのが有利である。ただし、一致が 文字より少ない対応づけは、余る文字が増えてコストが 以上になる。例えば B と E だけを一致させると、間の RIDG と ADG の対応づけに少なくとも かかる。
- 一致 BDGE を使わない場合も、 を下回る対応づけはない。
よって最小コストは である。