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,b≥0
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 ] và y [ 1 ... j ] , chúng tôi sử dụng một mảng A dxa+baAA[i,j]x[1…i]y[1…j]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 ] và A d [ i - 1 , j ] khi tính toán A [ i , j ] và A d [ iA[i−1,j]Một [ i - 1 , j - 1 ]Một [ i , j - 1 ]Mộtd[ i - 1 , j ]Một [ i , j ] , cho phép chúng tôi làm điều đó trongthời gian O ( 1 ) .Mộtd[ i , j ]Ô ( 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Ô ( 1 )xÔ ( | x | )MộtS[ i , j - 1 ]y[ j ] và A s [ i , j ] trong thời gian không đổi.Một [ i , j ]MộtS[ 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[ i , j - 1 ]xz'zz'y[ j ]xO ( | 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[ i , j ]Một [ i , j - | z'| -1]Một [ i , j - 1 ]z'Ô ( 1 )MộtS[ 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ờ.O ( | 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.O ( phút ( | x | ⋅ | y|2, | x |2⋅ | y| ))