Tối ưu hóa vi mô để tính toán khoảng cách chỉnh sửa: có hợp lệ không?


10

Trên Wikipedia , một triển khai cho sơ đồ lập trình động từ dưới lên cho khoảng cách chỉnh sửa được đưa ra. Nó không hoàn toàn theo định nghĩa; các tế bào bên trong được tính toán như vậy:

if s[i] = t[j] then  
  d[i, j] := d[i-1, j-1]       // no operation required
else
  d[i, j] := minimum
             (
               d[i-1, j] + 1,  // a deletion
               d[i, j-1] + 1,  // an insertion
               d[i-1, j-1] + 1 // a substitution
             )
}

Như bạn có thể thấy, thuật toán luôn chọn giá trị từ hàng xóm phía trên bên trái nếu có kết quả khớp, lưu một số truy cập bộ nhớ, hoạt động ALU và so sánh.

Tuy nhiên, việc xóa (hoặc chèn) có thể dẫn đến một giá trị nhỏ hơn , do đó thuật toán không chính xác cục bộ, nghĩa là nó bị phá vỡ với tiêu chí tối ưu. Nhưng có lẽ lỗi không thay đổi kết quả cuối cùng - nó có thể bị hủy bỏ.

Điều này có tối ưu hóa vi mô hợp lệ không, và tại sao (không)?

Câu trả lời:


6

Tôi không nghĩ rằng thuật toán là thiếu sót. Nếu hai chuỗi được khớp, đầu tiên chúng ta so sánh hai ký tự cuối cùng của nó (và sau đó lặp lại). Nếu chúng giống nhau, chúng ta có thể khớp chúng để có được sự liên kết tối ưu. Ví dụ, hãy xem xét các chuỗi testtestat. Nếu bạn không khớp hai tgiây cuối cùng , thì một trong hai tvẫn chưa từng có, vì nếu không thì kết quả khớp của bạn sẽ như thế này:

nhập mô tả hình ảnh ở đây

Điều này là không thể, vì các mũi tên không được phép "vượt qua". Sự trùng khớp tgây ra một số chèn (hộp màu xanh lục trong hình), như được mô tả ở bên trái:

nhập mô tả hình ảnh ở đây

Nhưng sau đó, bạn có thể chỉ cần tìm một liên kết tốt như nhau, được mô tả ở bên phải. Trong cả hai trường hợp, bạn khớp a tvà bạn có hai phần chèn.

Đối số cho một sự thay thế của một trong những ts cuối cùng là như nhau. Vì vậy, nếu bạn thay thế một trong những ts cuối cùng , thì thay vào đó bạn có thể khớp với hai t cuối cùng và có được sự liên kết tốt hơn (xem hình).

nhập mô tả hình ảnh ở đây


Ah, một đối số từ trên xuống cho một vấn đề từ dưới lên. Đẹp!
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.