Короче мне делать нехуя буду писать свой архиватор для похожих файлов.
Алгоритм такой: первым прогоном создаём словарь блоков, но не прям целых блоков а голов и хвостов блоков и ищем в потоке предыдущие встреченые блоки, то есть создаём статистику вероятных совпадений, потом по этой статистике разбиваем всю пачку файлов на родственные группы. Вторым прогоном каждую родственную группу пакуем дедуплицируя блоки (с помощью статистики по все офсетам) дефлейтом, пока пакуем придётся полный словарь создать (в этом месте я сосу), выгружаем из памяти полный словарь, пакуем следующую группу. Короч главная проблема - как не съесть всю память. Ещё можно не выёбываться и просто дельты паковать. Надо ещё про PPMd почитать, может это оно и есть.
а) текстовый дамп тебе привычный архиватор ещё лучше сожмёт универсальным алгоритмом прямо сейчас; б) для диффа важнее память до бесконечности не жрать и по файлам туда-сюда миллион раз не возить (это и формата вывода касается), а вовсе не теоретически минимальный результат выдавать, см. https://wiki.c2.com/?DiffAlgorithm
@anonymous Эт-то любой дурак сможет. Пускай на 128 КБ памяти всё делает.