Алгоритмы

Edit Distance: Расстояние Левенштейна

Цели урока

  • Понимать три операции: insert, delete, replace
  • Выводить рекурсивную формулу
  • Реализовать DP решение O(mn)
  • Оптимизировать память до O(n)
  • Восстанавливать последовательность операций

Предварительные знания

  • LCS
  • Динамическое программирование
  • LCS
  • DP основы

Каждый раз когда телефон исправляет 'teh' на 'the' - работает Edit Distance. Биоинформатики используют его для сравнения генов. Google использует для 'Did you mean?'. Это один из самых практичных алгоритмов.

  • Autocorrect и spell checking
  • DNA/protein sequence alignment
  • Fuzzy search в базах данных
  • Антиплагиат и детекция копий

История алгоритма

Владимир Левенштейн предложил метрику в 1965 году для исправления ошибок в телеграфных кодах. Независимо Needleman-Wunsch (1970) разработали алгоритм для биоинформатики. Wagner-Fischer (1974) описали DP-алгоритм.

Что такое Edit Distance?

**Edit Distance (расстояние Левенштейна)** - минимальное количество операций для превращения строки A в строку B.

**Вариации:**

  • **Levenshtein**: insert, delete, replace (все стоят 1)
  • **LCS distance**: только insert и delete (replace = delete + insert)
  • **Hamming**: только replace, строки одинаковой длины
  • **Damerau-Levenshtein**: + транспозиция соседних символов

**Применения:** автокоррекция, DNA alignment, plagiarism detection, fuzzy search.

Edit Distance между "cat" и "cut"?

Рекурсивная формула

**Сравниваем последние символы и выбираем лучшую операцию.**

A="ab", B="a". Какая операция оптимальна?

DP решение

**dp[i][j]** = Edit Distance между A[0..i-1] и B[0..j-1].

**Восстановление операций:**

Откуда берётся значение dp[i][j] при A[i-1] ≠ B[j-1]?

Оптимизация памяти

**dp[i][j] зависит только от dp[i-1][j-1], dp[i-1][j], dp[i][j-1].** Достаточно двух строк.

**Компромисс:** при одной строке теряем возможность восстановить операции. Для полного backtrace нужна вся таблица.

Почему нужна переменная prev_diag при оптимизации до одной строки?

Применения

**Edit Distance используется повсюду!**

**LeetCode задачи:**

  • #72 Edit Distance: классика
  • #583 Delete Operation for Two Strings: только delete
  • #712 Minimum ASCII Delete Sum: weighted delete
  • #1035 Uncrossed Lines: вариация LCS
  • #97 Interleaving String: сложная вариация

Почему Edit Distance полезен для spell checking?

Edit Distance

  • Три операции: insert, delete, replace (стоимость 1)
  • dp[i][j] = min(match, replace+1, delete+1, insert+1)
  • База: dp[i][0] = i, dp[0][j] = j
  • O(mn) время, оптимизация до O(n) памяти
  • Связь с LCS: edit = m + n - 2*LCS (без replace)

Связанные темы

Edit Distance связан с другими строковыми алгоритмами.

  • LCS — Edit Distance обобщает LCS
  • DP основы — Базовая парадигма
  • Поиск подстроки — Fuzzy matching

Связанные уроки

  • alg-28-lcs — Расстояние редактирования расширяет DP-таблицу LCS
  • alg-21-dp — Это классическая 2D-рекуррентность динамического программирования
  • alg-23-pattern-matching — Нечёткий поиск ранжирует совпадения по расстоянию редактирования
  • dm-22 — Выравнивание ДНК - взвешенное расстояние редактирования
  • nlp-01
Edit Distance: Расстояние Левенштейна

0

1

Войти