英大文字からなる文字列に対して、次の 種類の操作を考える。
- 挿入: 好きな位置に 文字を挿入する(コスト )
- 削除: 文字を削除する(コスト )
- 置換: 文字を別の 文字に置き換える(コスト )
これらの操作をくり返して文字列 を文字列 に変換するとき、かかるコストの合計の最小値(重み付き編集距離)を求めよ。
の表を埋めて、2 つの文字列の(重み付き)編集距離を求められる
編集距離は、文字列 を文字列 に作り替えるのに必要な「削除・挿入・置換」の最小コストです。各操作のコストを と決めておくと、2 次元の表を左上から順に埋めるだけで求められます。スペル修正の候補選び、DNA 配列の比較、ファイルの差分表示など、2 つの列がどれだけ似ているかを数値で測る場面で使います。
を に作り替える方法は、次のような「対応づけ」で表せます。 の各文字は、削除されるか、 のどれか 1 文字に対応づけられます。対応づけは左から右への順序を保ちます。 の文字のうち対応相手のないものは、挿入された文字です。対応づけた 2 文字が等しければコストは 、異なれば置換としてコスト がかかります。コストはすべて 以上とします。このような対応づけのコスト合計の最小値が編集距離です。
そこで を「先頭 文字 を先頭 文字 に作り替える最小コスト」と定めます。最適な作り替えで、末尾の文字 と がどう扱われるかは次の 3 通りしかありません。(1) を削除する。残りは なので 。(2) を挿入する。残りは なので 。(3) と を対応づける。。ここで は、 なら 、 なら を表す記号です。
どの場合も、残りの部分は最小コストで作り替えるのが最善です(もっと安い方法があれば、それに取り替えて全体も安くできるから)。よって 3 通りの最小値をとれば になります。これは硬貨の問題で「最後に使う硬貨 」で場合分けして としたのと同じ考え方で、「最後の操作」で場合分けしています。小さい から順に埋めれば、右辺の値はいつもすでに求まっています。
を縦(行 )、 を横(列 )に並べ、 の表を用意する。
0 行目と 0 列目を埋める。空文字列から を作るには挿入のみなので 。 を空にするには削除のみなので 。
残りのマスを、上の行から順に、各行は左から右へ埋める。。上のマスからは削除、左のマスからは挿入、左上のマスからは一致または置換。
右下のマス が から への編集距離である。
削除のコストを 、挿入のコストを 、置換のコストを とする。文字列 を文字列 に作り替える編集距離を求めよ。
【手順1】 は で 、 は で である。 の表を作る。
【手順2】 より 0 行目は 。 より 0 列目は 。
【手順3】漸化式で埋める。 の中は(上, 左, 左上一致なら ・不一致なら )の順に書く。
1 行目():
2 行目():
は で一致なので
3 行目():
は で一致なので
【手順4】 が編集距離である。実際、先頭の を削除し(コスト 1)、末尾に を挿入すれば(コスト 1)、 とコスト 2 で作り替えられる。
答え:
0 行目・0 列目をすべて にしてしまう誤り。正しくは 、 である。空文字列との間でも、文字数分の挿入や削除が必要になる。
文字が一致しているのに置換コストを足してしまう誤り(例: でも とする)。正しくは、一致なら である。
削除と挿入の向きを取り違える誤り。上のマス から来るのは の削除で 、左のマス から来るのは の挿入で である。 のときに逆にすると、 の距離を計算したことになり、答えが変わる。
答えとして最終行の最小値や表全体の最小値を取ってしまう誤り。正しくは 全体を 全体に作り替えるコストなので、右下の だけが答えである。
この説明は AI が書き、別の AI が例題を独立に解いて答えを確かめ、説明を一歩ずつ査読しました。
英大文字からなる文字列に対して、次の 種類の操作を考える。
これらの操作をくり返して文字列 を文字列 に変換するとき、かかるコストの合計の最小値(重み付き編集距離)を求めよ。
文字 からなる文字列に対して、次の 種類の操作を考える。
これらの操作をくり返して、文字列 を文字列 に変換する。かかるコストの合計の最小値(重み付き編集距離)を求めよ。
文字 からなる文字列(DNA 配列)に対して、次の 種類の操作を考える。
操作をくり返して文字列 を文字列 に変換するとき、使った操作のコストの合計の最小値を、 から への重み付き編集距離という。
、 のとき、 から への重み付き編集距離を求めよ。
英大文字からなる文字列に対して、次の 種類の操作を考える。
どの操作も 回につきコスト とする。文字列 を文字列 に変えるのに必要な操作の回数の最小値を、 と の編集距離という。
文字列 と の編集距離を求めよ。
英大文字からなる文字列に対して、次の 種類の操作を考える。
操作を何回か行って文字列 を文字列 に変えるとき、使った操作のコストの合計の最小値を と書く。
のとき、 を求めよ。
文字列 に次の 種類の操作をくり返し行って、文字列 に変換することを考える。
操作のコストの合計の最小値を、 から への重み付き編集距離という。
のとき、 から への重み付き編集距離を求めよ。
有限集合 をアルファベットとし、 の元を並べた有限列を文字列という。文字列 の部分列とは、添字 を選んで得られる文字列 ( のときは空列)のことである。
長さ の文字列 と長さ の文字列 ( は 0 以上の整数)に対し、
- を、 と の共通部分列の長さの最大値(最長共通部分列の長さ)、
- を、「文字列の任意の位置にある 1 文字を削除する」操作と「文字列の任意の位置に の 1 文字を挿入する」操作だけを繰り返して を に変換するときの、操作回数の最小値
と定める(置換の操作は許さない)。このとき
が成り立つことを証明せよ。