Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Сжать!


Автор: NoeR 13.7.2005, 23:11
Два вопроса в одном:
Как сжать текст и как сжать цыфры?
"Например" - занимает 8 байт, а мне надо меньше...
"1024768" - можно уместить в 4 байта, даже можно в 3, а в два возможно?
Заранее спасибо.

Автор: Y-Vladimir 14.7.2005, 08:52
Для начала можно уменьшить количество цифр на представление одного символа. Например для буквы можно взять 5,6 бит - смотря какой алфавит), для цифры - 4 бита. И наконец, сжать это дело каким-либо алгоритмом, напрмер алг. Хафмана.
А вообще, степень сжатия зависит от избыточности информации. В твоем примере число "1024768" смахивает на возможное разрешение экрана. Если у тебя фиксированный набор таких чисел, то их можно сжимать (вернее заменять) в несколько бит.
Если есть много повторяющихся фргаментов в тексте или цифрах, то лучше использовать алгоритм сжатия LZW.

Автор: NoeR 14.7.2005, 15:12
А где этот сайт был, там где алгоритмы эти...?
Цитата
Если у тебя фиксированный набор таких чисел, то их можно сжимать (вернее заменять) в несколько бит.

Вот как бы это сделать? (Пусть будет фиксировано, т.е. от 0000000(позиция 0х0) до 1024768(позиция 1024х768)).
Ну ладно, допустим если одно число - тада заменить просто, например на букву "А", а вот када их много... куда девать все это? Алфавита та нема столько smile

Автор: SoWa 16.7.2005, 15:24
Ничего невозможно сжать в 2 байта и даже бита. Оттуда не достать уже.

Автор: NoeR 16.7.2005, 23:46
SoWa в каком смысле ничего?

Автор: Y-Vladimir 18.7.2005, 09:48
Цитата(NoeR @ 14.7.2005, 15:12)
А где этот сайт был, там где алгоритмы эти...?

Что-то не понял...

Цитата(NoeR @ 14.7.2005, 15:12)
Пусть будет фиксировано, т.е. от 0000000(позиция 0х0) до 1024768(позиция 1024х768)

Я не это имел ввиду. Допустим, что у тебя в тексте часто встречаются, в основном, такие значения 800600, 1024768, 640480. Вот их и надо заменять на префиксные коды, а если у тебя с одинаковой вероятностью встречаются числа "от 0000000 до 1024768", то тут никакое сжатие особо не поможет.

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

Цитата(NoeR @ 14.7.2005, 15:12)
Алфавита та нема столько

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

Цитата(SoWa @ 16.7.2005, 15:24)
Ничего невозможно сжать в 2 байта и даже бита. Оттуда не достать уже.

Не понял фразы. Почему это нельзя? В 2 байта можно, при определенных условиях и мегабайт впихнуть

Автор: NoeR 18.7.2005, 12:56
Цитата
Так не надо алфавит использовать, тут нужно оперировать битами и совокупностями битов.

Вот это как smile

Автор: Y-Vladimir 18.7.2005, 13:25
Цитата(NoeR @ 18.7.2005, 12:56)
Вот это как

Ну напрмер 12 битов - 4096 комбинаций. Вот их и используй.

А вообще, напиши, что тебе конкретно нужно, приведи конкретный фрагмент текста, что хочешь сжать, а то так еще долго можно обсуждать...
Вообще, думаю тебе Хаффман или LZW подойдут - дают хорошую степень сжатия и просто реализуются.

Автор: Y-Vladimir 18.7.2005, 17:20
А вообще, рекомендую почитать:
http://www.compression.ru/arctest/artic-algo.htm
Там рассказывается о наиболее известных способах и алгоритмах сжатия информации.
Многие вопросы отпадут сами собой.

Автор: NoeR 18.7.2005, 19:08
Мне надо сжать положение курсора и текст к нему, чтобы меньше весило...
За ссылку спасибо, приеду почитаю smile

Автор: Y-Vladimir 19.7.2005, 09:13
Цитата(NoeR @ 18.7.2005, 19:08)
Мне надо сжать положение курсора и текст к нему, чтобы меньше весило...

А подробнее? Что такое "положение курсора и текст к нему"???

Автор: val 20.7.2005, 11:54
Тебе поможет алгоритм Хафмана.

Автор: Y-Vladimir 20.7.2005, 11:57
Лучше наверное LZW, затем Хафман.

Автор: NoeR 29.7.2005, 21:51
Цитата
А подробнее? Что такое "положение курсора и текст к нему"???

Пусть будет просто положение курсора: 1x12, 768x4....

Автор: Y-Vladimir 30.7.2005, 10:20
А зачем это сжимать?
Имеются ввиду отдельные значения положения курсора или последовательность таких значений?
Только в последнем случае есть смысл что-то сжимать...

Опиши ПОДРОБНО свою задачу, тогда можно будет подбирать алгоритм. а то получается гадание по типу игры "Холодно-Горячо"

Автор: NoeR 2.8.2005, 13:13
В текст. док. надо сохранять все положения курсора, когда эти положения меняются естественно...
Добавлено @ 13:14
И надо сделать так, чтобы файл с этими положениями, был как можно меньше в размере!

Автор: Romtek 2.8.2005, 14:50
Повторяющиеся значения можно сжимать по принципу RLE.
AAABBCCCCC -> A3B2C5

Автор: Romtek 2.8.2005, 15:48
Что-то, я чувствую, прога будет использоваться не в благих целях...

Автор: Y-Vladimir 2.8.2005, 16:03
Цитата(NoeR @ 2.8.2005, 13:13)
надо сохранять все положения курсора

Тогда лучше использовать что-то типа Дельта-модуляции. Т.е. запоминашь только изменение положения курсора относитльно предыдущей позиии.

Пример:
Вход: (345,594); (345,596); (347,597); (346,599).
Выход: (345,594); [0,2]; [2,1]; [-1,1].

Как видишь - значения в квадратных скобках (это посути дельта) заметно меньше по модулю значений на входе, после такого преобразования можно сжимать дальше.
Добавлено @ 16:04
Цитата(Romtek @ 2.8.2005, 15:48)
Что-то, я чувствую, прога будет использоваться не в благих целях...

Типа прога, котрая запоминает все дейсвия юзера - движения мышкой, нажатия клавиш и сливает их в инет? smile

Автор: NoeR 3.8.2005, 19:30
Цитата
Что-то, я чувствую, прога будет использоваться не в благих целях...

Учись чувствовать правильно smile
Цитата
Повторяющиеся значения можно сжимать по принципу RLE.
AAABBCCCCC -> A3B2C5

В принципе спасибо, но тут так не получиться, мало там одинаково будет smile
Цитата
Тогда лучше использовать что-то типа Дельта-модуляции. Т.е. запоминашь только изменение положения курсора относитльно предыдущей позиии.

Большое спасибо! Мне это и надо было, ну, во всяком - что-то типа того smile
Теперь мне надо как-то сжимать текст, мне продолжать читать те методы по ссылке, или у кого-нибудь есть идеи? Не спрашивайте пож-ста зачем, надо для чата, тексты большие, много времени на сжатия тратить не могу, так как выгоды от экономии отправки - будет мало...

Автор: Romtek 3.8.2005, 22:27
Если для чата, нужен обязательно текст, или можно хранить в бинарном коде ? Тогда типа gzip вполне можно применить - есть готовые библиотеки для этого.
Если хранить движения мыши в формате дельта, то совсем необязательно, что координаты будут отличаться на +/- 2. Могут быть изменения даже в десятках единиц - зависит также и от скорости движения мыши.

P.S.
Цитата(NoeR @ 3.8.2005, 19:30)
Учись чувствовать правильно
Я не знаю, что значит "правильно"- мне так показалось и я сказал.

Автор: Y-Vladimir 4.8.2005, 09:50
Цитата(Romtek @ 3.8.2005, 22:27)
совсем необязательно, что координаты будут отличаться на +/- 2. Могут быть изменения даже в десятках единиц

Разумеется могут - у каждого метода есть свои недостатки. Это ведь не метод сжатия, а способ преобразования входных данных таким образом, чтобы дальнейшее сжатие получилось эффективнее. К тому же, обычно юзеры не махают мышкой с огромной скоростью и движения лостаточно плавны - в этом случае подобное преобразование даст ощутимый выигрыш в сжатии.
Кстати, не обязательно запоминать все позиции курсора с точностью до пикселя - скорее всего это не требуется, тогда можно огрубить точность дельты - степень сжатия получится еще большей.

Начет сжатия текста - либо, как писал Romtek, применяй готовые библиотеки, либо используй алгоритм LZW, т.к. на основе него построено большинство архиваторов.

Автор: NoeR 4.8.2005, 14:42
Попробую с LZW, спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)