Re[2]: Кто автор алгоритма diff и WinDiff
От: RealBobEx  
Дата: 23.12.05 11:34
Оценка:
Здравствуйте, Imatic, Вы писали:

I>Для своих целей я решил реализовать это по-своему,

I>возможно это неэффективно, но работало хорошо: берется текстовый файл и строится
I>матрица равенства строк между собой, то есть каждая строка сравнивается с каждой.
I>Эта операция очень быстрая, поэтому сравнение производилось очень быстро.
I>в итоге, получается матрица такого вида(1, если строки равны, 0, если не равны):

I>
I>  здесь файлы равны
I>  1 0 0 0 0 0 0 0 0
I>  0 1 0 0 0 0 0 0 0
I>  0 0 1 0 0 0 0 0 0
I>  0 0 0 1 0 0 0 0 0
I>  0 0 0 0 1 0 0 0 0 
I>  0 0 0 0 0 1 0 0 0
I>  0 0 0 0 0 0 1 0 0
I>  0 0 0 0 0 0 0 1 0
I>  0 0 0 0 0 0 0 0 1


I>  здесь файлы неравны
I>  1 0 0 0 0 0 0 0 0
I>  0 1 0 0 0 0 0 0 0
I>  0 0 0 1 0 0 0 0 0 <- здесь строка вставлена
I>  0 0 0 0 1 0 0 0 0
I>  0 0 0 0 0 1 0 0 0
I>  0 0 0 0 0 0 0 0 0 <- здесь строка удалена
I>  0 0 0 0 0 0 1 0 0 
I>  0 0 0 0 0 0 0 0 0 <- здесь строка изменена
I>  0 0 0 0 0 0 0 0 1
I>


I>Вот, такой алгоритм. Анализируя эту матрицу можно узнать многое о сравнении двух текстов.

I>Может быть этот алгоритм далёк от оптимального, но для несложного приложения его вполне хватает.

I>Особенно не ругайте!

Никто ругать и не собирается .
Тем более, что такое решение — это первое что приходит в голову любому.
Мне тоже приходило. Оно хорошо тем что мы имеем дело с разреженной матрицей и значит можно применить любой из известных способов экономии памяти (например по Кнуту, хотя я предпочитаю в этом случае простой и эффективный класс SparseArray подробно описанный у Джефа Элджера).
Однако кажется мне, что тут потенциально есть ошибки распознавания редактирования.
Хотя я и не могу это доказать.
Например, там где Вы написали "<- здесь строка вставлена" может быть и просто редактирование.
Представьте, что есть подряд идущие опеарации вставка-редактирование-удаление-редактирование и т.п.

Вобще построение такой матрицы, это изначальная идея, которая в конце концов привела к весьма изящному алгоритму нахождение Longest Common Subsequence Вагнера — Фишера (известен под названием "динамическое программирования")

А вообще, по поводу скорости и памяти, можно сказать, что мое приложение должно быть очень быстрым и главное — обрабатывать пары файлов не меньше 10 Мб не сжирая при этом всю доступную системе память (а так делают некоторые коммерч. продукты) в разумное время, т.е. не больше чем O(m*n).
Поэтому держать живьем матрицы в памяти я не могу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.