Wyrażanie arbitralnej permutacji jako sekwencji operacji (wstawianie, przenoszenie, usuwanie)

9

Załóżmy, że mam dwa ciągi. Nazywamy je i . Żaden ciąg nie ma powtarzających się znaków.AB

Jak znaleźć najkrótszą sekwencję operacji wstawiania, przenoszenia i usuwania, która zamienia w , gdzie:AB

  • insert(char, offset)wstawia charna podany offsetw ciągu
  • move(from_offset, to_offset)przesuwa postać aktualnie przesuniętą from_offsetdo nowej pozycji, tak aby przesunęła sięto_offset
  • delete(offset) usuwa znak z offset

Przykład zastosowania: wykonujesz zapytanie do bazy danych i wyświetlasz wyniki na swojej stronie. Później ponownie uruchom zapytanie bazy danych i odkryjesz, że wyniki uległy zmianie. Chcesz zmienić zawartość strony, aby dopasować ją do zawartości bazy danych, używając minimalnej liczby operacji DOM. Są dwa powody, dla których chcesz mieć najkrótszą sekwencję operacji. Po pierwsze, wydajność. Gdy zmienia się tylko kilka rekordów, musisz upewnić się, że wykonujesz zamiast operacji DOM, ponieważ są one drogie. Po drugie, poprawność. Jeśli element został przeniesiony z jednej pozycji do drugiej, chcesz przenieść powiązane węzły DOM w ramach jednej operacji, bez ich niszczenia i odtwarzania. W przeciwnym razie utracisz stan skupienia, zawartość elementów i tak dalej.O(1)O(n)<input>

Geoff
źródło

Odpowiedzi:

10

Sugeruję przyjrzeć się algorytmowi edycji odległości . Zamiast tylko obliczać odległość, warto zapisać ścieżkę masy minimalnej w tablicy i zwrócić ją.

Rick Minerich
źródło
5
W rzeczywistości, ponieważ nie ma powtórzeń, jest to nieco prostszy problem zwany problemem odległości Ulama. Chociaż możesz użyć algorytmu edycji odległości, istnieją również szybsze metody ukierunkowane na tę odległość: mit.edu/~andoni/papers/ulamSublinear.pdf
Suresh
1
Edycja odległości zwykle nie obejmuje moveoperacji, więc może być konieczne zróżnicowanie interpretacji wyniku.
Raphael