@cup_of_sugar

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

Например, возможно ли закодировать 11 цифр в 9, а потом декодировать? Лично мне кажется это невозможным (каждая цифра несет в себе некоторое количество информации и отказаться от нее не получится), но, может быть, есть какие-то хитрые алгоритмы.
  • Вопрос задан
  • 261 просмотр
Пригласить эксперта
Ответы на вопрос 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
Вопрос некорректен.
В общем случае, если информация хаотична - уменьшить ее объем невозможно.
В конкретных случаях она часто имеет некоторую упорядоченность, которую можно использовать для замены этой информации той логикой, по которой ее можно создать заново. Так работают архиваторы, например.
Ответ написан
Комментировать
2ord
@2ord
Если каждая цифра представлена одним байтом таблицы 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
Старший инженер-программист
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы