Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм определения различий двух бинарных файлов 
:(
    Опции темы
En_t_end
Дата 18.12.2006, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



Алгоритм определения различий я себе представляю. Однако нужен алгоритм, способный эффективно определять различия при сдвиге информации, при вырезании и склеивании информации одного и того же файла. Т.е всё то, что делается для текстовых файлов, нужно делать для бинарных. Не знаю, каким образом эффективно можно это делать smile

Это сообщение отредактировал(а) En_t_end - 18.12.2006, 09:16
PM MAIL ICQ Skype GTalk Jabber   Вверх
maxim1000
Дата 18.12.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



в общем случае вставки и вырезания ловятся динамическим программированием

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

но проблема в том, что матрица размером в квадрат размера файла - очень большой объект
обработать его может оказаться просто нереально

в текстовом файле можно попробовать разбить на строки
в бинарном... не знаю... может, тоже рзделить на какие-нибудь части...


--------------------
qqq
PM WWW   Вверх
V.A.KeRneL
Дата 18.12.2006, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

Репутация: 1
Всего: 14



En_t_end, если есть время, то можешь попробовать разобраться с исходником программы cmp из пикета GNU diffutils. Имхо, там хороший алгоритм! smile

Если ты не пишешь проприетарную софтину, а разрабатываешь открытое ПО (распространяемое по лицензии GNU [L]GPL), пишешь прогу для себя, или тебе просто нужна эффективная утилита для сравнения своих файлов (с точки зрения пользователя), то можешь использовать код проекта GNU. В двух последних случаях можешь просто использовать команду cmp, если пользуешься юниксом.



--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
En_t_end
Дата 18.12.2006, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



V_A_KeRneL, 
Цитата(V_A_KeRneL @  18.12.2006,  17:06 Найти цитируемый пост)
 если есть время, то можешь попробовать разобраться с исходником программы cmp из пикета GNU diffutils. Имхо, там хороший алгоритм!

Мне говорили про неё. Но насколько мне известно, она работает эффективно только с текстовыми файлами.

maxim1000, 
Цитата(maxim1000 @  18.12.2006,  16:20 Найти цитируемый пост)

 но проблема в том, что матрица размером в квадрат размера файла - очень большой объект
обработать его может оказаться просто нереально

А что если использовать частичную загрузку в матрицу содержимого файлов ?
Вопрос, нужна ли нам вся матрица, т.е весь файл для обработки a(i,j)-го элемента матрицы ?

PM MAIL ICQ Skype GTalk Jabber   Вверх
skyboy
Дата 18.12.2006, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



Цитата(En_t_end @  18.12.2006,  19:02 Найти цитируемый пост)
Вопрос, нужна ли нам вся матрица, т.е весь файл для обработки a(i,j)-го элемента матрицы ?

если неполную матрицу обрабатывать - откуда можно быть уверенным, что путь действительно - кратчайший? или ты имеешь в виду - разрезать матрицу на набор "пересекающихся" матриц?
PM MAIL   Вверх
En_t_end
Дата 18.12.2006, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



skyboy, 
Хм... а вообще надо ли создавать матрицу ? недостаточно ли будет просто позиционироваться в файлах ?
maxim1000, 
Кстати, а как совместить этот метод с поиском различий ?
PM MAIL ICQ Skype GTalk Jabber   Вверх
esperant0
Дата 18.12.2006, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 714
Регистрация: 20.5.2005

Репутация: 4
Всего: 14



Определите формально, метрика различий при сдвиге.

А то если честно, не ясно что вам нужно. ;)


--------------------
 
 Student->Teacher Assistant ->Research assistant->Microsoft Software Development Engineer 

Пользователь получил наказание за то, что проигнорировал замечание которое было написано модератором  а затем стерто и которое он - пользователь не мог видеть. 
PM MAIL   Вверх
maxim1000
Дата 18.12.2006, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(En_t_end @  18.12.2006,  19:02 Найти цитируемый пост)
А что если использовать частичную загрузку в матрицу содержимого файлов ?
Вопрос, нужна ли нам вся матрица, т.е весь файл для обработки a(i,j)-го элемента матрицы ?

каждый столбец содержит достаточно информации для вычисления следующего
так что в памяти в каждый момент времени достаточно хранить два столбца (текущий и предыдущий)
если немного извернуться, то, пожалуй, можно будет обойтись одним + маленький буфер
конечно, если размер по горизонтали меньше, лучше работать через строки

но проблема в том, что _обработать_ надо будет всю матрицу, чтобы быть уверенным, что найден действительно кратчайший путь, хотя тут всё зависит от длины файлов, может, это и приемлимо

Цитата(En_t_end @  18.12.2006,  19:28 Найти цитируемый пост)
Кстати, а как совместить этот метод с поиском различий ?

если линия кратчайшего пути идёт под 45 градусов - данные куски совпадают
если вертикально - текущий кусок есть в вертикальном файле, но нет в горизонтальном
и наоборот
перемены местами таким способом не ловятся...


--------------------
qqq
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1549 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.