Здравствуйте, 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).
Поэтому держать живьем матрицы в памяти я не могу.