アルゴリズムと計算量の問題
英大文字からなる文字列に対して、次の 種類の操作を考える。
- 挿入: 好きな位置に 文字を挿入する(コスト )
- 削除: 文字を削除する(コスト )
- 置換: 文字を別の 文字に置き換える(コスト )
これらの操作をくり返して文字列 を文字列 に変換するとき、かかるコストの合計の最小値(重み付き編集距離)を求めよ。
この問題で使うもの
- 編集距離(説明と入口の問題)
この問題を解けるようになるまで(2 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
一覧で見る(前提が先)
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
編集距離の動的計画法を使う。 を「 の先頭 文字を の先頭 文字に変える最小コスト」として、 の表を埋める。
ヒント 2
、 とし、 で順に計算する。
ヒント 3
1 行目(T)は 、2 行目(E)は となる。3 行目(A)は まで求まる。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
、 とし、 を「 の先頭 文字を の先頭 文字に変換する最小コスト」と定める。コストは 、、 である。
手順 1(初期値) 空文字列にするには削除だけ、空文字列から作るには挿入だけを使うので
手順 2(漸化式) 最後の操作が削除・挿入・置換(一致なら )のどれかで場合を分けて
手順 3(表を埋める)
():
- (E):
- (A):
- (S):
- (T, 一致):
():
- (E, 一致):
- (A):
- (S):
- (T):
():
- (E):
- (A, 一致):
- (S):
- (T):
表にまとめると(行が 、列が )
手順 4(答え) 求める値は である。実際、先頭の T を削除(コスト )し、末尾に S と T を挿入(コスト )すれば合計 で TEA → EA → EAS → EAST と変換できる。
よって答えは 。
別解
重み付き編集距離を、アラインメント(対応のつけ方)で考えて最小コストを調べる。
まず、 の長さは 、 の長さは なので、挿入は少なくとも 回必要である。
最長共通部分列は (長さ )で、 を含む長さ 以上の共通部分列はない。
1. を対応させる場合: の先頭の T は対応先がないので削除する(コスト )。 の末尾の S, T は挿入する(コスト )。合計は 。
2. だけを対応させる場合: T の削除に 、A を S に置換して T を挿入するのに 、合計 以上になる。ここでは A→S 置換と T 挿入で 、A→A とせず削除・挿入にするとさらに増える。
3. を末尾の T に対応させる場合: Y の EAS を挿入し()、 の E, A を削除する()ので合計 。
4. 何も一致させない場合: 置換 回()と挿入 回()で合計 。
置換のコスト は削除と挿入の和 より小さいが、上の比較では 1 が最小である。
よって最小値は である。具体的な操作列は、TEA → (T を削除) EA → (S を挿入) EAS → (T を挿入) EAST で、コストは 。
検算として、長さの差から挿入が 回以上必要で、これだけでは変換できない(T が余る)ので、最低でもコスト に加えて T の処理(削除なら 、置換でも )が必要となる。したがって下限は であるが、置換で T を使う場合は他の文字の整合が崩れて上の場合分けのとおり を下回れない。