任意の順列を一連の(挿入、移動、削除)操作として表現する


9

2つの文字列があるとします。それらをおよびBと呼びます。どちらの文字列にも繰り返し文字はありません。AB

Bに変換する挿入、移動、削除操作の最短のシーケンスを見つけるにはどうすればよいですか?AB

  • insert(char, offset)文字列charの指定さoffsetれた位置に挿入します
  • move(from_offset, to_offset)現在オフセットfrom_offsetにある文字を新しい位置に移動して、オフセットを設定しますto_offset
  • delete(offset) の文字を削除します offset

アプリケーション例:データベースクエリを実行し、結果をWebサイトに表示します。その後、データベースクエリを再実行し、結果が変更されたことを発見しました。最小数のDOM操作を使用して、現在データベースにあるものと一致するようにページの内容を変更したいとします。最短の操作シーケンスが必要な理由は2つあります。まず、効率。変更されるレコードが数個しかない場合は、On ではなくを実行する必要があります。O(1)O(n)DOM操作。高価なため。第二に、正しさ。アイテムをある位置から別の位置に移動した場合、関連付けられたDOMノードを破棄して再作成せずに、1回の操作で移動する必要があります。そうしないと、フォーカス状態、<input>要素のコンテンツなどが失われます。

回答:


10

編集距離アルゴリズムを確認することをお勧めします。距離を計算するだけでなく、配列を通る最小のウェイトパスを記録してそれを返す必要があります。


5
実際、繰り返しがないため、これはUlam距離問題と呼ばれる少し単純な問題です。編集距離アルゴリズムを使用できますが、この距離を対象としたより高速な方法もあります。mit.edu
Suresh

1
通常、距離の編集ではmove操作がカバーされないため、スコアを解釈するときに変更する必要がある場合があります。
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.