К содержанию

Подтема 6 из 6 · дополнительный урок

Служебные данные, зависящие от размера

Сообщение группами с заголовками и номер, длина которого зависит от числа изделий.

Группы с заголовками

Дополнительный урок — для продвинутых: такие задачи редки и на экзаменах пока не встречались.

Сообщение в 10 байт делят на группы не больше 4 байт, к каждой группе добавляют заголовок в 1 байт. Сколько байт передают?

Заголовков столько, сколько групп, и неполная последняя группа тоже получает заголовок. Группы 4, 4 и 2 байта — три заголовка, всего 10 + 3 = 13 байт. Число групп — деление с округлением вверх: 10 / 4 = 2,5 → 3.

10 байт сообщения — три группы с заголовками: 4, 4 и неполная 2. Всего 13 байт.

Обратный вопрос: алфавит — 40 символов (6 бит), сообщение в целых байтах, с заголовками не больше 20 байт. Какое наибольшее число символов в сообщении? Объём сообщения перебирают, пока с заголовками он помещается: 16 байт + 4 заголовка = 20, а 17 + 5 = 22 — уже нет. 16 байт — 128 бит, 128 / 6 = 21,3 → 21 символ.

from math import ceilsize = 0while (size + 1) + ceil((size + 1) / 4) <= 20:    size += 1print(size, 8 * size // bits(40))
16 21

Номер зависит от количества

В партии n изделий. Запись изделия — код партии из 5 заглавных латинских букв, номер изделия от 1 до n двоичным числом и 10 байт сведений; код и номер вместе занимают целые байты. Сколько изделий поместится в 1 Кбайт?

Когда длина номера зависит от числа изделий, размер записи меняется вместе с n — его считают заново для каждого n. Код партии — 25 бит. До 63 изделий номеру хватает 6 бит, с 64 — нужно 7, со 128 — 8.

Удобнее всего перебор количества (): для каждого n — запись и общий объём. Перебор можно ограничить: одни сведения занимают 10 байт, больше 1024 // 10 изделий не поместится.

from math import ceilbest = 0for n in range(1, 1024 // 10 + 1):    code = ceil((25 + n.bit_length()) / 8)    if n * (code + 10) <= 1024:        best = nprint(best)
73

Проверка: 73 изделия — номер 7 бит, код 25 + 7 = 32 бита = 4 байта, 73 · 14 = 1022 байта; 74 изделия — 74 · 14 = 1036, уже больше 1024.

Итого

  • Группыразмер / группа, вверх
  • Заголовкипо одному на каждую группу
  • Номер от nn.bit_length() меняется с n
  • Перебордля каждого n — запись и объём

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Сообщение 25 байт делят на группы не больше 6 байт, к каждой — заголовок 2 байта. Сколько байт передают?
ОтветСкрыть ответ
Ответ
35: групп 5 (6, 6, 6, 6, 1), 25 + 5 · 2.
Вопрос 2
Сообщение 16 байт, группы не больше 4 байт, заголовок 1 байт. Сколько байт передают?
ОтветСкрыть ответ
Ответ
20: ровно 4 группы, 16 + 4.
Вопрос 3
В партии 64 изделия, номера от 1 до 64 записаны двоичным числом. Сколько битов на номер?
ОтветСкрыть ответ
Ответ
7: 64 = 1000000₂, шести битов хватает только до 63.
Вопрос 4
Почему в программе о партии перебор идёт только до limit // 10?
ОтветСкрыть ответ
Ответ
Одни сведения занимают 10 байт на изделие: больше изделий не поместится при любой длине номера.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Сообщение с заголовками

Сообщение занимает 25 байтов. Его делят на группы не более чем по 6 байтов, к каждой группе добавляют заголовок в 2 байта. Сколько байтов передаётся вместе с заголовками?

Введите число.

Наибольшее число символов

Алфавит сообщения содержит 100 символов, символы кодируются посимвольно одинаковым минимальным числом битов, сообщение в целом — минимальным целым числом байтов. Сообщение делят на группы не более чем по 5 байтов и к каждой добавляют заголовок в 1 байт. Объём с заголовками — не более 60 байтов. Какое наибольшее число символов может быть в сообщении?

Введите число.

Сообщение не более 2 Кбайт

Для передачи сообщений используется алфавит из 300 символов, кодирование посимвольное, каждый символ кодируется одинаковым минимальным числом битов, сообщение в целом — минимальным числом байтов. При передаче сообщение делится на группы не более чем по 7 байтов, к каждой добавляется заголовок из 1 байта. Суммарный размер при передаче — не более 2 Кбайт. Какое наибольшее количество символов может входить в сообщение?

Введите число.

Код изделия больше 4 байтов

Код изделия — код партии из 4 заглавных латинских букв и номер изделия от 1 до n, записанный двоичным числом минимальной длины; код изделия в целом занимает минимальное целое число байтов. При каком наименьшем числе изделий в партии код изделия займёт больше 4 байтов?

Введите число.

Изделий в партии не более 8 Кбайт

Код партии — 10 заглавных латинских букв; номер изделия от 1 до n записан двоичным числом, одинаковой для всех номеров минимальной длины; код партии и номер вместе занимают минимальное целое число байтов; дополнительные данные — 20 байтов на изделие. Для всей партии используется не более 8 Кбайт. Какое наибольшее число изделий может быть в партии?

Введите число.

Изделий в партии не более 60 Кбайт

Каждая партия получает код из 15 символов, каждый — строчная или заглавная латинская буква, символы кодируются одинаковым минимальным числом битов. Изделия получают номера от 1 до числа изделий в партии; номер записывается как двоичное целое число одинаковой для всех номеров минимальной длины. Код партии и номер вместе занимают минимальное целое число байтов, дополнительная информация — 45 байтов на изделие. Для информации обо всех изделиях партии используется не более 60 Кбайт. Какое наибольшее количество изделий может быть в партии?

Введите число.