бинарный diff для нескольких файлов
Полностью текст не читал, Нидлман-Вунш не подойдёт?
в чистом виде - нет. Только в качестве помощи при генерации идей. Спасибо за ссылку.
не хочу оказаться капитаном, но у Гасфилда описан линейный алгоритм нахождения множественной общей подстроки, если тебе это поможет
формализацию не читал. возможно помогут суффиксные деревья, которые все что угодно перемалывают за линейное время (я о поиске наибольшей общей подстроки у N строк)
Оставить комментарий
yroslavasako
Не найдя готового решения в H&S решил мигрировать топик сюда. Хочу написать сабж, в какую сторону стоит копать, к каким алгоритмам присмотреться?Некоторая формализация: есть n массивов бинарных данных с побайтовым доступом. Они все имеют общие элементы. Каждый из этих массивов необходимо представить как конкатенацию некоторых других подмассивов меньшей длинны. Необходимо сформировать набор таких подмассивов и таблиц их вхождения, чтобы за минимальную суммарную длину получить возможность воспроизвести все n исходных массивов.
Пусть - исходные массивы данных; - набор кодирующих элементов - бинарных массивов данных, условно назовём их словами; - правила кодирования каждого из массивов через последовательность слов. Они представляют собой последовательность индексов слов . Под значком я подразумевал конкатенацию значений. Таким образом кодирует запись массива через набор известных слов.
Понятное дело, недостаточно минимизировать суммарные размеры слов, иначе задача решалась тривиально введением алфавита в качестве множества слов, значит минимизировать нужно целевую функцию, учитывающую как размер словаря, так и длину кодирующих последовательностей. , где под операцией понимается взятие длины последовательности X. - некоторый параметр, влияющий на степень фрагментации решения, чем больше этот параметр, тем более крупные фрагменты будут получаться. По предварительным прикидкам стоит брать .
Я хочу не столько сократить размер файлов, храня их общие части и разницу, сколько выделить похожие и отличающиеся элементы. Поэтому вношу дополнительное условие, которое не сразу ясно из постановки задачи в общих словах.
Иными словами, я хочу найти общие куски, значит кусок, присутствующий хотя бы в двух массивах, должен присутствовать и в остальных
Судя по всему в полном объёме решение задачи может занять достаточно много времени, было бы целесообразно учитывать и время работы алгоритма и прочие затраченные ресурсы. Тут важно отметить, что мне решение задачи в моём случае не критично к потраченному времени, поскольку используется не для производственных целей вроде бекапа, а для анализа данных.
С условием вроде понятно отписался, кто какой вариант решения предложит?