реклама на сайте
подробности

 
 
> Упаковка данных (сжатие данных), Упаковка данных (сжатие данных)
satnettv
сообщение Sep 5 2007, 10:22
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 8-08-07
Из: MockBa
Пользователь №: 29 658



Задача в следующем:

требуется простой пример упаковки (сжатия) данных (например, строку из 80 символов сжимать до 30) на каком-нибудь примере, написанном на Си. Пишу на code vision, с ассемблером не в ладах.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 18)
bzx
сообщение Sep 5 2007, 10:55
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528



Цитата(satnettv @ Sep 5 2007, 14:22) *
Задача в следующем:

требуется простой пример упаковки (сжатия) данных (например, строку из 80 символов сжимать до 30) на каком-нибудь примере, написанном на Си. Пишу на code vision, с ассемблером не в ладах.

1. Хотьи старо, но рекомендую потратить время и почитать что-нибудь о “сжатии без потерь”, либо погуглить.
2. Алгоритмы сжатия зависят от типа информации. Я так понимаю, что у тебя в качестве данных текстовая информация. Это намного упрощает. Самый простой и тупой способ - замена одинаковых подряд идущих символов на количество повторов. Например, имеется строка
7892222222222368
после сжатия
789[at][10]268
[at] – управляющий символ
[10] – число в двоичном виде, количество символов повтора, для данного примера это десять двоек.


--------------------
Для связи email: info собака qbit.su
Go to the top of the page
 
+Quote Post
Guest_=AVR=_*
сообщение Sep 5 2007, 11:33
Сообщение #3





Guests






Примитивное сжатие типа посоветованного выше обычно называется RLE - Run-Length Encoding. Алгоритм хорошо ложится на АВР, но результат будет очень сильно зависеть от типа входных данных - иногда экономия может оказаться нулевой
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 5 2007, 11:40
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(satnettv @ Sep 5 2007, 13:22) *
требуется простой пример

"Простые" не жмут абстрактые текстовые строки почти в три раза.
Да и сложные тоже без всяких гарантий. Попробуйите кучку Ваших реальных строк пожать, например, RAR-ом который совсем не прост и даже словарь которого ни в какую AVR не влезет.
Где-то шансы есть при явном ограничении набора символов, их перекодировке в соответствии с вероятностью использования с последующим сжатием чем-то простым классическим зипообразным.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
mse
сообщение Sep 5 2007, 12:36
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



есть такой алгоритм - RADIX-50, по-мойму. Упаковывает 3 ASCII символа басурманских, в 2. На заре юности реализовывал. На СМ-ках использовался. BRU, была такая ленточная сисьтемка. Щас, ессно, реализаццыю не вспомню. Гуголь рулит...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 5 2007, 12:53
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(mse @ Sep 5 2007, 15:36) *
Упаковывает 3 ASCII символа басурманских, в 2

Ну это очевидно. Вопрошающий хотел 3 в ОДИН и "басурманскими" ограничиваться не обещал... smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
mse
сообщение Sep 5 2007, 13:10
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(zltigo @ Sep 5 2007, 16:53) *
Ну это очевидно. Вопрошающий хотел 3 в ОДИН и "басурманскими" ограничиваться не обещал...

А это, в общем случае, фигня. На 80-символьной строке даже нормальный алгоритм сжатия больше 30-40% не даст, для случайной последовательности.
Go to the top of the page
 
+Quote Post
SpyBot
сообщение Sep 5 2007, 14:30
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 285
Регистрация: 5-11-05
Пользователь №: 10 491



Да, и кстати есть небольшая но очень интересная книга
http://www.compression.ru/book/
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 5 2007, 19:57
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Я реализовывал алгоритмы компрессии/декомпрессии. Для начала написал их на IBM чтобы оценить эффективность и отработать алгоритм.

Выводы следующие:
1) Если использовать метод заполнения словаря, то вам потребуется не менее 2К озу под словарь.
Если использовать предустановленный словарь, то вам придётся выполнить серьёзный предварительный анализ ваших данных для формирования словаря.
2) Декомпрессия выполняется достаточно просто и CPU загружает не очень сильно. Компрессия значительно загружает проц. И в том и в другом случае применение AVR всётаки не оправдано. Если только очень медленные процессы.

Здесь, наверное уместен какой-нибудь ARM.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 5 2007, 20:11
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(mse @ Sep 5 2007, 17:10) *
А это, в общем случае, фигня. На 80-символьной строке даже нормальный алгоритм сжатия больше 30-40% не даст, для случайной последовательности.

Случайная последовательность байтов (независимых и с равномерным распределением) не может быть сжата никаким алгоритмом. Ни на 30%, ни на 1%, нисколько.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 5 2007, 20:56
Сообщение #11


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(mse @ Sep 5 2007, 14:36) *
есть такой алгоритм - RADIX-50, по-мойму. Упаковывает 3 ASCII символа басурманских, в 2.
...
Гуголь рулит...
Может, я на что сгожусь? (заместо гуглы wink.gif )
Он же не "сжимал", а "упаковывал". Три символа из очень ограниченного набора - большие латинские буквы, цифры и ещё несколько знаков (вот тут уже гуглу спрашивайте) - всего вместе 40 символов - упаковывались в 16-битное слово.
40*40*40 = 64000 возможных комбинации, в аккурат в 65536 влазит.

p.s. RADIX-50.... 50oct = 40dec, в 16 бит записывалось 3-значное число "по основанию 40"


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 6 2007, 00:12
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(scifi @ Sep 5 2007, 23:11) *
Случайная последовательность байтов (независимых и с равномерным распределением) не может быть сжата никаким алгоритмом. Ни на 30%, ни на 1%, нисколько.


Должна сжаться примерно в два раза. Это и подтверждается на упаковщиках.

Всё сжимается до каких то пределов. Критерии несжимаемости файлов не байтовые, а битовые. Вводится понятие энтропии и т.д. Понятие "равномерное распределение байтов" не совсем корректно, что значит "независимый байт" - убей не знаю. Я думаю на любом двоичном файле вы получите распределение близкое к равномерному. Имеет значение не само распределение, а последовательность следования. Также вы не учитываете "предустановленный словарь". Иными словами если словарь будет передаваться в самих данных, то это одно, а если он не будет передаваться, то совсем другое.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 6 2007, 00:49
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Да??? Сожмите-ка эту случайную последовательность: Прикрепленный файл  512k.txt ( 64 килобайт ) Кол-во скачиваний: 210


UPD: Это был ответ на пост выше, но его уже исправили. Мне вот что интересно: кто успел скачать эту бредятину 4 раза за 10 минут? 07.gif

Цитата(SasaVitebsk @ Sep 6 2007, 04:12) *
Я думаю на любом двоичном файле вы получите распределение близкое к равномерному.

Отнюдь нет.
Большинство современных упаковщиков работают в два этапа: на первом данные упаковываются каким-нибудь LZ-подобным алгоритмом, затем Хаффманом.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 6 2007, 01:10
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(aaarrr @ Sep 6 2007, 03:49) *
Да??? Сожмите-ка эту случайную последовательность: Прикрепленный файл  512k.txt ( 64 килобайт ) Кол-во скачиваний: 210


UPD: Это был ответ на пост выше, но его уже исправили. Мне вот что интересно: кто успел скачать эту бредятину 4 раза за 10 минут? 07.gif
Отнюдь нет.
Большинство современных упаковщиков работают в два этапа: на первом данные упаковываются каким-нибудь LZ-подобным алгоритмом, затем Хаффманом.


1. Эту бредятину продолжают качать и качать. smile.gif Насколько я понимаю аналогичную легко получить любым упаковщиком. smile.gif
2. Не буду с вами спорить потому, что нет времени аргументировать. По моему файл заполненный примерно так 0,1,2,3....ff,0,1,2.. и так раз 10 даст равномерное распределение. При этом сожмётся как положено.
3. Ваш файл можно сжать и соответственно разжать без потери информации. Правда, естественно, если вы сгенерируете другой с помощью того же упаковщика возможно он разбухнет. Я просто уточнял, что всё не так просто. И для однозначного ответа не достаточно информации.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 6 2007, 01:21
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(SasaVitebsk @ Sep 6 2007, 05:10) *
1. Эту бредятину продолжают качать и качать. smile.gif Насколько я понимаю аналогичную легко получить любым упаковщиком. smile.gif

Можно упаковщиком. Бредятина создана генератором случайных чисел.

Цитата(SasaVitebsk @ Sep 6 2007, 05:10) *
2. Не буду с вами спорить потому, что нет времени аргументировать. По моему файл заполненный примерно так 0,1,2,3....ff,0,1,2.. и так раз 10 даст равномерное распределение. При этом сожмётся как положено.

Ага, LZ отработает со свистом. Вот только у "любого" файла распределение бывает, как правило, неравномерным.

Цитата(SasaVitebsk @ Sep 6 2007, 05:10) *
3. Ваш файл можно сжать и соответственно разжать без потери информации.

Сжать? У меня вот не получается, не знаю, как у других smile.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 6 2007, 08:53
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(aaarrr @ Sep 6 2007, 04:21) *
Сжать? У меня вот не получается, не знаю, как у других smile.gif

Если использовать свой упаковщик, с предустановленной таблицей ориентированной на ваш файл. Так чтобы таблица не передавалась. smile.gif

Хотя понятно что это не нужно. Но я говорю о принципе. Если данные идут несжимаемые, но предсказуемые (например известен механизм их формирования), то формируется таблица исходя из этих данных.
Go to the top of the page
 
+Quote Post
proba
сообщение Sep 10 2007, 08:14
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 358
Регистрация: 29-05-05
Пользователь №: 5 526



использую LZW для передачи текстовои информации с логгера в PC. данные накопляются в датафлеш и передаются одним сеансом связи. сотнощение 3 : 1 . пример, данных 10120 б, в сжатом виде 3231 б.
алгоритм несложныи но требуется порядка 32K RAM.
при коротком строке вряд ли зaметного сжатия будет.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 10 2007, 11:40
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(proba @ Sep 10 2007, 11:14) *
использую LZW для передачи текстовои информации с логгера в PC. данные накопляются в датафлеш и передаются одним сеансом связи. сотнощение 3 : 1 . пример, данных 10120 б, в сжатом виде 3231 б.
алгоритм несложныи но требуется порядка 32K RAM.
при коротком строке вряд ли зaметного сжатия будет.

А словарь по ходу формируешь?
В смысле каждый сеанс с пустого словаря начинаешь?
Или взял предустановленный?

И что-то 32к многовато получилось. У меня что-то около 10 выходило.

Алгоритм несложный, но самое главное - поиск.
Go to the top of the page
 
+Quote Post
proba
сообщение Sep 10 2007, 13:20
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 358
Регистрация: 29-05-05
Пользователь №: 5 526



посмотрел код, деиствительно RAM нужен 20k а не 32к.
каждыи раз начинаю с пустого словаря.
обьем его 4099 слов - почему то с 2048 были проблемы ( может даже в приемнои стороне в PC ).
алгоритм требует 5x (обьем словаря) баит RAM. т.е. в моем случае 20KB.
исползовал исходники от Mark Nelson.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 21:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.0151 секунд с 7
ELECTRONIX ©2004-2016