Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм вычисления разницы между массивами 
V
    Опции темы
semibug
Дата 14.6.2009, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Приложение "A" регулярно запрашивает у приложения "B" некоторый набор байт, отражающий состояние приложения "B" (условно время на часах, температура процессора, наличие свободного места на жестком диске и т.д.). Ответ имеет фиксированную длину и формат (парсится приведением указателя на полученный набор байт к структуре, что не важно).
В целях экономии трафика между приложениями (допустим, связь между ними построена посредством сокетов, а сами приложения находятся на разных материках) хотелось бы возвращать от приложения "B" не целиком состояние, а только изменившуюся часть (предполагается, что таких изменений обычно немного).
В общем нужен алгоритм, сравнивающий разницу между прошлым и настоящим значениями набора байт и генерирующий последовательность байт на этой основе, по которой принимающая сторона однозначно восстановит настоящее значение.

Какбэ понятна реализация в простейшем случае, по сему прошу предлагать алгоритмы с изюминкой.
PM   Вверх
jonie
Дата 14.6.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



ну тык передавай маркер+{"смещение в структуре,новое значение"} пары. Где маркер описывает: либо мы пеердаем всю инфу, либо части (например можно в нем же передавать id прошлого состояния а на сервере запоминать не одно предыдущее состояние, а например 100 их). Ну а сравнение, это фигня уже (по байтам черт возьми)). Только я сомневаюсь что это даст такую уж огромную экономию трафика.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
andrew_121
Дата 14.6.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Сохраняй ранее отправленный массив. А при отправке следующего, сравнивай, сравнивай, извлекай разницу, отправляй.

Это сообщение отредактировал(а) andrew_121 - 14.6.2009, 12:42


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
W4FhLF
Дата 14.6.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Цитата(semibug @  14.6.2009,  01:57 Найти цитируемый пост)
некоторый набор байт


А примерный объём данных можно озвучить? 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
zim22
Дата 14.6.2009, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 24
Всего: 69



Цитата(semibug @  14.6.2009,  01:57 Найти цитируемый пост)
Приложение "A" регулярно запрашивает у приложения "B" некоторый набор байт,

если по протоколу UDP данные будут передаваться - необходимо будет удостовериться в их корректности. т.е. использовать бит чётности или ещё какой-то механизм.


--------------------
PM MAIL   Вверх
semibug
Дата 14.6.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



andrew_121, 
Цитата(andrew_121 @  14.6.2009,  12:40 Найти цитируемый пост)
Сохраняй ранее отправленный массив. А при отправке следующего, сравнивай, сравнивай, извлекай разницу, отправляй.

Собственно в каком минимальном виде передать эту разницу и стоит вопрос.
Если
Цитата(jonie @  14.6.2009,  12:20 Найти цитируемый пост)
"смещение в структуре,новое значение"

то, кажется, будет передаваться избыточная информация.


W4FhLF, 
Цитата(W4FhLF @  14.6.2009,  12:51 Найти цитируемый пост)
А примерный объём данных можно озвучить?  

Около 200 байт. В общем случае для универсальности пытаюсь не обращать на это внимание.

zim22, 
Цитата(zim22 @  14.6.2009,  13:13 Найти цитируемый пост)
если по протоколу UDP данные будут передаваться - необходимо будет удостовериться в их корректности. т.е. использовать бит чётности или ещё какой-то механизм. 

Пока предусмотрена контрольная сумма по модулю 2, возможно, кончено, имеет смысл crc32 или другой более достоверный метод.

Сейчас применяю следующую схему ( некий упрощенный гибрид дельта кодирования и RLE компрессии ).
1. На отправляющей стороне генерирую новый массив - побайтовую разницу между предыдущим значением (изначально это нули) и текущим.
2. Полученный массив имеет большое кол-во нулевых значений, так как многие исходные данные не изменились.
3. Теперь кодируем полученный массив с помощью последовательностей - <1 байт длины>< n-кол-во исходных байт >, <1 байт кол-во пробелов-нулей>, опять <1 байт длины>< n-кол-во исходных байт > и <1 байт кол-во пробелов-нулей>. Т.е. области со значением 0 заменяются байтом, обозначающим их количество.
4. На принимаемой стороне этих данных достаточно для восстановления исходного значения массива.
Получение разницы и сжатие заменой нулевых последовательностей может быть произведено циклом в один проход.




Это сообщение отредактировал(а) semibug - 14.6.2009, 13:42
PM   Вверх
zim22
Дата 14.6.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

Репутация: 24
Всего: 69



Цитата(semibug @  14.6.2009,  01:57 Найти цитируемый пост)
Приложение "A" регулярно запрашивает у приложения "B" некоторый набор байт, отражающий состояние приложения "B" (условно время на часах, температура процессора, наличие свободного места на жестком диске и т.д.)

а нужно ли его регулярно опрашивать? пусть приложение B само сообщает при изменении своих показателей


--------------------
PM MAIL   Вверх
W4FhLF
Дата 14.6.2009, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Цитата(semibug @  14.6.2009,  13:39 Найти цитируемый пост)
3. Теперь кодируем полученный массив с помощью последовательностей - <1 байт длины>< n-кол-во исходных байт >, <1 байт кол-во пробелов-нулей>, опять <1 байт длины>< n-кол-во исходных байт > и <1 байт кол-во пробелов-нулей>. Т.е. области со значением 0 заменяются байтом, обозначающим их количество.


Либо я не понял, либо здесь действительно могут возникать неопределённости. 

Как определить, с чего начинается последовательность, с <1 байт кол-во пробелов-нулей> или <1 байт длины>? Насколько я понял может начинаться и с того и с другого? 

Я предлагаю передавать так: id:data, где id - идентификатор параметра, data - данные параметра. Ессно передавать только изменившиеся параметры. 

id = 1 байт (т.е. до 256 параметров)
data = n, где n - объём данных того типа, которому соответствует id

Такая схема избыточна, если количество изменяющихся параметров примерно равно количеству параметров в целом. 



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
semibug
Дата 14.6.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



W4FhLF, 
Цитата(W4FhLF @  14.6.2009,  14:36 Найти цитируемый пост)
Как определить, с чего начинается последовательность, с <1 байт кол-во пробелов-нулей> или <1 байт длины>? Насколько я понял может начинаться и с того и с другого? 

Начинается (хотя можно и наоборот) с последовательности байт, чередуется с нулевыми последовательностями. соответственно если нужно пропустить в самом начале последовательность значимых байт (и не только) ставим нулевую длину.


Цитата(W4FhLF @  14.6.2009,  14:36 Найти цитируемый пост)
Я предлагаю передавать так: id:data, где id - идентификатор параметра, data - данные параметра. Ессно передавать только изменившиеся параметры. 

id = 1 байт (т.е. до 256 параметров)
data = n, где n - объём данных того типа, которому соответствует id

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

zim22, 
Цитата(zim22 @  14.6.2009,  14:00 Найти цитируемый пост)
а нужно ли его регулярно опрашивать? пусть приложение B само сообщает при изменении своих показателей 

Ну в общем то большого значения не имеет, пусть даже приложение "B" само сообщает изменения без лишних запросов, все равно задача сократить объем этих данных. (здесь экономия только на запросе, который может иметь минимальную длину.

Это сообщение отредактировал(а) semibug - 14.6.2009, 14:54
PM   Вверх
W4FhLF
Дата 14.6.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Цитата(semibug @  14.6.2009,  14:52 Найти цитируемый пост)
Согласен, то же неплохой вариант, но он привязан к формату данных (к размеру параметров), т.е. их изменении придется корректировать код, определяющий адреса и размеры параметров.


Ну в твоём случае типы и их размеры тоже должны быть известны приложениям "А" и "B", но ты к тому же их ещё и передаёшь. В моём случае поток данных выглядит следующим образом:

n id2:data_1 id5:data_2 ... id8:data_n

Причём порядок следования параметров неважен. А в твоём случае, я так понял, он "зашит" намертво в протокол. Адреса, размер... Тут тоже достаточно знать id, всё остальное становится известно. 

Это сообщение отредактировал(а) W4FhLF - 14.6.2009, 15:12


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
semibug
Дата 14.6.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



W4FhLF, 
Цитата(W4FhLF @  14.6.2009,  15:11 Найти цитируемый пост)
Ну в твоём случае типы и их размеры тоже должны быть известны приложениям "А" и "B"

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

Код

#pragma pack(1)
struct Data
{
    BYTE   Val0;
    DWORD  Val1;
    WORD  Val2[4];
};
#pragma pack()


Далее приводим адрес на буфер с принятыми данными к указателю на эту структуру и получаем через него нужные значения (не думая о адресах и размерах).
Пи необходимости добавить новое поле данных оно вписывается в эту структуру.

Теперь посмотрим как распарсить принятые по схеме
Цитата(W4FhLF @  14.6.2009,  15:11 Найти цитируемый пост)
n id2:data_1 id5:data_2 ... id8:data_n

данные. Возможно ошибаюсь, но выходит, что через условия (switch), где для каждого ID параметра нужна ветка, выбирающая адрес и размер данных, для того чтобы иметь возможность их использовать. Ну как вариант задать массив и выбирать по индексу.
В этому случае при изменении кол-ва и размеров передаваемых параметров имеем большое поле для совершения ошибок. В отличии от алгоритма не привязанного к формату исходных  данных.

Цитата(W4FhLF @  14.6.2009,  15:11 Найти цитируемый пост)
Причём порядок следования параметров неважен

Сомнительная польза.


Это сообщение отредактировал(а) semibug - 14.6.2009, 15:41
PM   Вверх
W4FhLF
Дата 14.6.2009, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Цитата(semibug @  14.6.2009,  15:31 Найти цитируемый пост)
В отличии от алгоритма не привязанного к формату исходных  данных.


Алгоритм, описанный вами выше, точно так же к ним привязан. Т.е. для кодирования необходимо знать и формат, и размеры все параметров. 

Цитата(semibug @  14.6.2009,  15:31 Найти цитируемый пост)
Возможно ошибаюсь, но выходит, что через условия (switch), где для каждого ID параметра нужна ветка


Если на С пишите, то не ошибаетесь в прицнипе) 

В целом я согласен, мой вариант менее гибок и масштабируем. Он он более экономичен. 



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
semibug
Дата 14.6.2009, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



W4FhLF, 
Цитата(W4FhLF @  14.6.2009,  15:58 Найти цитируемый пост)
Алгоритм, описанный вами выше, точно так же к ним привязан. Т.е. для кодирования необходимо знать и формат, и размеры все параметров. 

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


Цитата(W4FhLF @  14.6.2009,  15:58 Найти цитируемый пост)
Если на С пишите, то не ошибаетесь в прицнипе) 

Поделитесь пожалуйста как могла бы выглядеть реализация на плюсах разбора вашего потока.


Это сообщение отредактировал(а) semibug - 14.6.2009, 16:19
PM   Вверх
jonie
Дата 14.6.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



мда... 200 байт, я думал пару гиг информации нужно прокаичивать. Имхо вы занимаетесь преждевременной оптимизацией.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
fry
Дата 14.6.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



200 байт, оптимизация обмена smile .  Уважаемый автор, вы будите оптимизировать то, что и так передастся одним пакетом (можно передавать до ~1,5КБ). Вы все равно, не больше не меньше, передадите этот пакет, хоть с оптимизацией, хоть без нее. Выигрыш в трафике на таком объеме информации с передачей разницы в данных будет слишком малым для того, чтобы задумываться над этим.

ЗЫ Также, нельзя говорить о 200 байтах без упоминания частоты отправки, т.е. трафика данных, необходимого для работы приложения. В случае датчиков, например, температуры, в большенстве случаев нет смысла передавать даные очень часто, а в масштабах сети интернет (про разные материки) и вовсе не имеет смысла т.к. скорость передачи будет непредсказуема (соответственно и задержки тоже). Т.е. в данном случае ответ однозначен. smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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