まず、longest common subsequenceを見つけてください。これにより、移動しない要素が識別されます。LCSの要素はカッコで囲まれています。
インデックス0の両方のシーケンスを調べ、シーケンスを同一にするために必要な操作を記録します。最初のシーケンスの現在の項目がLCSの一部でない場合は、後でそれを挿入する必要がある場合に備えて、それを削除し、以前の場所にマークを付けます。現在の要素がLCSの一部である場合、その要素の前に2番目の要素を挿入します。これは簡単な挿入または移動のいずれかになります。挿入しているアイテムが元のリストにある場合は、移動します。それ以外の場合は、挿入します。
ここにあなたの例を使ったデモがあります。中括弧は、現在の要素
[{(1)}, (2), (3), 4, 5] vs [{5}, 1, 2, 9, 3, 7]
1
は、LCSのメンバーであるので、我々は5
を挿入する必要があります示しています。 5
は、元のシーケンスであるので、我々は動きを記録:MOVE 4 to 0
[5, {(1)}, (2), (3), 4] vs [5, {1}, 2, 9, 3, 7]
項目は同じですので、我々は次のものに移動:
[5, (1), {(2)}, (3), 4] vs [5, 1, {2}, 9, 3, 7]
再び番号が同じである - 移動次のいずれかに:
[5, (1), (2), {(3)}, 4] vs [5, 1, 2, {9}, 3, 7]
3
は、LCSのメンバーであるので、我々は9
を挿入する必要があります。
[5, (1), (2), 9, (3), {4}] vs [5, 1, 2, 9, 3, {7}]
「4」メンバーではありません: - 次の1への移行はINSERT 9 at 3
[5, (1), (2), 9, {(3)}, 4] vs [5, 1, 2, 9, {3}, 7]
またしても番号が同じである:それは、単純な挿入ですので、元の要素は、9
を持っていませんそれが削除されるLCSの、よう:DEL at 5
[5, (1), (2), 9, (3)] vs [5, 1, 2, 9, 3, {7}]
我々は最初のシーケンスの終わりに達した - 私たちは、単に目に第二の配列の残りの項目を追加します最初の1つ、前の削除のリストに注意を払う。たとえば、7
が以前に削除されていた場合、この時点でその削除を移動に変換します。しかし元のリストには7
が含まれていなかったので、最終的な操作はINS 7 at 5
です。
素晴らしい! LCSアルゴリズムを最適化するために、シーケンス内の識別子の一意性を利用できますか? –
@ NicolasRepiquet 2つのセットの間の設定された交差のサイズに応じて、可能性があります。交差点の長さがシーケンスの長さの70%以下と小さい場合は、2倍のスピードアップのために両方のシーケンスに共通の値のみで構成されたサブシーケンスの問題を解決できます。しかし、LCSでは多くの速度を得ることができません。ネストされたループ内のデータの行全体を準備する必要があり、内部ループのステップ「j」の値は、 j-1 'が正しい。 – dasblinkenlight