Khoảng Cách Levenshtein

Trong các thuật toán của bộ môn khoa học máy tính, khái niệm Khoảng cách Levenshtein thể hiện khoảng cách khác biệt giữa 2 chuỗi ký tự.

Khoảng cách Levenshtein giữa chuỗi S và chuỗi T là số bước ít nhất biến chuỗi S thành chuỗi T thông qua 3 phép biến đổi là

  • xoá 1 ký tự.
  • thêm 1 ký tự.
  • thay ký tự này bằng ký tự khác.

Khoảng cách này được đặt theo tên Vladimir Levenshtein, người đã đề ra khái niệm này vào năm 1965. Nó được sử dụng trong việc tính toán sự giống và khác nhau giữa 2 chuỗi, như chương trình kiểm tra lỗi chính tả của winword spellchecker. Ví dụ: Khoảng cách Levenshtein giữa 2 chuỗi "kitten" và "sitting" là 3, vì phải dùng ít nhất 3 lần biến đổi.

  1. kitten -> sitten (thay "k" bằng "s")
  2. sitten -> sittin (thay "e" bằng "i")
  3. sittin -> sitting (thêm ký tự "g")

Thuật toán

Để tính toán Khoảng cách Levenshtein, ta sử dụng thuật toán quy hoạch động, tính toán trên mảng 2 chiều (n+1)*(m+1), với n, m là độ dài của chuỗi cần tính. Sau đây là đoạn mã (S, T là chuỗi cần tính khoảng cách, n, m là độ dài của chuỗi S, T):

 int LevenshteinDistance(char s[1..m], char t[1..n]) // d is a table with m+1 rows and n+1 columns declare int d[0..m, 0..n]  for i from 0 to m   d[i, 0]:= i for j from 0 to n   d[0, j]:= j  for i from 1 to m   for j from 1 to n   {  if s[i] = t[j] then cost:= 0  else cost:= 1  d[i, j]:= minimum(   d[i-1, j] + 1, // trường hợp xoá   d[i, j-1] + 1, // trường hợp thêm   d[i-1, j-1] + cost  // trường hợp thay thế  )   }   return d[m, n] 

ví dụ, giá trị của bảng d:

k i t t e n
0 1 2 3 4 5 6
s 1 1 2 3 4 5 6
i 2 2 1 2 3 4 5
t 3 3 2 1 2 3 4
t 4 4 3 2 1 2 3
i 5 5 4 3 2 2 3
n 6 6 5 4 3 3 2
g 7 7 6 5 4 4 3
S a t u r d a y
0 1 2 3 4 5 6 7 8
S 1 0 1 2 3 4 5 6 7
u 2 1 1 2 2 3 4 5 6
n 3 2 2 2 3 3 4 5 6
d 4 3 3 3 3 4 3 4 5
a 5 4 3 4 4 4 4 3 4
y 6 5 4 4 5 5 5 4 3

Như vậy, kết quả cần tính chính là giá trị của d[n, m]. Bài toán này có phần tương tự với bài toán chuỗi con chung dài nhất

Tham khảo

Hjelmqvist, Sten (26 Mar 2012), Fast, memory efficient Levenshtein algorithm

Tags:

Thuật toán

🔥 Trending searches on Wiki Tiếng Việt:

NATOGiải bóng đá Vô địch Quốc gia Việt NamHương CảngHenrique CalistoKim Ji-won (diễn viên)Thierry HenryToán họcCôn ĐảoTập đoàn FPTThứ Sáu Tuần ThánhDanh sách phim điện ảnh Thám tử lừng danh ConanPhước SangLý Tiểu LongĐồng tính luyến áiPhan Đình GiótSân bay quốc tế Long ThànhBlue LockIosif Vissarionovich StalinHồng NhungTiếng NgaAreumHy LạpQuân chủng Phòng không – Không quân, Quân đội nhân dân Việt NamArsenal F.C.Danh sách quốc gia theo GDP (danh nghĩa)Lê Thánh TôngChe GuevaraĐại ViệtĐền HùngNguyễn Chí VịnhNgười Do TháiTôi thấy hoa vàng trên cỏ xanhNhư Ý truyệnQuân khu 4, Quân đội nhân dân Việt NamKhí quyển Trái ĐấtKuwaitThích-ca Mâu-niNguyễn Bỉnh KhiêmVõ Thị SáuBảy hoàng tử của Địa ngụcDanh sách ngân hàng tại Việt NamNguyễn Ngọc TưVnExpressDragon Ball – 7 viên ngọc rồngNapoliĐế quốc La MãTư Mã ÝKazakhstanDanh sách trại giam ở Việt NamTập đoàn VingroupTrần Hưng ĐạoNông nghiệpNguyễn Xuân PhúcChiến tranh Đông DươngHiệp định Paris 1973Châu Đại DươngCác vị trí trong bóng đáHuy CậnĐồng bằng sông Cửu LongVõ Tắc ThiênÚcZaloHồ Hoàn KiếmKhu rừng đen tốiQuán Thế ÂmĐiện Biên PhủNguyễn Văn LongBộ luật Hồng ĐứcCải cách ruộng đất tại miền Bắc Việt NamChiến tranh LạnhMặt trận Tổ quốc Việt NamHà TĩnhDân chủĐặng Văn Minh (chính khách)Thời bao cấp🡆 More