Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Вниз

Как упаковать массив чисел не кратных двойке?   Найти похожие ветки 

 
uses1   (2007-07-31 01:28) [0]

Есть массив чисел из области от 0 до N. Где N - не кратно двум, например 129.

Как можно упаковать такой массив, чтобы цифры были поплотнее?

То есть если отводить вместо 129, 8 бит (0-255), то будет не оптимально, так как цифры от 130 до 255 не встречаются.


 
DrPass ©   (2007-07-31 01:31) [1]


> То есть если отводить вместо 129, 8 бит (0-255), то будет
> не оптимально

отведи 7 с половиной бит. Тебе как раз хватит


 
ferr ©   (2007-07-31 01:39) [2]

Например чтобы упоковать 5 чисел в диапазоне [0, 10). Достаточно выделить одно число 10^5, тогда у чисел будут следующие позиции:

1. a mod 10
2. a mod 100 div 10
3. a mod 1000 div 100
...

В итоге получим обычное представления числа в 10-ой системе ;-)

Аналогично можно работать из другими системами счисления.

P.S. Ни в коем случае не приминять.


 
TUser ©   (2007-07-31 01:39) [3]

> Есть массив чисел из области от 0 до N. Где N - не кратно
> двум, например 129.
>
> Как можно упаковать такой массив, чтобы цифры были поплотнее?
>

А если у тебя файл, размером 129 байт, то знаешь как, да?

Телепатор говрит, что тебе надо хранить половинки, например, Chisla[i] div 2.


 
uses1   (2007-07-31 01:43) [4]

Биты не делятся.


 
uses1   (2007-07-31 01:46) [5]


> ferr ©   (31.07.07 01:39) [2]
>
> Например чтобы упоковать 5 чисел в диапазоне [0, 10). Достаточно
> выделить одно число 10^5


А если 1000 чисел?


 
ferr ©   (2007-07-31 01:51) [6]

> > ferr ©   (31.07.07 01:39) [2]
> >
> > Например чтобы упоковать 5 чисел в диапазоне [0, 10).
> Достаточно
> > выделить одно число 10^5
>
>
> А если 1000 чисел?

Это чисто математический приём, пользоваться им бессмысленно. Ну если надо например хранить 1000 чисел в диапазоне [0,3) то надо работать с числом 3 ^ 1000.

Я это всё к тому что твоя задача либо имеет чисто теоретический интерес, либо не имеет лучшего практического решения чем в [0].


 
uses1   (2007-07-31 02:00) [7]


> ferr ©   (31.07.07 01:51) [6]
> Это чисто математический приём, пользоваться им бессмысленно.
>  Ну если надо например хранить 1000 чисел в диапазоне [0,
> 3) то надо работать с числом 3 ^ 1000.

В том то и дело.


> Я это всё к тому что твоя задача либо имеет чисто теоретический
> интерес, либо не имеет лучшего практического решения чем
> в [0].

Интерес практический.

Даже тройки хотя бы упаковать. Значения от 0 до 2.

3*3 = 9
3*9 = 27
3*27 = 81
Сколько не группируй, а кратное двойке не получишь.


 
ferr ©   (2007-07-31 02:04) [8]

> 3*3 = 9
> 3*9 = 27
> 3*27 = 81
> Сколько не группируй, а кратное двойке не получишь.

это должно быть очевидно =) Ну там 243 близко к 255.


 
uses1   (2007-07-31 02:14) [9]


> ferr ©   (31.07.07 02:04) [8]
>
> > 3*3 = 9
> > 3*9 = 27
> > 3*27 = 81
> > Сколько не группируй, а кратное двойке не получишь.
>
> это должно быть очевидно =) Ну там 243 близко к 255.


А 3 близко к 4 и что?


 
ferr ©   (2007-07-31 02:17) [10]

3/4 = 0.75 vs 243/256 ~= 0.95


 
uses1   (2007-07-31 02:30) [11]


> ferr ©   (31.07.07 02:17) [10]
>
> 3/4 = 0.75 vs 243/256 ~= 0.95

А если файл на мегабайт, то можно найти и ещё лучшее соотношение.

Вопрос был как это не чуть-чуть, на калькуляторы и т. п. улучшуть. А как нормально и полностью упаковать.


 
ferr ©   (2007-07-31 02:38) [12]

> Вопрос был как это не чуть-чуть, на калькуляторы и т. п.
> улучшуть. А как нормально и полностью упаковать.

Ответ был -- никак.


 
Альберт_   (2007-07-31 03:57) [13]

сортируй массив в порядке возрастания и находи остаток при делении на 8, например. если следующий элемент массива меньше текущего, то начинается новый отрезок = 8.


 
SlymRO ©   (2007-07-31 05:42) [14]

схема кодирования Хафмана


 
shlst   (2007-07-31 09:39) [15]

биты ещё как делятся!
Пакуй числом, это как десятичные цифры паковать 1,2,3 = 123
Пример - пакуем в 129:
120
1
34
8

(120*129^3)+(1*129^2)+(34*129)+(8)=257623715


 
БарЛог ©   (2007-07-31 09:46) [16]

zip


 
palva ©   (2007-07-31 10:15) [17]


> ferr ©   (31.07.07 01:39) [2]
> Аналогично можно работать из другими системами счисления.
> P.S. Ни в коем случае не приминять.

Ну а почему не применять? Скажем, у нас числа 0..5 требуют 3 бита. Первое и второе число (a1, a2) будем хранить как a1*5 + a2. Это число не более 30, а значит потребует пять битов вместо шести, которые понадобились бы, если числа a1 и a2 хранить в исходном виде. На следующей паре чисел a3 a4 сэкономим еще один бит и т. д.


 
shlst   (2007-07-31 10:27) [18]

[15]
257623715 = для хранения надо 28 бит, а если хранить каждое число 8-ю битами, то будет 32 бита. Чем больше чисел таким образом упаковать(как в [15], тем будет ближе к log2(основание системы, у нас 129)*n = 7,0112*n
Можно использовать "длинные числа"


 
StriderMan ©   (2007-07-31 10:38) [19]


> Как можно упаковать такой массив, чтобы цифры были поплотнее?

шрифт помельче, межсимвольный интервал = 0


 
partizan   (2007-07-31 15:52) [20]


> Биты не делятся.
>


В некотором смысле делятся: http://algolist.manual.ru/compress/standard/arithm.php


 
partizan   (2007-07-31 16:02) [21]

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

В случае чисел от 1 до 129 (если не известно, какие встретятся чаще, а какие реже) - можно выделить по 7 бит на 1..127, и 8 бит на числа 128 и 129.
Всреднем получится (7*127+2*8)/129 = 7,015... бит на число


 
Kerk ©   (2007-07-31 16:09) [22]

[21] partizan   (31.07.07 16:02)
> В случае чисел от 1 до 129 (если не известно, какие встретятся
> чаще, а какие реже) - можно выделить по 7 бит на 1..127,
> и 8 бит на числа 128 и 129.

Не выйдет.


 
partizan   (2007-07-31 16:13) [23]


> Не выйдет


Почему нет?

1 => 0000000
2 => 0000001
3 => 0000010
....
127 => 1111110
128 => 11111110
129 => 11111111


Числа 1..127 состоят из 7 бит, и не в одном не встречается последовательность из 7 единиц => если на каком-то шаге при декодировании получено 7 единиц - значит это 128 либо 129, а если 7 бит, из которых не все единици - это число от 1 до 127


 
Kerk ©   (2007-07-31 16:15) [24]

Ошибка у тебя

1 => 0000000
2 => 0000001
3 => 0000010
....
126 => 111110
127 => 1111111
128 => 11111110
129 => 11111111

И теперь попробуй отличи 127 от 128 и 129


 
Kerk ©   (2007-07-31 16:17) [25]

+ еще ноль потерял


 
partizan   (2007-07-31 16:17) [26]

попробуй посмотреть внимательно на мои посты. Там числа от 1 до 129, нуля нет!

Поэтому 126 => 1111101 (125 в двоичной), 127 => 1111110 (126 в двоичной)


 
partizan   (2007-07-31 16:19) [27]

А если с нулем нужно (0..129) - тогда по 7 бит на 0..126  (двоичное представления, как есть), на 127 - 8 бит: 11111110, на 128 и 129 - по 9 бит (111111110 и 111111111)


 
Kerk ©   (2007-07-31 16:19) [28]

[26] partizan   (31.07.07 16:17)
> попробуй посмотреть внимательно на мои посты. Там числа
> от 1 до 129, нуля нет!

Тогда и кодированием извращаться не нужно. 128 разных чисел в 7 бит и так влезает.


 
ferr ©   (2007-07-31 16:19) [29]

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

> В случае чисел от 1 до 129 (если не известно, какие встретятся
> чаще, а какие реже) - можно выделить по 7 бит на 1..127,
> и 8 бит на числа 128 и 129.
> Всреднем получится (7*127+2*8)/129 = 7,015... бит на число

Закодировать то можно, я бы посмотрел как ты декодировать будешь..


 
partizan   (2007-07-31 16:20) [30]


> Тогда и кодированием извращаться не нужно. 128 разных чисел
> в 7 бит и так влезает.


От 1 до 129 их 129 а не 128


 
Kerk ©   (2007-07-31 16:21) [31]

[27] partizan   (31.07.07 16:19)
> на 128 и 129 - по 9 бит

Так не бывает :) Иначе бы сабж не возник


 
Kerk ©   (2007-07-31 16:23) [32]

Если уж извращаться с кодами Хаффмана, то нужно действительно частоту учитывать. Тогда может на некоторые цифры и по три бита придется. Но к сабже это мало отношения имеет.


 
partizan   (2007-07-31 16:27) [33]

Так это частный случай Хаффмана, когда у чисел 0..129 частота одинаковая, а у чисел 130..255 - нулевая.

Если вспомнить, как строятся эти коды - то при таких частотах получится именно такое кол-во бит на числа как я описал.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.041 c
6-1168272805
аматор
2007-01-08 19:13
2007.08.26
"жук" для поиска по сайтам


2-1185780445
andreyka
2007-07-30 11:27
2007.08.26
Удаление записи в реестре


2-1185727193
mfender
2007-07-29 20:39
2007.08.26
TADOConnection. Запуск редактора строки подключения


10-1135338727
Bleed
2005-12-23 14:52
2007.08.26
Методы и Свойства COM объекта


2-1186296860
Константинов
2007-08-05 10:54
2007.08.26
SQL запрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский