Một kỹ thuật phục hồi lỗi mạnh — sửa lỗi khoảng cách tối thiểu (minimum-distance error correction) — tìm dãy phép chèn (insert), xóa (delete), thay thế (substitute) token với số phép ít nhất để biến dãy token thực tế mà lexer đọc được thành dãy token mà văn phạm/parser mong đợi. Đây chính là khoảng cách chỉnh sửa Levenshtein trên dãy token (mỗi phép chi phí 1).
Cho dãy token thực tế A=a1…an và dãy token kỳ vọng B=b1…bm. Gọi dp[i][j] là khoảng cách sửa lỗi tối thiểu giữa a1…ai và b1…bj:
dp[i][0]=i,dp[0][j]=j dp[i][j]={dp[i−1][j−1]1+min(dp[i−1][j−1], dp[i−1][j], dp[i][j−1])neˆˊu ai=bjneˆˊu ai=bj
Vì có thể có nhiều cách phân rã tối ưu khác nhau (cùng tổng chi phí nhưng khác số lượng insert/delete/substitute), để kết quả xác định duy nhất, quy ước dựng lại đường đi từ (n,m) về (0,0): tại mỗi ô, áp dụng lựa chọn khả thi đầu tiên theo đúng thứ tự ưu tiên sau:
Ví dụ: A= a b c, B= a x c. dp[3][3]=1 (thay b thành x). Kết quả: khoảng cách 1, insert=0, delete=0, substitute=1.
In ra 2 dòng:
insert=I delete=D substitute=S với I,D,S là số phép chèn, xóa, thay thế xác định theo quy ước dựng đường đi ở trên.Ví dụ:
Đầu vào:
3
a b c
3
a x c
Đầu ra:
1
insert=0 delete=0 substitute=1
Đầu vào:
2
a b
3
a b c
Đầu ra:
1
insert=1 delete=0 substitute=0
Đang tải editor...