おひさしぶりんこ。
今日は動的計画法(DP)で編集距離(Edit distance)を計算します。
計算結果の記録と漸化式による次の値の計算がDPの要点だと思うので、編集距離の計算を例にこれを見ていきます。
編集距離とは
2つの文字列が与えられたとき、一方の文字列に挿入(Insert)、削除(Delete)、置換(Replace)のいずれかの操作を繰り返し適用すると、もう一方の文字列に一致させることができます。
これら3つの操作を「編集」と呼びます。
一方の文字列を編集し、もう一方の文字列に一致させるのに要する最小の編集回数のことを編集距離といいます。
何の意味もないですが、やろうと思えばいくらでも無駄な操作が可能なので、最小回数が編集距離になります。
編集距離が小さければその文字列はお互いに似ている、ということは直感的にもわかりやすいと思います。
DPによる編集距離の計算
とします。
の配列を用意し、この上でDPの計算を行います。
結論からいうと、
には、
- の先頭から文字目までと
- の先頭から文字目までの
編集距離が格納されていきます。
なので、求めたい編集距離は、計算終了後にに格納されているはずです。
アルゴリズム
以下の2つの事実により、機械的に計算していくだけで、が求まります。
文字列を編集し、文字列へ帰着させる状況を考えます。
0行目および0列目の値は簡単に埋められる
1つ目は、配列の0行目および0列目の値は簡単に埋められるという点です。
0行目とは、ですから、(空文字列)との編集距離です。
これは、になることがすぐにわかります。なぜなら、に一致するよう、空文字列へ回だけ文字を挿入させればよいからです。
同様の議論で、0列目もとなることがわかります。
これで配列の一番上の行(0行目)と一番左の列(0列目)が埋まりました。
セルの値は上・左・左上に隣接する3セルの値から計算できる
もう1つ目は、あるセルの値は上・左・左上に隣接する3セルの値から計算できる、という点です。
これはつまり、の値は、左の、上の、左上のから計算できるということになります。
左のと、を比べると、後者のほうが側文字列が1文字長い状態です。
つまり、に文字目をInsert(挿入)すれば、になり、と同じ状態になります。挿入操作が1回必要なので、
=>
同様の議論で、
=>
になります。
最後に、左上ののケースです。
これは、とどのように関係があるのでしょうか。
これに関しては、の文字目と、の文字目が一致するかどうかで場合分けします。
一致している場合、の文字目と、の文字目は一切編集不要なので、と、の編集距離のみ考えればよく、これはそのものです。
=>
一致しない場合、の文字目を、の文字目にReplace(置換)すると、上記「一致する場合」と同じ状態になります。置換操作が1回必要なので、
=>
となります。
このように、との関係は場合分けして計算します。
以上をもっての候補は、
- if else
の3択に絞られました。
正解はこの中の最小値を取ります。編集距離は最小回数なので、最小値を取らないと無駄な操作をした回数を含んでしまいます。
一見して、1足しているだけのものが多いですが、、、はそれぞれ別の値なので、やはりこの中から最小値を選ぶ必要があります。
このように、漸化式などを用いて以前の計算結果を再利用するので、DPの基本になります。
0行目および0列目はすでに埋まっているため、あとはこの漸化式を適用していくだけで、表のマス目をすべて埋めることができます。
0 件のコメント:
コメントを投稿