アルゴリズムと計算量の問題
文字列 に次の 種類の操作をくり返し行って、文字列 に変換することを考える。
- 挿入: 任意の位置に 文字を挿入する。コストは
- 削除: 文字を削除する。コストは
- 置換: 文字を別の 文字に置き換える。コストは
操作のコストの合計の最小値を、 から への重み付き編集距離という。
のとき、 から への重み付き編集距離を求めよ。
この問題で使うもの
この問題を解けるようになるまで(3 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
一覧で見る(前提が先)
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
置換のコスト と、「削除 挿入」のコストを比べてみよう。最適な変換で使う操作の種類が絞れる。
ヒント 2
挿入と削除だけを使うとき、削除されずに残る文字は と の共通部分列になる。コストは ( は残る文字数)と表せる。
ヒント 3
最長共通部分列の長さ を、 なら 、そうでなければ で表を埋めて求めよう。 の最初の 文字 と 全体の LCS の長さは になる。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
置換を使わなくてよいこと. 置換 回(コスト )は、その文字の削除と新しい文字の挿入(コスト )で置き換えられ、コストが真に下がる。したがって最適な変換は挿入と削除だけからなるとしてよい。
挿入・削除だけの場合のコスト. 挿入と削除だけで を に変えるとき、 のうち削除されずに残る文字は、順序を保ったまま の中に現れるので、 と の共通部分列をなす。残る文字数を とすると、削除は 回、挿入は 回必要で、逆に長さ の共通部分列があればこの回数で変換できる。よって
であり、(最長共通部分列の長さ)を動的計画法で求めればよい。
LCS の動的計画法. , とし、 を と の LCS の長さとする。 で
である。表を埋めると(行が の文字、列が の文字 )
となり、 である。実際、例えば ( の第 文字、 の第 文字)や は長さ の共通部分列である。
答え.
具体的には、共通部分列 を残し、 の第 文字 の 文字を削除して にし、そこへ の第 文字にあたる の 文字を対応する位置に挿入すると
となり、コスト で変換できる。
別解
置換のコストは で、削除 回と挿入 回のコストの和 より大きい。よって置換は使わないとしてよく、操作は挿入と削除だけである。このとき、残す文字(共通部分列)の長さを とすると、コストは となる。したがって は と の最長共通部分列(LCS)の長さをとればよい。
LCS の長さを動的計画法で求める。 の先頭 文字と の先頭 文字の LCS の長さを とする。 の順に並べると、
- (C):
- (A):
- (T):
- (G):
- (A):
- (C):
- (T):
よって である。
検算: 共通部分列 は の 文字目、 の 文字目にあり、長さ の共通部分列が実際に存在する。 から残りの 文字(A,T,A)を削除し、 の残りの 文字(A,T,A,G)を挿入するとコストは になる。
コストは 。