Redaktə məsafəsi (Levenşteyn məsafəsi) bir sətri digərinə çevirmək üçün lazım olan ən az əlavə, silmə və əvəzləmə sayıdır. O, orfoqrafiya düzəlişinin və qeyri-dəqiq axtarışın əsasıdır.
Üç əməliyyat
- hərf əlavə etmək;
- hərfi silmək;
- hərfi başqası ilə əvəz etmək.
Hər biri 1 xərclidir. kitten → sitting üçün cavab 3-dür: k-ni s ilə, e-ni i ilə əvəz et, g əlavə et.
Vəziyyət və keçid
- Vəziyyət:
dp[i][j]—a-nın ilkihərfinib-nin ilkjhərfinə çevirmək üçün minimal əməliyyat sayı. - Baza:
dp[i][0] = i(hamısını sil),dp[0][j] = j(hamısını əlavə et). - Eyni hərf (
a[i-1] == b[j-1]):dp[i][j] = dp[i-1][j-1]. - Əks halda:
1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]), yəni silmə, əlavə və ya əvəzləmə. - Cavab:
dp[n][m].
def edit_table(a, b):
n, m = len(a), len(b)
dp = [[0] * (m + 1) for _ in range(n + 1)]
for i in range(n + 1):
dp[i][0] = i # delete i letters
for j in range(m + 1):
dp[0][j] = j # insert j letters
for i in range(1, n + 1):
for j in range(1, m + 1):
if a[i - 1] == b[j - 1]:
dp[i][j] = dp[i - 1][j - 1] # same letter: free
else:
dp[i][j] = 1 + min(dp[i - 1][j], # delete a[i-1]
dp[i][j - 1], # insert b[j-1]
dp[i - 1][j - 1]) # replace
return dp
dp = edit_table("kitten", "sitting")
for row in dp:
print(*row)
print("distance:", dp[-1][-1])