Chỉnh sửa khoảng cách với các thao tác di chuyển


13

Động lực: Một đồng tác giả chỉnh sửa một bản thảo và tôi muốn xem một bản tóm tắt rõ ràng về các chỉnh sửa. Tất cả các công cụ giống như "diff" có xu hướng vô dụng nếu bạn vừa di chuyển văn bản xung quanh (ví dụ: tổ chức lại cấu trúc) thực hiện các chỉnh sửa cục bộ. Có thực sự rất khó để có được nó phải không?


Định nghĩa: Tôi muốn tìm khoảng cách chỉnh sửa tối thiểu, trong đó các thao tác được phép là:

  • Các thao tác "giá rẻ": thêm / thay đổi / xóa một ký tự (các thao tác Levenshtein thông thường),

  • "đắt": các thao tác: di chuyển một chuỗi con đến một vị trí mới ( cho bất kỳ chuỗi a , b , c , d ).abcdacbdabcd

Cho hai chuỗi y và số nguyên kK , tôi muốn giải bài toán sau:xykK

  • bạn có thể chuyển đổi thành y bằng cách sử dụng tối đa k hoạt động giá rẻ và tối đa K hoạt động đắt tiền không?xykK

Câu hỏi:

  1. Vấn đề này có tên không? (Nghe có vẻ như một câu hỏi rất chuẩn trong bối cảnh căn chỉnh trình tự.)

  2. Có khó không?

  3. Nếu nó cứng, nó có thể điều chỉnh tham số cố định với làm tham số không?K

  4. Có các thuật toán gần đúng hiệu quả? (Ví dụ: tìm một giải pháp có tối đa giá rẻ và 2 K hoạt động đắt tiền nếu tồn tại một giải pháp với k giá rẻ và K hoạt động đắt tiền.)2k2KkK

Tôi đã cố gắng xem xét các số liệu chuỗi được liệt kê trong Wikipedia , nhưng không ai trong số chúng nhìn đúng.


3
Với , vấn đề là Sắp xếp theo Chuyển vị. Xem, ví dụ web.cs.dal.ca/~whidden/HTribution07.pdf Tôi chưa gặp phải vấn đề của bạn, nhưng có vẻ như có động lực rất tốt. k=0
Serge Gaspers

4
Độ cứng NP của vấn đề Sắp xếp theo chuyển vị đã được chứng minh vào năm 2010, xem Sắp xếp theo chuyển vị là khó khăn .
Marzio De Biasi

3
Chuyển vị là khó, nhưng chèn và xóa thì không. Nếu bạn cho phép một hoạt động đắt tiền là xóa một chuỗi con tùy ý hoặc chèn bất kỳ chuỗi con nào của chuỗi khác, vấn đề sẽ trở nên khá dễ dàng. Khoảng cách kết quả sẽ không đối xứng, mặc dù.
Jouni Sirén

Tôi tò mò hơn về khả năng lưu thông số cố định. Có phát hiện mới nào không?
Yixin Cao

Câu trả lời:



4

Vấn đề trở nên dễ dàng hơn, nếu chúng ta xem xét việc xóa dài và sao chép chuỗi con thay vì chuyển vị. Giả sử rằng chúng ta đang sử dụng các thuật toán quy hoạch động tiêu chuẩn cho tính toán chỉnh sửa khoảng cách, và đó là một hoạt động tốn kém có độ dài làm tăng khoảng cách bởi một k + b , đối với một số hằng số một , b 0 . Các hằng số này có thể khác nhau để xóa dài và sao chép chuỗi con.kak+ba,b0

Xóa dài là xóa một chuỗi con tùy ý từ . Hỗ trợ chúng rất dễ dàng, nếu chúng ta chia chúng thành hai loại thao tác đơn giản: xóa ký tự đầu tiên (chi phí a + b ) và mở rộng xóa bằng một ký tự (chi phí a ). Ngoài các mảng tiêu chuẩn Một , nơi Một [ i , j ] là chỉnh sửa khoảng cách giữa các tiền tố x [ 1 ... i ]y [ 1 ... j ] , chúng tôi sử dụng một mảng A dxa+baAA[i,j]x[1i]y[1j]Adđể lưu trữ khoảng cách chỉnh sửa, khi thao tác cuối cùng được sử dụng là một thao tác xóa dài. Với mảng này, chúng ta chỉ cần nhìn vào , A [ i - 1 , j - 1 ] , A [ i , j - 1 ]A d [ i - 1 , j ] khi tính toán A [ i , j ]A d [ iA[i1,j]Một[Tôi-1,j-1]Một[Tôi,j-1]Mộtd[Tôi-1,j]Một[Tôi,j] , cho phép chúng tôi làm điều đó trongthời gian O ( 1 ) .Mộtd[Tôi,j]Ôi(1)

Sao chép chuỗi con có nghĩa là chèn một chuỗi con tùy ý vào chuỗi đã chỉnh sửa. Như với việc xóa dài, chúng tôi chia thao tác thành hai thao tác đơn giản: chèn ký tự đầu tiên và mở rộng chèn bởi một ký tự. Chúng tôi cũng sử dụng mảng Một s để lưu trữ các chỉnh sửa khoảng cách giữa các tiền tố, với điều kiện là hoạt động cuối cùng sử dụng được substring sao chép.xMộtS

Làm điều này một cách hiệu quả phức tạp hơn so với việc xóa dài và tôi không chắc liệu chúng ta có thể khấu hao thời gian trên mỗi ô hay không. Chúng tôi xây dựng một cây hậu tố cho x , mất thời gian O ( | x | ) , giả sử một bảng chữ cái kích thước không đổi. Chúng tôi lưu trữ một con trỏ tới nút cây hậu tố hiện tại trong A s [ i , j - 1 ] , cho phép chúng tôi kiểm tra trong thời gian không đổi, liệu chúng tôi có thể mở rộng việc chèn theo ký tự y [ j ] hay không . Nếu đó là sự thật, chúng ta có thể tính A [ iÔi(1)xÔi(|x|)MộtS[Tôi,j-1]y[j] A s [ i , j ] trong thời gian không đổi.Một[Tôi,j]MộtS[Tôi,j]

Mặt khác, , trong đó z là chuỗi con được chèn được sử dụng để tính A s [ i , j - 1 ] , không phải là chuỗi con của x . Chúng ta sử dụng cây hậu tố để tìm hậu tố dài nhất z của z , trong đó z y [ j ] là một chuỗi con của x , trong thời gian O ( | z | - | z | ) . Để tính toánzy[j]zMộtS[Tôi,j-1]xz'zz'y[j]xÔi(|z|-|z'|) , bây giờ chúng ta cần xem các ô A [ i , j - | z | - 1 ] đến A [ i , j - 1 ] . Tìm suffix z ' đòi hỏi chỉ khấu hao O ( 1 ) thời gian mỗi tế bào, nhưng máy tính Một s [ i , j ] với một cách tiếp cận brute-force mất O ( | zMộtS[Tôi,j]Một[Tôi,j-|z'|-1]Một[Tôi,j-1]z'Ôi(1)MộtS[Tôi,j] thời gian. Có lẽ có một số cách để làm điều này hiệu quả hơn, nhưng tôi không thể tìm thấy nó ngay bây giờ.Ôi(|z'|)

Trong trường hợp xấu nhất, thuật toán mất thời gian, nhưng một phân tích tốt hơn nên có thể. Khoảng cách chỉnh sửa kết quả với việc xóa dài và sao chép chuỗi con không đối xứng, nhưng đó không phải là vấn đề. Rốt cuộc, thường dễ dàng tiếp cận chuỗi trống từ một chuỗi không trống hơn so với cách khác.Ôi(tối thiểu(|x||y|2,|x|2|y|))

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.