Chỉnh sửa khoảng cách của danh sách với các yếu tố độc đáo


12

Levenshtein - Khoảng cách chỉnh sửa khoảng cách giữa các danh sách là một vấn đề được nghiên cứu kỹ lưỡng. Nhưng tôi không thể tìm thấy nhiều về các cải tiến có thể nếu biết rằng không có yếu tố nào xảy ra nhiều hơn một lần trong mỗi danh sách .

Chúng ta cũng giả sử rằng các yếu tố có thể so sánh / sắp xếp được (nhưng danh sách để so sánh không được sắp xếp để bắt đầu).

O(min(m,n)s)O(min(s,m,n)s)s

Chính thức hơn,

Làm thế nào hiệu quả chúng ta có thể tính toán khoảng cách chỉnh sửa giữa hai chuỗi đã cho với lời hứa rằng chúng không có bất kỳ chữ cái lặp lại nào?s,tΣ

Σ là một bảng chữ cái rất lớn.


Câu hỏi của bạn bây giờ là gì; Làm thế nào để tăng tốc độ chỉnh sửa khoảng cách theo cặp, hoặc làm thế nào để tăng tốc độ tính toán tất cả các khoảng cách theo cặp của một danh sách các chuỗi?
Raphael

2
Tôi nghi ngờ câu hỏi là: Làm thế nào để tính khoảng cách chỉnh sửa giữa , trong đó là các chuỗi trên một bảng chữ cái rất lớn và chúng tôi đảm bảo rằng không có chữ cái nào xuất hiện hai lần trong hoặc in (OP đại diện cho mỗi chuỗi dưới dạng danh sách các chữ cái, nghĩa là danh sách các phần tử). Nhưng điều này cần xác nhận. s , t Σ * Σ s tS,tS,tΣ*ΣSt
DW

Có, trong trường hợp này, bảng chữ cái lớn được tạo thành từ các chỉ mục cơ sở dữ liệu và "chuỗi", s và t, là các danh sách chứa các chỉ mục này.
dùng362178

Đối với những người thắc mắc về độ phức tạp: và n là độ dài của chuỗi đầu vào và là khoảng cách chỉnh sửa thực tế, vì vậy nó được bao gồm trong độ phức tạp. Chi phí cho mỗi lần chỉnh sửa được coi là 1 nhưng có lẽ không liên quan để tính khoảng cách này (số lần chỉnh sửas s ). mnSS
Albert Hendriks

Câu trả lời:


3

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 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-2L : 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 CIRCLETRICKLE, 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 AB 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 BÔi(nđăng nhậpn)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 ABvà 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 AB có độ dài lần lượt là nm .Ôi(n+mđăng nhậpm)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

rÔi((r+n)đăng nhậpn)rndiffdiffÔi(nd)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

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.