В настоящее время я понимаю, что лучшим решением проблемы Shortest Edit Script (SES) является метод Майерса "средняя змея" с уточнением линейного пространства Хиршберга.
Алгоритм Майерса описан в:
E. Майерс, `` O (ND) Разница
Алгоритм и его вариации, ''
Algorithmica 1, 2 (1986), 251-266.
Утилита GNU diff использует алгоритм Майерса.
«Оценка сходства», о которой вы говорите, в литературе называется «расстоянием редактирования», которое представляет собой количество вставок или удалений, необходимое для преобразования одной последовательности в другую.
Обратите внимание, что ряд людей привел алгоритм расстояния Левенштейна, но он, хотя и прост в реализации, не является оптимальным решением, поскольку он неэффективен (требует использования, возможно, огромной матрицы n * m) и не обеспечивает «скрипт редактирования», который представляет собой последовательность правок, которую можно использовать для преобразования одной последовательности в другую и наоборот.
Для хорошей реализации Майерса / Хиршберга посмотрите:
http://www.ioplex.com/~miallen/libmba/dl/src/diff.c
Конкретная библиотека, в которой она содержится, больше не поддерживается, но, насколько мне известно, сам модуль diff.c по-прежнему корректен.
Mike