アルゴリズムと計算量の問題
英大文字からなる文字列に対して、次の 種類の操作を考える。
- 挿入: 好きな位置に 文字を挿入する
- 削除: 文字を削除する
- 置換: 文字を別の 文字に置き換える
どの操作も 回につきコスト とする。文字列 を文字列 に変えるのに必要な操作の回数の最小値を、 と の編集距離という。
文字列 と の編集距離を求めよ。
この問題で使うもの
- 編集距離(説明と入口の問題)
この問題を解けるようになるまで(2 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
一覧で見る(前提が先)
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
の先頭 文字を の先頭 文字に変える最小回数 を考え、小さい から順に表を埋めていきましょう。
ヒント 2
最後の操作は「削除」「挿入」「置換(または文字が等しくてそのまま)」のどれかなので、( なら 、そうでなければ )が成り立ちます。
ヒント 3
, から始めると、1 行目(P の行)は 、2 行目(A の行)は になります。同じように最後の行まで計算しましょう。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
の先頭 文字と の先頭 文字の編集距離を とする(, )。 の 文字目を 、 の 文字目を と書く。
最後の文字に注目すると、最後の操作は「 を削除」「 を挿入」「 を に合わせる(等しければコスト 、異なれば置換でコスト )」のどれかなので、
が成り立つ。ここで なら 、 なら である。
この漸化式で、 の小さい行から順に表を埋める(行が の文字、列が の文字)。
| D | R | A | P | E | D | ||
|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | |
| P | 1 | 1 | 2 | 3 | 3 | 4 | 5 |
| A | 2 | 2 | 2 | 2 | 3 | 4 | 5 |
| R | 3 | 3 | 2 | 3 | 3 | 4 | 5 |
| A | 4 | 4 | 3 | 2 | 3 | 4 | 5 |
| D | 5 | 4 | 4 | 3 | 3 | 4 | 4 |
| E | 6 | 5 | 5 | 4 | 4 | 3 | 4 |
いくつか計算を確かめておく。
- : なので 。ほかの候補 , より小さいので
- : なので
- : なので
- : なので候補は , , で、
- : なので
- : なので候補は , , で、
よって編集距離は である。
実際、表をたどると次の 回の操作で変換できる。
答えは である。
別解
動的計画法で編集距離表 ( の先頭 文字と の先頭 文字の編集距離)を作る。漸化式は 、初期値は 。
DRAPED の列 () に対し、各行は次のようになる。
- 空 : 0 1 2 3 4 5 6
- P : 1 1 2 3 3 4 5
- A : 2 2 2 2 3 4 5
- R : 3 3 2 3 3 4 5
- A : 4 4 3 2 3 4 5
- D : 5 4 4 3 3 4 4
- E : 6 5 5 4 4 3 4
右下の値より、編集距離は 。
検算(具体的な操作列): PARADE から、P を D に置換して DARADE、A を R に置換して DRRADE、R を A に置換して DRAADE、続く A を P に置換して DRAPDE、……とすると 5 回以上かかってしまうので別の経路を使う。PARADE の先頭の P を削除して ARADE、R の前に D を挿入して... とするのも遠回りである。表の経路をたどると、PARADE → (P→D) DARADE → (A→R) DRRADE ではなく、アラインメント P-D, A-R, R-A, A-P, D-E, E-D の 6 置換は 6 回で、これより良い経路として、先頭に D を挿入して DPARADE、P を R に置換して DRARADE、A を残し R を P に置換して DRAPADE、A を削除して DRPDE... のように調整しても 4 に達する経路が表の逆たどりで存在する。表の逆たどり: は ではなく からの挿入(D の挿入)。 は E の一致で 、 は P に関して D の削除 ( から)、 は からの P の挿入、 は A の一致で 、 は R の一致で 、 は からの A の削除、 は P→D の置換。すなわち、P→D(置換)、A を削除、R を残す、A を残す、P を挿入、D を削除、E を残す、D を挿入、で PARADE → DRAPED となり、操作は置換 1 + 削除 2 + 挿入 2 の合計 5 ではなく、削除 A・削除 D・挿入 P・挿入 D・置換 P→D の 5 回に見える。これは表の経路と食い違うので表を再確認する。
再確認: 先頭の A()を削除する代わりに の A を使うと、PARADE の P→D(置換)、A→R(置換)、R→A(置換)、A→P(置換)と並べるより、「P→D、A 削除」ではなく次の 4 回の経路がある。PARADE の P を D に置換して DARADE。A を削除して DRADE。A の後に P を挿入して DRAPDE。D を E に置換して DRAPEE ではなく、DRAPDE の D を残して末尾 E の前の D を削除し DRAPE、末尾に D を挿入して DRAPED。ここまでの操作は置換 1 + 削除 1 + 挿入 1 + 削除 1 + 挿入 1 = 5 であり、DRAPDE の D→E の置換と E→D の置換の 2 回でも 5 回になる。
そこでさらに丁寧に表を検算すると、最終行の値 である。(EとDPARAの比較ではなく、PARADE と DRAPE の距離)を具体的に作る: PARADE → DRAPE は、P→D 置換、A 削除、R 残す、A 残す、D→P 置換、E 残す、の 3 回。確かに 3 回で DRAPE が得られる(DARADE→DRADE ではなく、PARADE の P→D で DARADE、2 文字目の A を削除して DRADE、D→P で DRAPE)。さらに末尾に D を挿入して DRAPED。合計 4 回。
よって編集距離は 。下界は表の最小値より成り立つ。