近似文字列の一致は、見知らぬ問題ではありません。
私はそれを解決する方法を学び、理解しようとしています。私は今でもそれに深く入り込みたくはなく、強引な方法を理解したいだけです。
そのwikiページ(近似文字列マッチング)には、
ブルートフォースアプローチは、TのすべてのサブストリングのP(パターン)までの編集距離を計算してから、最小距離のサブストリングを選択することです。ただし、このアルゴリズムの実行時間はO(m * n ^ 3)で、nはTの長さ、mはPの長さです。
Ok。私はこの声明を次のように理解しています。
- Tのすべての可能な部分文字列を見つけます
- 文字列の各ペア{P、t1}、{P、t2}、..の編集距離を計算します。
- Pからの距離が最も短い部分文字列を見つけ、この部分文字列が答えです。
次の質問があります。
a。2つのforループを使用して、可能なすべてのサブストリングを取得できます。これには、O(n ^ 2)が必要です。それで、1つの部分文字列とパターンの編集距離を計算しようとすると、O(n * m)が必要ですか?なんで?
b。1つのペア(1つの部分文字列とパターン)の距離をどの程度正確に計算できますか?挿入、削除、置換ができることは知っていますが、1つのペアの計算だけを行うアルゴリズムを誰かに教えてもらえますか?
ありがとう
編集
わかりました。レーベンシュタイン距離を使用する必要がありますが、その方法がよくわかりません。
これがコードの一部です
for j from 1 to n
{
for i from 1 to m
{
if s[i] = t[j] then
d[i, j] := d[i-1, j-1] // no operation required
else
d[i, j] := minimum
(
d[i-1, j] + 1, // a deletion
d[i, j-1] + 1, // an insertion
d[i-1, j-1] + 1 // a substitution
)
}
}
だから、私が今比較していると仮定し{"suv", "svi"}
ます。
だから'v' != 'i'
、私は他の3つのペアを見る必要があります:
{"su", "sv"}
{"suv", "sv"}
{"su", "svi"}
この部分をどのように理解できますか?なぜこれらの3つの部分を見る必要があるのですか?
2つのプレフィックス(または文字列)を等しくするために、変更の数がdistance between two prefixes
必要であることを意味しますか?distance
それでは、を見てみましょう{"su", "sv"}
。の距離が1であることがわかります。では、1を追加するだけで、{"su", "sv"}
どのよう{"su", "sv"}
になりますか?{"suv", "svi"}
「su」に「v」を挿入し、「sv」に「v」を挿入してから、最後の「i」を「v」に置き換える必要があると思います。これには3つの操作が含まれます。