Где я могу найти алгоритм сравнения? - PullRequest
13 голосов
/ 12 мая 2010

Где найти объяснение и реализацию алгоритма diff?

Прежде всего я должен признать, что я не уверен, что это правильное название алгоритма. Например, как переполнение стека отмечает различия между двумя правками одного и того же вопроса?

PS: я знаю языки программирования C и PHP.

Ответы [ 2 ]

38 голосов
/ 12 мая 2010

На самом деле не существует такого понятия, как "алгоритм сравнения". Существует множество различных алгоритмов различий, и фактически используемые алгоритмы различий в некоторых случаях считаются бизнес-преимуществами конкретного инструмента различий.

Как правило, многие алгоритмы сравнения основаны на проблеме Longest Common Subsequence (LCS).

Оригинальная программа Unix diff 1970-х годов была написана Дагом Макиллрой и использует так называемый алгоритм Ханта-Макиллроя. Спустя почти 40 лет расширения и производные этого алгоритма все еще очень распространены.

Пару лет назад Брэм Коэн (создатель наиболее успешной программы обмена файлами и наименее успешной системы контроля версий) создал Patience Diff , который предназначен для получения более читабельных результатов, чем LCS. , Первоначально он был реализован в Bazaar VCS, а также добавлен в Git в качестве опции.

Однако, если вы не заинтересованы в исследовании алгоритмов различий, лучше всего было бы просто использовать некоторую существующую библиотеку различий, такую ​​как LibXDiff * Davide Libenzi , которая, например, используется Git. Я не был бы слишком удивлен, если бы уже было расширение PHP, оборачивающее это. Хорошей альтернативой является библиотека Google Diff-Match-Patch , которая используется, например, в Bespin или WhiteRoom и которая доступна для многих языков. Он использует алгоритм различий Мейерса, а также некоторую предварительную и последующую обработку для дополнительных ускорений.

Совершенно иной подход, если вас больше интересует слияние, а не диффузия, называется «Операционные преобразования». Идея OT состоит в том, что вместо выяснения различий между двумя документами вы пытаетесь «перепроектировать» операции , которые привели к этим различиям. Это позволяет значительно улучшить слияние, потому что вы можете «воспроизвести» эти операции. Они наиболее полезны для совместных редакторов в режиме реального времени, таких как EtherPad, Google Wave или SubEthaEdit.

8 голосов
/ 12 мая 2010

Что не так с википедией , где говорится, что это алгоритм Ханта-Макилроя ?

Существует OCR'd бумага , описывающая алгоритм (объяснение), и вы можете проверить источник (реализация).

Список связанных с этим вопросов (среди прочих):
«Лучший» алгоритм различий
Как работают алгоритмы сравнения документов?
Алгоритм различий
которые кажутся полезными.

...