Измерение информации: алфавитный подход и log2

Фундамент всего раздела кодирования: как из мощности алфавита получить объём данных.

Алфавитный подход: количество информации в сообщении зависит только от мощности алфавита и длины сообщения, а не от смысла. Один символ алфавита из N знаков несёт i бит, где 2i = N.

Бит, байт и степени двойки

Информация в компьютере измеряется в битах. Бит — это выбор из двух вариантов (0 или 1). Байт = 8 бит. Дальше идут двоичные приставки, и это первое, что нужно довести до автоматизма: в информатике 1 Кбайт — это не 1000, а 1024 байта.

ЕдиницаСколько байтСтепень двойки
1 байт8 бит23 бит
1 Кбайт1024 байта210
1 Мбайт1024 Кбайт220
1 Гбайт1024 Мбайт230

Большинство ошибок в заданиях 7 и 11 — это путаница с переводами единиц. Привыкайте всё держать в степенях двойки: тогда деление на 1024 — это просто вычитание 10 из показателя степени.

Главная формула: i = log2(N)

Пусть алфавит содержит N различных символов. Чтобы закодировать один символ, нужно i бит, причём:

N = 2^i        =>        i = log2(N)

Примеры, которые стоит знать наизусть:

  • Алфавит из 2 символов → 1 бит на символ (21=2).
  • Из 8 символов → 3 бита (23=8).
  • Из 32 символов → 5 бит (25=32).
  • Из 256 символов → 8 бит = 1 байт.

Если N не степень двойки (например 6 цветов), то i округляют вверх до целого: для 6 вариантов нужно 3 бита, потому что 2 бита дают только 4 комбинации, а 3 — целых 8 (с запасом). Это ловушка: log26 ≈ 2,58, но память выделяется целыми битами, поэтому 3.

Объём сообщения

Если сообщение состоит из K символов, а каждый символ несёт i бит, то весь объём:

I = K · i   (бит)

Разберём типовой пример. Алфавит племени содержит 32 символа. Сообщение состоит из 80 символов. Сколько байт информации оно несёт?

import math

N = 32                      # мощность алфавита
K = 80                      # длина сообщения в символах
i = math.log2(N)            # бит на один символ
I_bit = K * i               # объём в битах
I_byte = I_bit / 8          # объём в байтах

print("бит на символ:", int(i))
print("объём, бит:", int(I_bit))
print("объём, байт:", int(I_byte))

Вывод:

бит на символ: 5
объём, бит: 400
объём, байт: 50

Обратная задача: найти N или K

Часто известен объём, а найти нужно мощность алфавита или длину. Если сообщение из 20 символов заняло 100 бит, то на символ приходится 100/20 = 5 бит, значит алфавит — 25 = 32 символа.

# Сообщение из 20 символов заняло 100 бит. Найти мощность алфавита.
I_bit = 100
K = 20
i = I_bit // K              # бит на символ
N = 2 ** i                  # мощность алфавита
print("бит на символ:", i)
print("мощность алфавита N:", N)

Вывод:

бит на символ: 5
мощность алфавита N: 32

Комбинаторный взгляд: пароли и номера

Тот же алфавитный подход отвечает на вопрос «сколько различных сообщений длины K можно составить из алфавита в N символов». Ответ — NK. Это основа задания 8 (комбинаторика) и часто всплывает в задании 11. Разберём: «Пароль состоит из 6 символов; каждый символ — заглавная латинская буква (26) или цифра (10). Сколько существует разных паролей и сколько бит нужно для хранения номера пароля?»

import math

N = 26 + 10          # мощность алфавита: буквы + цифры
K = 6                # длина пароля
total = N ** K       # сколько всего паролей
bits_per_symbol = math.ceil(math.log2(N))   # бит на символ, округляя вверх
bits_total = K * bits_per_symbol

print("всего паролей:", total)
print("бит на символ:", bits_per_symbol)
print("бит на весь пароль:", bits_total)
print("байт на пароль (округляя вверх):", math.ceil(bits_total / 8))

Вывод:

всего паролей: 2176782336
бит на символ: 6
бит на весь пароль: 36
байт на пароль (округляя вверх): 5

Обратите внимание: на 36 символов нужно 6 бит (25=32 мало, 26=64 хватает), и на каждый символ память выделяется одинаковая — по 6 бит, даже если конкретный символ можно было бы закодировать короче. В таких задачах всегда берут максимальную длину кода для всех символов.

Типичные ловушки

  • Округление вверх. Если N не степень двойки, i округляют вверх до целого числа бит. log26 = 2,58 → берём 3 бита.
  • 1 Кбайт = 1024 байта, а не 1000. Деление на 1000 вместо 1024 — частая потеря балла.
  • Бит и байт. Не забывайте делить на 8 при переходе от бит к байтам.
  • Что считать алфавитом. Если в задании сказано «использованы заглавные латинские буквы и цифры», N = 26 + 10 = 36, а не 26.
  • NK против K·i. «Сколько разных сообщений» — это NK; «сколько памяти под одно сообщение» — это K·i. Не путайте две формулы.

Итог

  • Один символ алфавита из N знаков несёт i = log2N бит; если N не степень двойки — округляем вверх.
  • Объём сообщения I = K · i бит; для байтов делим на 8.
  • Все переводы единиц держите в степенях двойки: 1 Кбайт = 210 байт.
Проверьте себя
1. Сколько бит нужно для кодирования одного символа из алфавита в 64 знака?
A5 бит
B6 бит
C7 бит
D8 бит
2. Алфавит содержит 6 цветов. Сколько бит выделяется на один символ?
A2 бита
B2,58 бита
C3 бита
D6 бит
3. Сообщение из 50 символов заняло 300 бит. Какова мощность алфавита?
A32
B64
C128
D6
Поддержать проект