Экономная запись числа
-
- Уже с Приветом
- Posts: 367
- Joined: 22 Feb 2005 02:14
- Location: New York
Экономная запись числа
Вспомнилось по мотивам темы "Одометр".
Сравним представления чисел в системах счисления с различными основаниями b.
Те, кто застали механические калькуляторы "Феликс" (ещё во второй половине шестидесятых они совершенно всерьёз продавались в "Канцтоварах"; за совершенно серьёзные по тем временам 40 руб.) или же грудастые кассовые аппараты с рядами кнопок для каждого разряда, легко согласятся с записью числа в виде таблицы из b строк по количеству цифр в выбранной системе счисления: в каждом столбце-разряде отмечается одна позиция-цифра (в Феликсе это было положение соотв. рычажка, в кассовом аппарате - нажатая кнопка).
Будем считать, что нужно записывать числа, не превосходящие некое "достаточно большое" М. Тогда, при уменьшении b, такая таблица содержит меньше строк, но разрастается вширь, и наоборот.
-При каком основании счисления b таблица содержит минимальное количество клеток?
Сравним представления чисел в системах счисления с различными основаниями b.
Те, кто застали механические калькуляторы "Феликс" (ещё во второй половине шестидесятых они совершенно всерьёз продавались в "Канцтоварах"; за совершенно серьёзные по тем временам 40 руб.) или же грудастые кассовые аппараты с рядами кнопок для каждого разряда, легко согласятся с записью числа в виде таблицы из b строк по количеству цифр в выбранной системе счисления: в каждом столбце-разряде отмечается одна позиция-цифра (в Феликсе это было положение соотв. рычажка, в кассовом аппарате - нажатая кнопка).
Будем считать, что нужно записывать числа, не превосходящие некое "достаточно большое" М. Тогда, при уменьшении b, такая таблица содержит меньше строк, но разрастается вширь, и наоборот.
-При каком основании счисления b таблица содержит минимальное количество клеток?
-
- Уже с Приветом
- Posts: 11756
- Joined: 10 Feb 2005 16:08
- Location: CMH
Re: Экономная запись числа
e (2.78 )? Т.е. 3?
-
- Уже с Приветом
- Posts: 2001
- Joined: 10 Nov 2004 00:34
- Location: MD
Ну это, я думаю, всем известно.
Даже компьюторы пытались такие делать.
А вот как насчёт такой задачи об экономной записи.
Нам надо в бинарном виде записывать целые числа, величина которых никак не ограничена. Начало записи известно, а конец - нет, т.е. его тоже надо как-то закодировать.
Ясно, что для больших чисел необходимо порядка log2(N) бит.
Соответственно, задача в том, чтобы минимизировать количество лишних бит.
Формально, минимизируем предел:
limit(N->infinity, average(k=1...N,bits(k)-log2(k)))
Где bits(k) - количество бит требуемых для кодирования натурального числа k.
Даже компьюторы пытались такие делать.
А вот как насчёт такой задачи об экономной записи.
Нам надо в бинарном виде записывать целые числа, величина которых никак не ограничена. Начало записи известно, а конец - нет, т.е. его тоже надо как-то закодировать.
Ясно, что для больших чисел необходимо порядка log2(N) бит.
Соответственно, задача в том, чтобы минимизировать количество лишних бит.
Формально, минимизируем предел:
limit(N->infinity, average(k=1...N,bits(k)-log2(k)))
Где bits(k) - количество бит требуемых для кодирования натурального числа k.
Last edited by venco on 13 Apr 2007 23:04, edited 1 time in total.
-
- Уже с Приветом
- Posts: 367
- Joined: 22 Feb 2005 02:14
- Location: New York
Re: Экономная запись числа
vm__ wrote:e (2.78 )? Т.е. 3?
-Отгадайте загадку: "Два кольца, два конца, посередине ..."
-Ножницы!
-А-а-а, ты зна-а-ал...
-
- Уже с Приветом
- Posts: 367
- Joined: 22 Feb 2005 02:14
- Location: New York
-
- Уже с Приветом
- Posts: 2001
- Joined: 10 Nov 2004 00:34
- Location: MD
Вот пример такой кодировки.
К примеру, кодируем число k = 365.
Записываем его в двоичном виде:
101101101
Длина l1 = 9 бит, старший бит всегда 1, плюс ещё 8 бит двоичной мантиссы.
Записываем длину l1 опять же в двоичном виде:
1001
Длина l2 = 4.
Теперь кодируем длину l2 записью (l2-1) нулей, а затем - одна единица. После этого пишем мантиссу l1, и мантиссу k. В результате получаем:
0001 001 01101101 - 15 бит.
Следом можно кодировать следующее число.
Излишек: 15 - log2(365) = 6.5 бит.
При такой кодировке излишек ~= 2*log2(log2(k)), т.е. растёт до бесконечности с ростом k.
Можно ли придумать такую кодировку, чтобы излишек не превышал некоторую константу при больших k?
А затем надо минимизировать предел среднего излишка для всех k <= N.
К примеру, кодируем число k = 365.
Записываем его в двоичном виде:
101101101
Длина l1 = 9 бит, старший бит всегда 1, плюс ещё 8 бит двоичной мантиссы.
Записываем длину l1 опять же в двоичном виде:
1001
Длина l2 = 4.
Теперь кодируем длину l2 записью (l2-1) нулей, а затем - одна единица. После этого пишем мантиссу l1, и мантиссу k. В результате получаем:
0001 001 01101101 - 15 бит.
Следом можно кодировать следующее число.
Излишек: 15 - log2(365) = 6.5 бит.
При такой кодировке излишек ~= 2*log2(log2(k)), т.е. растёт до бесконечности с ростом k.
Можно ли придумать такую кодировку, чтобы излишек не превышал некоторую константу при больших k?
А затем надо минимизировать предел среднего излишка для всех k <= N.
-
- Уже с Приветом
- Posts: 11756
- Joined: 10 Feb 2005 16:08
- Location: CMH
-
- Уже с Приветом
- Posts: 13316
- Joined: 13 Jun 1999 09:01
- Location: Yekaterinburg -> Montreal
venco wrote:Вот пример такой кодировки.
К примеру, кодируем число k = 365.
Записываем его в двоичном виде:
101101101
Длина l1 = 9 бит, старший бит всегда 1, плюс ещё 8 бит двоичной мантиссы.
Записываем длину l1 опять же в двоичном виде:
1001
Длина l2 = 4.
Теперь кодируем длину l2 записью (l2-1) нулей, а затем - одна единица. После этого пишем мантиссу l1, и мантиссу k. В результате получаем:
0001 001 01101101 - 15 бит.
Что-то непонятно, где экономия. Было 9 бит, стало 15.
Если вопрос об минимизации избыточной информации при кодировании в предположении о вероятностях разных символов, а проще говоря, компрессии, то все уже украдено до нас :
Алгоритм Хаффмана и др. префиксные коды
http://ru.wikipedia.org/wiki/%D0%9A%D0% ... 0%BD%D0%B0
-
- Уже с Приветом
- Posts: 367
- Joined: 22 Feb 2005 02:14
- Location: New York
Ещё страшней, ещё чуднее:
Вот рак верхом на пауке...
-Да, вроде бы, можно придумать: обычная двоичная, чем она плоха, какие в ней излишки!? - Стоит ли раздувать 9-битовую запись до 15-битовой (да ещё всего лишь ради того только, чтобы хитромудро представить лидирующую единицу, а потом подсчитывать излишки?
Не, я, наверное, - пасс
Вот рак верхом на пауке...
venco wrote:К примеру, кодируем число k = 365.
Записываем его в двоичном виде: 101101101 (...трах-тибидах...)
... В результате получаем: 0001 001 01101101 - 15 бит.
Излишек: 15 - log2(365) = 6.5 бит.
При такой кодировке излишек ~= 2*log2(log2(k)), т.е. растёт до бесконечности с ростом k.
Можно ли придумать такую кодировку, чтобы излишек не превышал некоторую константу при больших k?
А затем надо минимизировать предел среднего излишка для всех k <= N.
-Да, вроде бы, можно придумать: обычная двоичная, чем она плоха, какие в ней излишки!? - Стоит ли раздувать 9-битовую запись до 15-битовой (да ещё всего лишь ради того только, чтобы хитромудро представить лидирующую единицу, а потом подсчитывать излишки?
Не, я, наверное, - пасс
-
- Уже с Приветом
- Posts: 2001
- Joined: 10 Nov 2004 00:34
- Location: MD
А откуда вы узнали что было 9 бит? Принимающая сторона этого не знает.PavelM wrote:Что-то непонятно, где экономия. Было 9 бит, стало 15.
Т.е., если вы просто будете передавать биты числа - 101101101, то как отличить их от 5, переданной три раза?
Все они рассчитаны на ограниченный алфавит.Алгоритм Хаффмана и др. префиксные коды
А меня интересует возможность передавать неограниченно большие числа.
На самом деле, похоже, добиться потерь, ограниченных костантой, невозможно. В лучшем случае это будет что-то типа log2(log2(k))+log2(log2(log2(k)))+...
-
- Уже с Приветом
- Posts: 367
- Joined: 22 Feb 2005 02:14
- Location: New York
venco wrote:А откуда вы узнали что было 9 бит? Принимающая сторона этого не знает.
Т.е., если вы просто будете передавать биты числа - 101101101, то как отличить их от 5, переданной три раза?
Да, примерно, оттуда же, откуда смогли узнать, что 0001 001 01101101 - это было 15 бит, причём вся цепочка - это не 0,4,5,5,5
-
- Уже с Приветом
- Posts: 13316
- Joined: 13 Jun 1999 09:01
- Location: Yekaterinburg -> Montreal
venco wrote:Все они рассчитаны на ограниченный алфавит.Алгоритм Хаффмана и др. префиксные коды
А меня интересует возможность передавать неограниченно большие числа.
Можно разбить бесконечное число на числа конечной длины и взять адаптивный алгоритм Хаффмана который кодирует в реальном времени без знания вероятностей заранее. В принципе без предположения о распределении символов в числе построить что-то оптимальное невозможно. Числа могут быть такими, что сжатие может быть просто невозможно.
Пример - разбейте сжатый по максимуму архив RAR на числа произвольной длины и попробуйте сэкономить еще малость.
Статья по теме:
http://en.wikipedia.org/wiki/Universal_ ... ression%29
-
- Уже с Приветом
- Posts: 2001
- Joined: 10 Nov 2004 00:34
- Location: MD
Deynekin wrote:откуда смогли узнать, что 0001 001 01101101 - это было 15 бит, причём вся цепочка - это не 0,4,5,5,5
Смотрим сколько нулей сначала, до первой единицы - 3, значит l2 = 4. Читаем следующие, после начальных нулей, 4 бита, получаем l1 = 9. Читаем следующие l1-1 = 8 бит, приписываем единицу старшим разрядом и получаем 101101101 = 365. Никакой неоднозначности.
-
- Уже с Приветом
- Posts: 2001
- Joined: 10 Nov 2004 00:34
- Location: MD
PavelM wrote:Можно разбить бесконечное число на числа конечной длины
Число бесконечной длины можно разбить только на бесконечное число (X) конечных чисел. Придётся ещё передавать это бесконечное число X. Задача свелась к предыдущей.
Числа могут быть такими, что сжатие может быть просто невозможно.
Откуда взялось сжатие? Я про него ничего не говорил.
http://en.wikipedia.org/wiki/Universal_code_%28data_compression%29
А тут как раз примерно то, о чём я и толкую.
Elias delta coding - это в точности кодировка, которую я описал.
-
- Уже с Приветом
- Posts: 13316
- Joined: 13 Jun 1999 09:01
- Location: Yekaterinburg -> Montreal
venco wrote:Число бесконечной длины можно разбить только на бесконечное число (X) конечных чисел. Придётся ещё передавать это бесконечное число X. Задача свелась к предыдущей.
Нет число чисел передавать не надо. Разбив бесконечное число на блоки равной длины, получим конечный алфавит. Далее, применяем, например, адаптивный алгоритм Хаффмана. Он адаптируется к потоку.
Откуда взялось сжатие? Я про него ничего не говорил.
Я понял, что говорилось о наиболее экономном представлении чисел некоего множества, пусть даже бесконечного - компрессия без потерь - это оно и есть. В зависимости от распределения - экономия варьируется и ее верхний предел ограничен теоремой Шеннона.
-
- Уже с Приветом
- Posts: 2001
- Joined: 10 Nov 2004 00:34
- Location: MD
PavelM wrote:Нет число чисел передавать не надо.
Как вы восстановите число из блоков, если не знаете из какого количества блоков число состоит?
Далее, применяем, например, адаптивный алгоритм Хаффмана.
Кодировать по Хаффману младшие биты нет смысла. Например, во многих, если не всех, архиваторах, основанных на LZW (zip, rar), только несколько старших битов потенциально большого смещения строки, а также его длина, кодируются со сжатием. Младшие же биты передаются как есть.
-
- Уже с Приветом
- Posts: 1812
- Joined: 15 Apr 2004 20:45
venco wrote:Deynekin wrote:откуда смогли узнать, что 0001 001 01101101 - это было 15 бит, причём вся цепочка - это не 0,4,5,5,5
Смотрим сколько нулей сначала, до первой единицы - 3, значит l2 = 4. Читаем следующие, после начальных нулей, 4 бита, получаем l1 = 9. Читаем следующие l1-1 = 8 бит, приписываем единицу старшим разрядом и получаем 101101101 = 365. Никакой неоднозначности.
venco, а откуда мы знаем, что последняя прочитанная мантисса это и есть наше число, а не новая длина l0?
...
-
- Уже с Приветом
- Posts: 2001
- Joined: 10 Nov 2004 00:34
- Location: MD