WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Подскажите чем лучше ужать....

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Подскажите чем лучше ужать....
Sourcer опубликован 09-01-2002 12:14 MSK   Click Here to See the Profile for Sourcer   Click Here to Email Sourcer  
Есть массив в 20 байт и мне его надо ужать ну хотябы в 2 раза. На первый взгляд кажется что зачем надо ужимать 20 байт, но проблема в том что таких фреймов будет в файле миллионы... И кажтся что не реально ужать такой маленький массив, но дело в том что в этом массиве 75% $00 ..
водскажите каким лучше алгоритмом всё это сжимать и так чтобы этот массив не распухал... тесть либо его размер оставался таким же или меньше...
eyes опубликован 09-01-2002 12:23 MSK     Click Here to See the Profile for eyes  Click Here to Email eyes     
Ну можно целиком файло ужать (любой алгоритм подойдет).

Для твоего случая (навскидку):
Структура... в начале DWORD (единица - есть данные, ноль - нету = 00);
После этого идет перечисление только тех циферь, которые не ноль

migel опубликован 09-01-2002 12:39 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
RLE пойдет наверно
Sourcer опубликован 09-01-2002 13:23 MSK     Click Here to See the Profile for Sourcer  Click Here to Email Sourcer     
2eyes:
Ну целиком нельзя файл жать...
к нему нужен очнь быстрый доступ

2migel:
RLE нето ...
там много нулей, но это не значет что они все подрят идут...

Flex Ferrum опубликован 09-01-2002 13:34 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Без распухания, ИМХО, не получится. А то, что предложил eyes во втором абзаце - вполне реально. Только в твоем случе достаточно 3-х байт. Кстати, 20 * 1000000 = ~20 MB - не так много.
eyes опубликован 09-01-2002 14:03 MSK     Click Here to See the Profile for eyes  Click Here to Email eyes     
2FlexFerrum: ну просто предложил простой метод... для оптимизаций - поле фантазий (если они нужны:)
stan опубликован 09-01-2002 14:19 MSK     Click Here to See the Profile for stan  Click Here to Email stan     
Первое, что пришло в голову: выделяешь 20 битов, у которых единицы выставляешь в тех местах, где данные нулевые. Далее выделяешь по пять битов, в которые пишешь места, где данные ненулевые, далее пишешь сами ненулевые данные. В детали сам не вникал...
Sourcer опубликован 09-01-2002 14:27 MSK     Click Here to See the Profile for Sourcer  Click Here to Email Sourcer     
Ну ладно...
всем спасибо ...
Student опубликован 09-01-2002 17:46 MSK     Click Here to See the Profile for Student  Click Here to Email Student     
А вот так:

typedef struct HEADER {
DWORD dwBitMask; // 32-bit: 20 младших бит показывают как расположены данные в массиве (т.е. если бит равен 0, то байт в этой позиции массива ноль и наоборот)
BYTE *bData; // ненулевые данные, размер в 8 старших битах dwBitMask
} *PHEADER;
Конечно, если ненулевых байтов >= 16, то этот метод уже не оптимален.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.