Я выгляжу как сумасшедший для объяснения алгоритма сравнения, который работает и эффективен.
Самое близкое, что я получил, - это ссылка на RFC 3284 (из нескольких сообщений в блоге Эрика Синка), которая в понятной форме описывает формат данных, в котором хранятся результаты сравнения. Тем не менее, в нем ничего не сказано о том, как программа достигла бы этих результатов при выполнении различий.
Я пытаюсь исследовать это из личного любопытства, потому что я уверен, что при реализации алгоритма diff должны быть компромиссы, которые иногда довольно понятны, когда вы смотрите на diff и задаетесь вопросом: «Почему программа diff выбрала это как изменение? вместо этого?"...
Где я могу найти описание эффективного алгоритма, который в конечном итоге выведет VCDIFF?
Кстати, если вы обнаружите описание фактического алгоритма, используемого DiffMerge SourceGear, это было бы еще лучше.
ПРИМЕЧАНИЕ: самая длинная общая подпоследовательность, кажется, не является алгоритмом, используемым VCDIFF, похоже, что они делают что-то более умное, учитывая формат данных, который они используют.
Ответы:
Разностный алгоритм O (ND) и его вариации - фантастическая статья, и вы можете начать с нее. Он включает в себя псевдокод и красивую визуализацию обхода графа, участвующего в выполнении diff.
Раздел 4 статьи представляет некоторые усовершенствования алгоритма, которые делают его очень эффективным.
Успешная реализация этого предоставит вам очень полезный инструмент в вашем наборе инструментов (и, возможно, некоторый отличный опыт).
Генерирование выходного формата, которое вам нужно, иногда может быть сложным, но если вы разбираетесь во внутренних принципах алгоритма, тогда вы сможете вывести все, что вам нужно. Вы также можете ввести эвристику, чтобы повлиять на выход и сделать определенные компромиссы.
Вот страница, которая включает немного документации, полный исходный код и примеры алгоритма сравнения с использованием методов в вышеупомянутом алгоритме.
Исходный код , как представляется , внимательно следить за основной алгоритм и легко читается.
Также есть немного о подготовке входных данных, которые могут оказаться полезными. Существует огромная разница в выводе, когда вы выполняете различие по символу или токену (слову).
Удачи!
источник
diff
статью Unix Ханта и Макилроя.Я бы начал с рассмотрения фактического исходного кода для diff, который GNU делает доступным .
Для понимания того, как на самом деле работает этот исходный код, документы в этом пакете ссылаются на статьи, которые его вдохновили:
Чтение статей, а затем поиск исходного кода для реализации должно быть более чем достаточно, чтобы понять, как это работает.
источник
См. Https://github.com/google/diff-match-patch.
Также см. Страницу Diff wikipedia.org и - « Брэм Коэн: проблема различий решена »
источник
Я пришел сюда в поисках алгоритма сравнения и впоследствии сделал свою собственную реализацию. Извините, я не знаю о vcdiff.
Википедия : Из самой длинной общей подпоследовательности это всего лишь маленький шаг для получения различий в выводе: если элемент отсутствует в подпоследовательности, но присутствует в оригинале, он должен быть удален. (Отметки «-» ниже.) Если он отсутствует в подпоследовательности, но присутствует во второй последовательности, он должен быть добавлен в (отметки «+».)
Хорошая анимация алгоритма LCS здесь .
Ссылка на быструю реализацию LCS ruby здесь .
Моя медленная и простая рубиновая адаптация ниже.
источник
Судя по ссылке, которую дал Эммелайх, на сайте Нила Фрейзера (один из авторов библиотеки) также есть множество статей о Diff Strategies .
Он охватывает основные стратегии и в конце статьи переходит к алгоритму Майера и некоторой теории графов.
источник