TL; DR: Một loại khoảng cách chỉnh sửa hạn chế hơn một chút, trong đó chúng ta chỉ có thể chèn và xóa từng ký tự, có thể được tính trong thời gian tuyến tính khi cả hai (hoặc thậm chí chỉ một) chuỗi có các ký tự duy nhất. Điều này cung cấp giới hạn trên và dưới hữu ích trên khoảng cách chỉnh sửa Levenshtein.
Chèn / xóa khoảng cách chỉnh sửa và các chuỗi phổ biến dài nhất
Khoảng cách chỉnh sửa Levenshtein cho phép chèn, xóa và thay thế một ký tự, gán cho mỗi chi phí là 1. Nếu chúng tôi giới hạn chỉ chèn và xóa, chúng tôi có được một thước đo khoảng cách tương tự mà bây giờ có thể thay thế có chi phí là 2 (vì bất kỳ thay thế nào cũng có thể được bắt chước bằng cách chèn và xóa). Tôi không biết tên tiêu chuẩn cho loại khoảng cách chỉnh sửa hạn chế hơn này, vì vậy tôi sẽ gọi nó là "chèn / xóa khoảng cách chỉnh sửa". Nó tương ứng chặt chẽ với bài toán phổ biến dài nhất (LCS) dài nhất , trong đó chúng ta được cung cấp hai chuỗi, có độ dài và n , tương ứng và muốn biết độ dài của chuỗi dài nhất xuất hiện trong cả hai. Nếu hai chuỗi có LCS LmnL, sau đó họ đã chèn / xóa khoảng cách chỉnh sửa n + m - 2 L : cách dễ nhất để thấy điều này là căn chỉnh các chuỗi sao cho các ký tự trong LCS xuất hiện xếp chồng lên nhau, trong khi các ký tự không trong LCS xuất hiện đối diện -
khoảng cách nhân vật. Sau đó, rõ ràng là chúng ta có thể chỉnh sửa chuỗi đầu tiên thành chuỗi thứ hai bằng cách chèn bất cứ nơi nào có -
hàng trên cùng và xóa bất cứ nơi nào có hàng -
ở dưới cùng. Ví dụ:
-C-IRC-LE
T-RI-CKLE
Ở đây, LCS của CIRCLE
và TRICKLE
, ICLE
, có chiều dài 4, và chỉnh sửa khoảng cách thực sự là .6 + 7 - 2 * 4 = 5
Hậu quả tăng dài nhất
Lý do cho đường vòng này là có một cách rất hiệu quả để tính LCS (và do đó khoảng cách chỉnh sửa chèn / xóa) khi ít nhất một trong các chuỗi chỉ chứa các ký tự riêng biệt: Trong trường hợp này, vấn đề LCS có thể được chuyển thành vấn đề tìm kiếm một chuỗi tăng dài nhất , có thể được giải quyết trong thời gian . Giả sử chúng ta được cung cấp hai chuỗi A và B và chuỗi A có các ký tự riêng biệt. Chúng ta có thể đổi tên ký tự đầu tiên trong A thành 1, thứ hai thành 2, v.v., theo dõi số lượng chúng ta đã gán cho mỗi ký tự trong một bảng. Sau đó trong BO ( n logn )MộtBMộtMộtB, chúng tôi đổi tên các ký tự của nó bằng bảng này (nghĩa là mọi lần xuất hiện của bất kỳ ký tự đầu tiên nào A
được thay đổi thành 1, v.v.). Cuối cùng, chúng tôi tìm kiếm một sự gia tăng dài nhất trong B
. Điều này tương ứng với LCS giữa A
và B
và từ đó chúng ta có thể tính toán ngay khoảng cách chỉnh sửa chèn / xóa. Tổng thời gian cần thiết chỉ là nếu A và B có độ dài lần lượt là n và m .O ( n + m logm )MộtBnm
Giới hạn khoảng cách chỉnh sửa Levenshtein
Khoảng cách chèn / xóa rõ ràng cung cấp giới hạn trên của khoảng cách Levenshtein (vì bất kỳ chuỗi thao tác chỉnh sửa hợp lệ nào trong khoảng cách chèn / xóa cũng là một chuỗi hợp lệ của các thao tác chỉnh sửa Levenshtein). Chia khoảng cách chỉnh sửa chèn / xóa cho 2 cũng cho giới hạn thấp hơn, vì trong trường hợp xấu nhất, mọi thao tác chỉnh sửa Levenshtein có thể được thay đổi thành 2 thao tác chỉnh sửa chèn / xóa.
Khái quát
rO ( ( r + n ) logn )r ≤ ndiff
diff
Ô ( n d)d
Săn, J.; Szymanski, T. (1977), "Một thuật toán nhanh để tính toán các chuỗi phổ biến dài nhất", Truyền thông của ACM, 20 (5): 350 mật353, doi: 10.1145 / 359581.359603