Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Компактный массив значений в диапазоне 0..2 
:(
    Опции темы
semibug
Дата 10.3.2010, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Имеется большое кол-во значений в диапазоне 0..2. Необходимо обеспечить компактное хранение в памяти и произвольный доступ к любому из значений.
Укладка в один байт по 4 значения ( 2 бита на значение ) избыточна ( 2 бита могут кодировать диапазон 0..3 ).
Подскажите пожалуйста, если кто сталкивался с подобной проблемой, в каком направлении двигаться.

PM   Вверх
RatHat
Дата 10.3.2010, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 5.9.2005

Репутация: нет
Всего: 1



меньше, чем в два бита, не вложишься.
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
semibug
Дата 10.3.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Пока пришло в голову упаковывать в один байт по 5 значений. Это на 0.4 бита/значение компактнее варианта "два бита на значение".
Тройка в пятой степени дает 243, некоторая избыточность всё же сохраняется.

Упаковываем:
Код

BYTE b = ( n0 * 1 ) + ( n1 * 3 )  + ( n2 * 9 ) + ( n3 * 27 ) + ( n4 * 81 );


Распаковываем:
Код

n0 = ( b / 1 ) % 3;
n1 = ( b / 3 ) % 3;
n2 = ( b / 9 ) % 3;
n3 = ( b / 27 ) % 3;
n4 = ( b / 81 ) % 3;



PM   Вверх
Void
Дата 10.3.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



В байт (8 бит) сравнительно легко можно уложить 5 тритов (3^5 = 243), что очень близко к теоретическому максимуму 8 * log(2) / log(3) = 5.05.
Доставать и устанавливать триты просто в соответствии с определением троичной системы счисления.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
semibug
Дата 10.3.2010, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Void, спасибо за формулу 8 * log(2) / log(3), остановлюсь на этом варианте.

PM   Вверх
Peter
Дата 10.3.2010, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 771
Регистрация: 28.7.2003
Где: Ставрополь

Репутация: -1
Всего: 1



Читаем байт в троичной системе счисления. Получается, что в байте (0..255) укладывается 5 троичных цифр (0..242). 
Можно увеличить единицу хранения - не один байт, а... Кому хочется, пусть сам считает. Но экономия памяти уже будет незначительной, а вычислений - чрезмерными.

Так что если хранить троичную цифру в двух битах, перерасход памяти равен 33% (4:3-1). А если хранить 5 троичных цифр в байте, перерасход памяти 5% (256:243-1).


--------------------
всё, что делаете, делайте от души, как для Господа (Послание апостола Павла колоссянам, 3:23).
PM MAIL WWW   Вверх
SenkraD
Дата 10.3.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



semibug, сорри за лёгкий оффтоп, но мне просто интрестно:
     - под что щас пишеш? какуе-то фирмварю?
     - или просто интерестно стало?



--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
GoldFinch
Дата 10.3.2010, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



в n двоичных разрядов можно уместить n/log2(3) трит
например в 8 двоичных разрядах- 5.047 трит, с избыточностью 0.047трит
для 16 избыточность будет в 2 раза больше, т.к. там поместится 10.095трит
а для 7 двоичных разрядов избыточность будет уже равна 0.416

так что надо просто подобрать блок с наименьшей избыточностью
PM MAIL ICQ   Вверх
semibug
Дата 10.3.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



SenkraD, до интересов руки всё не доходят ))
Пишу змейку под атмеловский чип. Оперативки доступно 1 кб, а змею хотят с плавным перемещением по всем направлениям, т.е. для каждого пикселя по пути змеи приходится хранить данные.
Вот извращаюсь как бы её подлиннее на несколько сегментов сделать.



PM   Вверх
mes
Дата 10.3.2010, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(semibug @  10.3.2010,  13:31 Найти цитируемый пост)
т.е. для каждого пикселя по пути змеи приходится хранить данные.

а стоит ли вообще заводить tribool ? я так понимаю блок данных всегда отн. большой..  мож просто хранить по отдельности наборы необходимых битов ? 





--------------------
PM MAIL WWW   Вверх
semibug
Дата 10.3.2010, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Цитата(mes @  10.3.2010,  14:55 Найти цитируемый пост)
а стоит ли вообще заводить tribool ? я так понимаю блок данных всегда отн. большой..  мож просто хранить по отдельности наборы необходимых битов ? 

Не совсем понял о чем идет речь.
PM   Вверх
RatHat
Дата 10.3.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 5.9.2005

Репутация: нет
Всего: 1



semibug, чип серии ATtiny1X что ли?
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
mes
Дата 10.3.2010, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(semibug @  10.3.2010,  13:58 Найти цитируемый пост)

Не совсем понял о чем идет речь. 

предлагал пересмотреть способ организации массива..

Цитата(semibug @  10.3.2010,  12:23 Найти цитируемый пост)
Имеется большое кол-во значений в диапазоне 0..2. 

какое "имя" у каждого из значений этого диапазона ?

Добавлено через 1 минуту и 4 секунды
и язык какой си или с++ ?



--------------------
PM MAIL WWW   Вверх
SenkraD
Дата 10.3.2010, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



semibug,  я так понимаю, что mes предлагает тебе использовать разрежённые массивы.
mes, я прав? - если да, то идею поддерживаю 2 руками. И ещё всё таки неплохо было бы знать
язык на котором ты пишеш




--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
semibug
Дата 10.3.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



компилятор C++
Разреженный массив, если правильно понял, не подходит, т.к. заполненность массива может достигать 100%
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0561 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.