Biểu thị một hoán vị tùy ý như một chuỗi các thao tác (chèn, di chuyển, xóa)


9

Giả sử tôi có hai chuỗi. Gọi cho họ và . Cả chuỗi đều không có ký tự lặp lại.AB

Làm cách nào tôi có thể tìm thấy chuỗi thao tác chèn, di chuyển và xóa ngắn nhất biến thành , trong đó:AB

  • insert(char, offset)chèn chartại offsetcác chuỗi đã cho
  • move(from_offset, to_offset)di chuyển nhân vật hiện đang được bù from_offsetsang vị trí mới để nó được bùto_offset
  • delete(offset) xóa nhân vật tại offset

Ứng dụng ví dụ: Bạn thực hiện một truy vấn cơ sở dữ liệu và hiển thị kết quả trên trang web của bạn. Sau đó, bạn chạy lại truy vấn cơ sở dữ liệu và phát hiện ra rằng kết quả đã thay đổi. Bạn muốn thay đổi những gì trên trang để khớp với những gì hiện có trong cơ sở dữ liệu bằng cách sử dụng số lượng hoạt động DOM tối thiểu. Có hai lý do tại sao bạn muốn chuỗi hoạt động ngắn nhất. Thứ nhất, hiệu quả. Khi chỉ có một vài bản ghi thay đổi, bạn muốn đảm bảo rằng bạn thực hiện thay vì hoạt động DOM, vì chúng rất tốn kém. Thứ hai, tính đúng đắn. Nếu một mục được di chuyển từ vị trí này sang vị trí khác, bạn muốn di chuyển các nút DOM được liên kết trong một thao tác, mà không phá hủy và tạo lại chúng. Nếu không, bạn sẽ mất trạng thái tập trung, nội dung của các yếu tố, v.v.O(1)O(n)<input>

Câu trả lời:


10

Tôi đề nghị xem xét thuật toán khoảng cách chỉnh sửa . Thay vì chỉ tính khoảng cách, bạn sẽ muốn ghi lại đường dẫn trọng lượng tối thiểu của mình thông qua mảng và trả về đó.


5
Trên thực tế, vì không có sự lặp lại, đây là một vấn đề đơn giản hơn một chút gọi là vấn đề khoảng cách Ulam. Mặc dù bạn có thể sử dụng thuật toán khoảng cách chỉnh sửa, nhưng cũng có các phương pháp nhanh hơn được nhắm mục tiêu vào khoảng cách này: mit.edu/~andoni/ con / ulamSublinear.pdf
Suresh

1
Chỉnh sửa khoảng cách thường không bao gồm các movehoạt động, vì vậy bạn có thể phải thay đổi khi diễn giải điểm số.
Raphael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.