Алгоритмы сравнения текстов Myers Diff и LCS: теория и разбор
Сравнение текстов лежит в основе систем контроля версий (Git, SVN), инструментов code review и сопоставления юридических договоров. В этой статье разбираем математику вычисления различий (diff): задачу поиска наибольшей общей подпоследовательности (LCS), динамическое программирование и классический алгоритм Юджина Майерса.
Задача нахождения наибольшей общей подпоследовательности (LCS)
Если у нас есть строка A длиной M и строка B длиной N, классическое решение через динамическое программирование строит матрицу
DP[M+1][N+1]:`javascriptif (A[i - 1] === B[j - 1]) {
DP[i][j] = DP[i - 1][j - 1] + 1;
} else {
DP[i][j] = Math.max(DP[i - 1][j], DP[i][j - 1]);
}
`Сложность алгоритма по времени и памяти составляет O(M × N). Для текстов из сотен строк это вычисляется за миллисекунды прямо в браузере.
Полезный инструмент: Проверить работу алгоритма на реальных строках кода можно через инструмент сравнения текста Diff.
Полезный инструмент: Для предварительной очистки сравниваемых списков используйте инструмент дедупликация строк.
Алгоритм Юджина Майерса (Eugene Myers, 1986)
Майерс переформулировал задачу diff как поиск кратчайшего пути на графе редактирования (Edit Graph):
• Перемещение вправо по оси X соответствует удалению символа из строки A;
• Перемещение вниз по оси Y соответствует добавлению символа в строку B;
• Диагональное перемещение (x+1, y+1) бесплатно (символы совпадают).
Параметр D отражает минимальное количество вставок и удалений (различий). Если тексты похожи, D мало, и алгоритм Майерса находит кратчайший путь за время
O(N × D), что на порядки быстрее классической матрицы DP. Сравнение: построчный (Line) vs пословный (Word) diff
1. Построчный diff (Line-by-line): входной текст разбивается по символу перевода строки
\n. Идеально для программного кода, списков и конфигов;2. Пословный diff (Word-by-word): текст разбивается на слова регулярным выражением
\S+|\s+. Идеально для редактирования статей, копирайтинга и договоров, когда внутри длинного абзаца заменили всего 2–3 слова;3. Посимвольный diff (Character): применяется для исправления опечаток в коротких строках и токенах.
Попробуйте онлайн-инструменты по этой теме
Используйте бесплатные утилиты Utilora прямо в браузере без регистрации:
Сравнение текстов (Diff)
Построчное и пословное сравнение двух версий текста или кода с наглядной подсветкой добавленных и удалённых фрагментов.
Запустить ▸Онлайн-типограф
Автоматическая расстановка кавычек-ёлочек «», длинных тире —, неразрывных пробелов и подготовка текста к публикации.
Запустить ▸Удаление дубликатов
Очистка списков от повторяющихся строк, сортировка по алфавиту и удаление пустых строк.
Запустить ▸Часто задаваемые вопросы (FAQ)
Да, инструмент «Сравнение текстов» работает на 100% на стороне клиента (Client-Side JS). Ваши тексты не отправляются на сервер.
Unified view объединяет обе версии в единый поток, помечая добавленные строки префиксом «+» и зелёным фоном, а удалённые — префиксом «-» и красным фоном (как в git diff).
Откройте страницу «Сравнение текстов (Diff)» в разделе «Текст» на Utilora.ru, вставьте две версии и моментально увидите все отличия.