@cup_of_sugar

Возможно ли закодировать некоторое количество цифр в меньшее?

Например, возможно ли закодировать 11 цифр в 9, а потом декодировать? Лично мне кажется это невозможным (каждая цифра несет в себе некоторое количество информации и отказаться от нее не получится), но, может быть, есть какие-то хитрые алгоритмы.
  • Вопрос задан
  • 248 просмотров
Пригласить эксперта
Ответы на вопрос 6
Lynn
@Lynn
nginx, js, css
Есть такая наука — математика.
Она говорит, что нельзя взаимно-однозначно отобразить 10^11 значений в 10^9.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
11 цифр [0-9] в 9 цифр [0-9] невозможно.
А 11 цифр [0-9] в 9 символов [0-9a-zA-Z] легко.
Ответ написан
Комментировать
@evgeniy_lm
Можно. Поменяйте систему счисления на более высокую и будет вам счастье. Например число 99 999 999 999 (10) то же самое что 247BAFB5E (17)
Ответ написан
Комментировать
Adamos
@Adamos
Вопрос некорректен.
В общем случае, если информация хаотична - уменьшить ее объем невозможно.
В конкретных случаях она часто имеет некоторую упорядоченность, которую можно использовать для замены этой информации той логикой, по которой ее можно создать заново. Так работают архиваторы, например.
Ответ написан
Комментировать
Если каждая цифра представлена одним байтом таблицы ASCII, то можно закодировать в меньшее количество байтов.
Например, возьмем число 12345678901. В нем 11 цифр. Если представить каждую цифру соответствующим кодом таблицы ASCII (код на языке Ruby)
n=12345678901
n.to_s.each_codepoint {|c| print c, ' ' }

Получаем вывод последовательности
49 50 51 52 53 54 55 56 57 48 49 => "12345678901"
То есть последовательность хранится в памяти неоптимально.

Теперь посмотрим как выглядит число в виде последовательности битов:
puts n.to_s(2)  # конвертация в строку по двоичной системой счисления

Вывод:
1011011111110111000001110000110101

Лень считать вручную:
puts n.to_s(2).size
Получили число 34.
34 = 4 * 8 + 2
То есть 4 целых байта и 2 бита.

Фактический размер последовательности для хранения в памяти - 5 байтов.
То есть 11 байтов числа представлены 5-ю байтами.

bytes = [n].pack('w') # кодирование числа в BER.
Вывод:
=> "\xAD\xFE\xF0\xB85"
Ответ написан
Комментировать
pro_co_ru
@pro_co_ru
Старший инженер-программист
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы