PDA

Просмотр полной версии : компрессия данных (частный случай)


Double
26.02.2006, 19:48
Дано: ~270К числовых данных с разделителями (числа от 0 до 180 с точностью до 6 знака)
Найти: метод представления данных, при котором вся эта инфа будет меньше весить (без потерь).

Что приходит в голову: myNumber.toString(36) - переводим числа в строки и получаем около 125К данных (предварительно myNumber избавили от точки умножением на 10^6). уже неплохо, но всегда хочется бОльшего.

Просьба1: алгоритмы Хафмана, Лемпеля-Зива-Велча и подобные не предлагать. Хочется оперировать чем-нить банальным, как toString например (потому и раздел для треда выбран про флеш).
Просьба2: высказывать мнения, не обязательно готовые решения.

PS. а может быть больше уже не схитришь?..

Usnul
27.02.2006, 00:50
напиши функцию замены стринга и замени "10^" на "e", это тебе сократит размер еще на 30-40%

K.A.T.A.F.A.L.K.E.R
27.02.2006, 01:26
Разделяй число на группы по 2 цифры (например, 12214182488 раздели как "12" "21" "14" "18" "24" "88"), гаждую такую группу представляй в виде одного символа - как, например, fromCharCode(12). Склеивай, пересылай :) По идее, сжатие в два раза :D

K.A.T.A.F.A.L.K.E.R
27.02.2006, 01:30
Что приходит в голову: myNumber.toString(36) - переводим числа в строки и получаем около 125К данных
Судя по всему, боян вышел... Сжатие в два раза, похоже, уже имеется...

Double
27.02.2006, 08:57
Usnul, ну избавление от плавающей точки делаю в программе-генераторе нового формата данных, там экономия не столь важна :)
KATAFALKER, совет дельный, но имеем шанс получить код какого-либо непечатаемого символа, или символа-разделителя, что недопустимо. Сделал проще - взял сотню символов и конвертнул из десятичной в 100-ричную (суть та же, что и в твоём посте, только граблей нет с неприятными символами). 102К и новая проблема - теперь у клиента тормоза с распаковкой (процент сжатия тут для частного случая, можно ведь данные и нулями набить). Похоже надо пробовать пересесть на бинарные операции, но есть слабое подозрение, что они не сильно ускорят просчёт. Кто-нить пытался оптимизировать громоздкие вычисления флешевыми бинарными методами?

И ещё мысль: от точки я неверно избавляюсь! хорошо, если я прессую число 9.999999, но плохо, если у меня 9 (после умножения получаем 9000000 - 6 лишних знаков). надо целую и дробную часть паковать раздельно!

__i
27.02.2006, 15:26
ну незнаю в тему или нет, но можеше часть перед запятой прадставлять в виде символа, количество символов которое можно закодировать в 1 байте = 256, т.е. твои 180 как раз влазят.

Теперь относительно умножения на 10^6 - если у тя все дробные части числа содержат по 6 символов то это нормально а если какаято часть то плохо

Смотри как те такой способ (правда гемор %)) )

Целую часть конвертишь как я те сказал вместо числа 123, лепишь символ с его кодом, после него пишешь дробную часть, если она == 6 символам то нормально, если меньше то лепишь в конец строки какой -то разделитель.

ща попробую закодировать этим способом строку :

85.99999 , 77.040000, 55.125000, 44.123456 - 33 символа
получиться:
U999999M04»7125»,123465 - 23 символа вроде %)

U - символ с номером 85, M c номером 77 и тд.....
» - разделитель, символ с номером 187 типа чтоб номер разделителя был больше 180.