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 ilk i hərfini b-nin ilk j hə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].
"kitten" və "sitting" üçün redaktə məsafəsi cədvəli və optimal yol
"kitten" və "sitting" üçün redaktə məsafəsi cədvəli və optimal yol
python
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])

Əməliyyatların bərpası