Вопрос
Как я могу реализовать diff
функция, такая как история изменений вопроса Stack Overflow?
Решение
У вас здесь есть пример javascript о реализации дифференциального алгоритма.
Основанный на:
P.Геккель, метод выделения различий между файлами Связь.ACM, 21, (4), 264--268 (1978).
Сама реализация имеет две функции, одна из которых рекомендуется к использованию:
diffString( String oldFile, String newFile )
Этот метод принимает две строки и вычисляет различия в каждой из них.Конечным результатом является 'newFile', помеченный HTML (для обозначения как удалений из старого файла, так и дополнений к новому файлу).
Другие советы
Я бы нашел код для утилиты FreeBSD diff и использовал его в качестве базового.Нет смысла заново изобретать колеса, когда лицензия допускает такого рода копирование.
Большинство алгоритмов основаны на LCS: Самая длинная общая подпоследовательность.Не очевидно, можно ли реализовать это эффективным способом.Вероятно, вы найдете различные реализации в Сети для разных языков.
Я думаю, единственным способом было бы сравнить каждый символ , образующий 2 строки .Что - то вроде этого :
void diff(String first,String second) {
int biggest = (first.length() > second.length()) ? first.length() : second.length();
for(int i = 0;i < biggest;i++) {
//compare each char from the longest string with each char from the shorter
// do something with them if they're not equal
}
}
Это всего лишь набросок того , как я бы это сделал .Все зависит от того , что вы хотите сделать с данными .
Если вам нужна история изменений, не изобретайте велосипед заново, начиная с diff.Просто перенесите все в систему управления версиями и используйте ее возможности diff и ведения журнала.Для простой линейной истории что-то столь же простое, как RCS сделаю.Или вы можете направить на него новейшую пушку и использовать мерзавец.
Большинство утилит diff выполняют построчное различие.Переполнение стека выполняет дословное различие.Для этого нужно что-то вроде вдифф это необходимо.Большинство систем контроля версий позволяют подключить утилиту diff.Из коробки, git diff --color-words
это удивительно близко к тому, что делается здесь.Немного повозившись с настройками, вы, вероятно, сможете заставить его выдать то, что вы затем сможете превратить в красивую веб-страницу.