転置の代わりに長い削除と部分文字列のコピーを考慮すると、問題はより簡単になります。我々は編集距離計算のための標準的な動的プログラミングアルゴリズムを使用していることを前提とし、長さの高価な動作ことによって距離を増加K + B、いくつかの定数のため、B ≥ 0。これらの定数は、長い削除と部分文字列のコピーでは異なる場合があります。kak+ba,b≥0
長い削除とは、から任意の部分文字列を削除することです。最初の文字(コスト削除:私たちは、簡単な操作の2種類にそれらを打破する場合は、それらをサポートすることは、簡単で+のBを)と1つの文字(コストによる削除を拡張A)。標準的な配列に加えて、A、A [ I 、Jは】プレフィックスの間の編集距離であるX [ 1 ... I ]及びY [ 1 ... J ]、我々は別の配列を使用A Dをxa+baAA[i,j]x[1…i]y[1…j]Ad最後に使用された操作が長い削除であった場合、編集距離を保存します。この配列を使用すると、計算時に、A [ i − 1 、j − 1 ]、A [ i 、j − 1 ]、およびA d [ i − 1 、j ]を見るだけで済みます。A [ i 、j ]およびA d [ iA[i−1,j]A[i−1,j−1]A[i,j−1]Ad[i−1,j]A[i,j]、 O (1 )時間でそれを行うことができます。Ad[i,j]O(1)
部分文字列のコピーとは、編集された文字列に任意の部分文字列を挿入することです。長い削除の場合と同様に、操作を2つの単純な操作に分割します。最初の文字を挿入し、挿入を1文字だけ拡張します。我々はまた、配列を使用A Sを使用した最後の操作は、コピーサブストリングたことを提供プレフィックス、間の編集距離を格納します。xAs
これを効率的に行うことは、長い削除よりも複雑であり、セルごとに償却された時間に到達できるかどうかはわかりません。一定サイズのアルファベットを想定して、O (| x |)時間かかるxの接尾辞ツリーを作成します。現在のサフィックスツリーノードへのポインタをA s [ i 、j − 1 ]に格納し、文字y [ j ]によって挿入を拡張できるかどうかを一定の時間でチェックできるようにします。それが本当なら、A 、jを計算できますO(1)xO(|x|)As[i,j−1]y[j]および A s [ i 、j ]を一定時間で。A[i,j]As[i,j]
zy[j]zAs[i,j−1]xz′zz′y[j]xO(|z|−|z′|)、セル A [ i 、j − | z ′ | − 1 ]から A [ i 、j − 1 ]へ。サフィックス z ′を見つけるには、セルごとに償却された O (1 )時間だけが必要ですが、ブルートフォースアプローチで A s [ i 、j ]を計算するには O (| zAs[i,j]A[i,j−|z′|−1]A[i,j−1]z′O(1)As[i,j]O(|z′|)時間。これをもっと効率的に行う方法はおそらくあるでしょうが、今はそれを見つけることができません。
O(min(|x|⋅|y|2,|x|2⋅|y|)) time, but a better analysis should be possible. The resulting edit distance with long deletions and substring copying is not symmetric, but that should not be a problem. After all, it is usually easier to reach the empty string from a nonempty one than the other way around.