![]() |
компрессия данных (частный случай)
Дано: ~270К числовых данных с разделителями (числа от 0 до 180 с точностью до 6 знака)
Найти: метод представления данных, при котором вся эта инфа будет меньше весить (без потерь). Что приходит в голову: myNumber.toString(36) - переводим числа в строки и получаем около 125К данных (предварительно myNumber избавили от точки умножением на 10^6). уже неплохо, но всегда хочется бОльшего. Просьба1: алгоритмы Хафмана, Лемпеля-Зива-Велча и подобные не предлагать. Хочется оперировать чем-нить банальным, как toString например (потому и раздел для треда выбран про флеш). Просьба2: высказывать мнения, не обязательно готовые решения. PS. а может быть больше уже не схитришь?.. |
напиши функцию замены стринга и замени "10^" на "e", это тебе сократит размер еще на 30-40%
|
Разделяй число на группы по 2 цифры (например, 12214182488 раздели как "12" "21" "14" "18" "24" "88"), гаждую такую группу представляй в виде одного символа - как, например, fromCharCode(12). Склеивай, пересылай :) По идее, сжатие в два раза :D
|
Цитата:
|
Usnul, ну избавление от плавающей точки делаю в программе-генераторе нового формата данных, там экономия не столь важна :)
KATAFALKER, совет дельный, но имеем шанс получить код какого-либо непечатаемого символа, или символа-разделителя, что недопустимо. Сделал проще - взял сотню символов и конвертнул из десятичной в 100-ричную (суть та же, что и в твоём посте, только граблей нет с неприятными символами). 102К и новая проблема - теперь у клиента тормоза с распаковкой (процент сжатия тут для частного случая, можно ведь данные и нулями набить). Похоже надо пробовать пересесть на бинарные операции, но есть слабое подозрение, что они не сильно ускорят просчёт. Кто-нить пытался оптимизировать громоздкие вычисления флешевыми бинарными методами? И ещё мысль: от точки я неверно избавляюсь! хорошо, если я прессую число 9.999999, но плохо, если у меня 9 (после умножения получаем 9000000 - 6 лишних знаков). надо целую и дробную часть паковать раздельно! |
ну незнаю в тему или нет, но можеше часть перед запятой прадставлять в виде символа, количество символов которое можно закодировать в 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. |
| Часовой пояс GMT +4, время: 05:58. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.