f(A,B) = C, g(A,C) = B : SizeOf(C)<<SizeOf(B)~SizeOf(A); f-?,g-?

Тема в разделе "WASM.BEGINNERS", создана пользователем l_inc, 25 окт 2007.

  1. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Пусть есть данные A и B примерно одной структуры и примерно одного размера. Существуют ли стандартные алгоритмы (для общего случая, т.е. с заранее неизвестной структурой данных A и B), которые на основе данных A и данных B получают данные C, по которым с использованием данных A можно получить данные B? При этом условие, налагаемое на данные C, в том, что их размер должен быть в среднем на порядок меньше размера данных B (а лучше еще меньше), хотя в худших случаях может и достигать SizeOf(B) (но ни в коем случае не превышать). И есть ли реализация таких алгоритмов в API?
     
  2. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
  3. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    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
     
  4. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    ... или gzip
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mental_Mirror
    Да нет... точнее да, но не совсем. Моя формулировка задачи есть правильная. :)
    В общем конкретизирую задачу, дабы избежать сомнений в том, что мне хватает ума хотя бы правильно сформулировать вопрос.
    Я хочу передавать большие объемы данных по сети. Пусть как на стороне сервера, так и на стороне клиента уже есть данные A. Теперь задача заключается в том, чтобы передать данные B довольно большого объема. Так как данные A имеют примерно ту же структуру (а могут и вообще полностью совпадать), что и данные B, то вполне логично было бы их использовать для сжатия данных B (именно поэтому функция g принимает A в качестве параметра). В результате на основе данных A и B можно получить данные C (через искомую функцию f) минимизированного объема за счет использования данных A. Передав данные C, на другой стороне можно "расшифровать" эти данные с помощью уже находящихся там данных A.
    Т.е. ИМХО что-то вроде систем с закрытым ключом, но конечная цель - не шифрование, а сжатие.
     
  6. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    Тю! И надо біло такой огород городить! Все давно уже придумано - rsync.

    ЗЫ - Я понимаю, что rsync - это не то, что требовалось в задаче. Но! Результат задачи - уменьшить передаваемые данные - что rsync и делает.
     
  7. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Вообще говоря, они там есть _всегда_, так как никакая передача информации невозможна без общей (разделяемой) модели для источника и приемника.
    Под ваше описание задачи более всего подходит дельта-модуляция.
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Ultrin Faern
    Так а я ж и спрашивал о том, что уже придумано, удовлетворяющее вышеуказанным условиям. :)
    А теперь неплохо бы WinAPI, реализующие алгоритмы rsync. :)
    gazlan
    Аналогично для дельта-модуляции... есть ли WinAPI реализующие ее?
    Я говорил о конкретных данных A, имеющих сходный размер и структуру с данными B, а не просто какие-то произвольные разделяемые данные.
     
  9. roman_pro

    roman_pro New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    291
    Можно попробовать применить стандартную библиотеку сжатия zlib указав в качестве словаря данные A, на вход компрессора подав данные B и на выходе получив данные C.

    Т.е. получение данных C:
    Код (Text):
    1. deflateSetDictionary(A);
    2. C=deflate(B);
    Извлечение данных B, имея A и C:
    Код (Text):
    1. inflateSetDictionary(A);
    2. B=inflate(C);
    насчёт условия на размер данных C - надо смотреть на практике.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    roman_pro
    Классно. Буду пробовать. Спасибо за вариант.
     
  11. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    http://en.wikipedia.org/wiki/Delta_encoding
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    reverser
    Я читал соответствующие темы после того, как поступали предложения. Но мне уже не раз приходилось изобретать велосипед, а потом оказывалось, что у всех он уже есть и гораздо лучше. Поэтому на этот раз хотелось воспользоваться вылизанными Майкрософтом по скорости и степени сжатия API. Тем более, что я уверен, что винда должна использовать что-то подобное: дозагрузка немного изменившихся html-ок или удаленный рабочий стол или еще что-нибудь...
     
  13. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Только хотел написать "насколько я в курсе, публичного АПИ нет", но решил на всякий случай погуглить.
    http://msdn2.microsoft.com/en-us/library/ms811406.aspx
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    reverser
    Прям как по заказу. :) Работает правда вроде только с файлами.
    Спасибо.
    В общем, как до берусь до этой проблемы, попробую все советы. А то я это так... на будущее. :)
     
  15. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Я думаю хэндлы можно передавать любые, что поддерживают ReadFile. Пайпы, к примеру. Или MMF.