Пусть есть данные A и B примерно одной структуры и примерно одного размера. Существуют ли стандартные алгоритмы (для общего случая, т.е. с заранее неизвестной структурой данных A и B), которые на основе данных A и данных B получают данные C, по которым с использованием данных A можно получить данные B? При этом условие, налагаемое на данные C, в том, что их размер должен быть в среднем на порядок меньше размера данных B (а лучше еще меньше), хотя в худших случаях может и достигать SizeOf(B) (но ни в коем случае не превышать). И есть ли реализация таких алгоритмов в API?
l_inc Конечно, чуток как-то ... эмм ... через жопу Ну в общем я понял, что f - функция сжатия пусть конкатинированных структур, С - сжатые данные. g - функция для распаковки, и A ей не нужен. C размерами данных понятно и это условия исполняется. В итоге вот что получается - f(A,B) = C, g(C) = A+B, : SizeOf(C)<<SizeOf(B)~SizeOf(A); f-?,g-? Тут очевидно можно эту задачу перевесьти в Вашу, т.к. 1) Если функции g() требуется меньше аргументов - это замечательно 2) Она все равно дает тот результат который нужен, пусть с мусором в виде A, ну это можно исправить. API - LZEXPAND
Mental_Mirror Да нет... точнее да, но не совсем. Моя формулировка задачи есть правильная. В общем конкретизирую задачу, дабы избежать сомнений в том, что мне хватает ума хотя бы правильно сформулировать вопрос. Я хочу передавать большие объемы данных по сети. Пусть как на стороне сервера, так и на стороне клиента уже есть данные A. Теперь задача заключается в том, чтобы передать данные B довольно большого объема. Так как данные A имеют примерно ту же структуру (а могут и вообще полностью совпадать), что и данные B, то вполне логично было бы их использовать для сжатия данных B (именно поэтому функция g принимает A в качестве параметра). В результате на основе данных A и B можно получить данные C (через искомую функцию f) минимизированного объема за счет использования данных A. Передав данные C, на другой стороне можно "расшифровать" эти данные с помощью уже находящихся там данных A. Т.е. ИМХО что-то вроде систем с закрытым ключом, но конечная цель - не шифрование, а сжатие.
Тю! И надо біло такой огород городить! Все давно уже придумано - rsync. ЗЫ - Я понимаю, что rsync - это не то, что требовалось в задаче. Но! Результат задачи - уменьшить передаваемые данные - что rsync и делает.
Вообще говоря, они там есть _всегда_, так как никакая передача информации невозможна без общей (разделяемой) модели для источника и приемника. Под ваше описание задачи более всего подходит дельта-модуляция.
Ultrin Faern Так а я ж и спрашивал о том, что уже придумано, удовлетворяющее вышеуказанным условиям. А теперь неплохо бы WinAPI, реализующие алгоритмы rsync. gazlan Аналогично для дельта-модуляции... есть ли WinAPI реализующие ее? Я говорил о конкретных данных A, имеющих сходный размер и структуру с данными B, а не просто какие-то произвольные разделяемые данные.
Можно попробовать применить стандартную библиотеку сжатия zlib указав в качестве словаря данные A, на вход компрессора подав данные B и на выходе получив данные C. Т.е. получение данных C: Код (Text): deflateSetDictionary(A); C=deflate(B); Извлечение данных B, имея A и C: Код (Text): inflateSetDictionary(A); B=inflate(C); насчёт условия на размер данных C - надо смотреть на практике.
reverser Я читал соответствующие темы после того, как поступали предложения. Но мне уже не раз приходилось изобретать велосипед, а потом оказывалось, что у всех он уже есть и гораздо лучше. Поэтому на этот раз хотелось воспользоваться вылизанными Майкрософтом по скорости и степени сжатия API. Тем более, что я уверен, что винда должна использовать что-то подобное: дозагрузка немного изменившихся html-ок или удаленный рабочий стол или еще что-нибудь...
Только хотел написать "насколько я в курсе, публичного АПИ нет", но решил на всякий случай погуглить. http://msdn2.microsoft.com/en-us/library/ms811406.aspx
reverser Прям как по заказу. Работает правда вроде только с файлами. Спасибо. В общем, как до берусь до этой проблемы, попробую все советы. А то я это так... на будущее.