← Все вопросы
Задание 11 КЕГЭ: длина кодовой цепочки при равномерном кодировании
12
Задание 11: в системе хранится N разных объектов, каждому даётся уникальный код одинаковой длины из символов какого-то алфавита (минимально возможной длины). Спрашивают, сколько бит/символов займёт сообщение. Как это считать без ошибок?
3 ответа
22
Длина одного кода = минимальное k, при котором (размер алфавита)**k ≥ N. Потом умножаешь на количество объектов в сообщении.
import math
N = 300 # сколько объектов кодируем
alpha = 2 # размер алфавита (для бит — 2)
k = math.ceil(math.log(N, alpha))
# подстраховка от ошибок округления log:
while alpha ** k < N:
k += 1
print('длина одного кода:', k)
print('всё сообщение:', k * 50) # если в сообщении 50 объектов
Ключевое слово в условии — «минимально возможной длины»: берём наименьшее k, чтобы кодов хватило на все N объектов. И не путай «бит на код» с «бит на всё сообщение» — это две разные величины, которые в условии часто идут подряд.
Fkalkf fkdpkgok Проверка `while alpha**k < N` спасает от косяков с float у math.log · 16 месяцев назад
Андрей Гошко Часто ещё просят перевести в байты — не забудь поделить на 8 и округлить вверх · 16 месяцев назад
7
Минимальное k: 2**k ≥ N для бит. Дальше умножаешь на число символов в сообщении.
5
math.ceil(math.log2(N)), но лучше добить циклом из-за погрешности.
Ваш ответ
Войдите, чтобы ответить на вопрос.