Задание 11
Информационный объём сообщения
Как посчитать память под пароли и записи — и как по объёму памяти найти длину, алфавит или размер сведений.
6 подтем · 48 задач + 6 дополнительных · повышенный · ≈ 3 мин
Подтема 1 из 6
Пароль в байтах
Как посчитать память под пароль: алфавит, биты на символ, целые байты — и много паролей сразу.
Как устроена тема
В задании 11 считают, сколько памяти занимают пароли, номера и другие сведения, — или, наоборот, по объёму памяти находят длину, алфавит или размер части. Вот задача, которую мы будем решать всю тему:
«Каждому пользователю компьютерной системы выдаётся пароль из 15 символов. Пароль может содержать десятичные цифры и латинские буквы, заглавные и строчные. Для каждого пароля отведено одинаковое и минимально возможное целое число байт, используется посимвольное кодирование, все символы кодируются одинаковым и минимально возможным количеством бит. Кроме пароля, для каждого пользователя хранятся дополнительные сведения, для которых отведено одинаковое целое число байт. Для хранения сведений о 40 пользователях потребовалось 1200 байт. Сколько байт выделено для хранения дополнительных сведений об одном пользователе?»
Главное — понять, как устроена одна запись: из чего она состоит, сколько битов занимает каждая часть и чему выделяют целые байты. Сначала разберём, что сказано в условии:
| В условии | Что это значит |
|---|---|
| пароль из 15 символов: цифры, заглавные и строчные латинские буквы | длина 15, а разных символов 10 + 26 + 26 = 62 |
| символы кодируются одинаковым и минимально возможным количеством бит | у всех символов код одной длины — самой короткой, какой хватит |
| для пароля — минимально возможное целое число байт | биты пароля округляют вверх до целых байт |
| сведения — одинаковое целое число байт | у всех пользователей сведения одного размера |
| 40 пользователей — 1200 байт | 40 одинаковых записей «пароль + сведения» |
| сколько байт выделено для сведений | размер сведений одного пользователя |
Тема состоит из шести подтем — у каждой своя страница. Идём по ним по порядку:
- Пароль в байтах — ты сейчас здесь.
- Дополнительные сведения — ответ задачи темы: 18.
- Наибольшее значение: «не более» — наибольшие длина и алфавит, когда памяти не больше заданной.
- Наименьшее значение: «более» и «не менее» — наименьшие длина и алфавит.
- Составной код — пароль вместе с номером и другие коды из частей.
- Служебные данные, зависящие от размера — дополнительный урок для редких задач.
Почти везде задачу можно решить и вручную, и программой — выбирай вкладку «Вручную» или «Python». На экзамене подойдёт любой способ, а второй пригодится для проверки.
Алфавит
Из скольких разных символов составляют пароль задачи темы?
Мощность алфавита N — сколько разных символов разрешено использовать. Наборы символов складываются. Цифр 10, заглавных латинских букв 26, строчных ещё 26: N = 10 + 26 + 26 = 62. Каждый символ пароля — один из этих 62.
Длина пароля K = 15 — другая величина: это число позиций в пароле. Пароль aaaaaaaaaaaaaaa тоже имеет длину 15, и алфавит у него по-прежнему 62 символа. Выбери набор, чтобы увидеть его мощность:
- цифры
- десятичные цифры от 0 до 910
- заглавные
- заглавные латинские буквы26
- заглавные и цифры
- заглавные латинские буквы и десятичные цифры26 + 10 = 36
- задача темы
- цифры и латинские буквы обоих регистров10 + 26 + 26 = 62
- 16-ричные цифры
- цифры шестнадцатеричной системы16: от 0 до 9 и от A до F
- цифры и 2000 знаков
- десятичные цифры и специальный алфавит из 2000 знаков10 + 2000 = 2010
Тонкости:что не меняет алфавит
Требования «хотя бы одна цифра» и «не менее одной буквы» алфавит не меняют: они говорят, какие пароли допустимы, а символ по-прежнему выбирают из всего набора.
Цифр системы счисления с основанием k ровно k: у семнадцатеричной системы 17. Если наборы пересекаются, общий символ считают один раз. Если в условии дан набор, например «12 разрешённых букв», в алфавите 12 букв, а не весь алфавит языка.
Код символа
Сколько битов нужно на один символ из 62?
Число битов на символ i — наименьшее, при котором 2ⁱ ≥ N: i битов дают 2ⁱ разных кодов, и их должно хватить на все символы. Это правило подробно разобрано в теме 7. «Одинаковое и минимально возможное количество бит» в условии означает именно его.
Удваивай, пока не перешагнёшь N: 2, 4, 8, 16, 32, 64. Число шагов — i. Для 62 символов i = 6, два кода из 64 останутся свободными — это нормально.
Функция bits из темы 7 увеличивает i, пока 2ⁱ меньше N (). Она понадобится до конца темы:
def bits(n): i = 0 while 2 ** i < n: i += 1 return i print(bits(62), bits(64), bits(65))Число битов меняется только при переходе через степень двойки: и 33, и 62, и 64 символа — по 6 битов, а 65 — уже 7.
Целые байты
Сколько байт отведено на один пароль?
Код пароля — K · i бит. Целое число байт получают делением на 8 с округлением вверх. 15 символов по 6 бит — 90 бит. 90 / 8 = 11,25: одиннадцати байт мало (88 бит), поэтому пароль занимает 12 байт.
N = 62 → i = 6; 15 · 6 = 90 бит; 90 / 8 = 11,25 → 12 байт. Подписывай единицы у каждого числа: так не сложишь биты с байтами.
Округление вверх делает из модуля math. Пройди всю цепочку по шагам:
from math import ceil def bits(n): i = 0 while 2 ** i < n: i += 1 return i i = bits(10 + 26 + 26)password = ceil(15 * i / 8)print(i, 15 * i, password)Округляют только вверх, даже если дробная часть мала: 11,25 байта — это 12. Если же биты делятся на 8 нацело, ничего не прибавляют: пароль из 16 символов — 96 бит, ровно 12 байт.
Много паролей
Сколько байт займут пароли 40 пользователей?
Сначала округляют один пароль — ему выделены целые байты, — потом умножают на число паролей. 40 · 12 = 480 байт. Расчёт 40 · 90 / 8 = 450 байт неверен: он складывает пустые хвосты паролей в общие байты, а у каждого пароля байты свои.
С 2021 года числа в задачах крупные, а ответ просят в Кбайт или Мбайт: 1 Кбайт = 1024 байта, 1 Мбайт = 1024 Кбайт. Пусть идентификатор — 180 символов из 10 цифр и 2000 специальных знаков, а хранить нужно 50 000 идентификаторов. Сколько Кбайт потребуется?
N = 2010: 1024 мало, 2048 хватает — i = 11. Идентификатор 180 · 11 = 1980 бит, 1980 / 8 = 247,5 → 248 байт. Все: 50 000 · 248 = 12 400 000 байт, в Кбайтах 12 400 000 / 1024 = 12 109,375. Целое число Кбайт, которого хватит, — 12 110.
Функция bits — выше, её пишут в начале программы:
from math import ceilone = ceil(180 * bits(10 + 2000) / 8)total = 50000 * oneprint(one, total, total / 1024)Как округлять ответ, решает вопрос: «сколько Кбайт потребуется» — вверх, иначе данные не поместятся; «запиши целую часть» — просто отбрось дробь.
Тонкости:элементы и число паролей
Вместо символов бывают элементы, типы, состояния: «описание узора — 40 элементов, всего 150 видов». Расчёт тот же: 150 видов — 8 бит, 40 · 8 = 320 бит = 40 байт.
Сколько разных паролей можно составить — другой вопрос, о переборе слов из темы 8: 62¹⁵ вариантов. Память под один пароль считают посимвольно: 15 · 6 бит.
Итого
- Алфавит Nчисло разных символов; наборы складываются
- Длина Kчисло позиций в пароле, не алфавит
- Биты iнаименьшее i, при котором 2ⁱ ≥ N
- ПарольK · i бит, делить на 8 и округлить вверх
- n паролейn · байты одного пароля
- Python
ceil(K * bits(N) / 8)
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Требования «хотя бы один»
Пароль из 12 символов может содержать заглавные и строчные латинские буквы, десятичные цифры и знаки !, ?, #, %. Каждый пароль обязан содержать хотя бы одну цифру и хотя бы один знак. Символы кодируются посимвольно одинаковым минимальным числом битов, каждому паролю — минимальное целое число байтов. Сколько байтов нужно для 40 паролей?
Введите число.
Подсказка
Требования к составу пароля не меняют алфавит.
Решение
Алфавит — 52 буквы, 10 цифр и 4 знака, N = 66; требования «хотя бы одна» его не меняют. На символ 7 бит, пароль 12 · 7 = 84 бита → 11 байтов, 40 паролей — 440 байтов.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i print(40 * ceil(12 * bits(52 + 10 + 4) / 8))Ответ: 440
Биты для 33 символов
Сколько битов нужно на символ алфавита мощностью 33?
Введите число.
Подсказка
Найди наименьшую степень двойки, не меньшую 33.
Решение
Пяти битов хватает на 2⁵ = 32 символа — на один меньше, чем нужно. Шесть битов дают 2⁶ = 64 кода, поэтому i = 6.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i print(bits(33))Ответ: 6
Пароль из 9 символов
Пароль состоит из 9 символов. Разрешены заглавные латинские буквы и десятичные цифры. Сколько байтов минимально необходимо для одного пароля?
Введите число.
Подсказка
Наборы складываются: 26 + 10.
Решение
Алфавит — 26 букв и 10 цифр, N = 36, на символ 6 бит. Пароль 9 · 6 = 54 бита, 54 / 8 = 6,75 — округляем вверх до 7 байтов.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i print(ceil(9 * bits(26 + 10) / 8))Ответ: 7
200 паролей
Пароль содержит 13 символов из алфавита мощностью 9. Каждый пароль занимает минимальное целое число байтов. Сколько байтов нужно для 200 паролей?
Введите число.
Подсказка
Сначала байты одного пароля, потом умножай на 200.
Решение
Девяти символам хватает 4 бит. Пароль 13 · 4 = 52 бита → 7 байтов. Целые байты у каждого пароля, поэтому 200 · 7 = 1400.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i print(200 * ceil(13 * bits(9) / 8))Ответ: 1400
Байты всей последовательности
Каждый из 15 кодов состоит из 11 символов алфавита мощностью 6. Все коды записаны подряд, и целое число байтов выделяется всей последовательности. Сколько байтов займут все коды?
Введите число.
Подсказка
Целые байты выделяют всей последовательности — округляй только её.
Решение
Шести символам хватает 3 бит, код — 11 · 3 = 33 бита. Коды идут подряд, поэтому сначала складывают биты: 15 · 33 = 495 бит, 495 / 8 = 61,875 → 62 байта. С целыми байтами на каждый код было бы 15 · 5 = 75.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i code = 11 * bits(6)print(ceil(15 * code / 8))Ответ: 62
Сколько битов, а не сколько паролей
Пароли длиной 6 составляют из алфавита в 4 символа. Сколько битов занимает один пароль при посимвольном кодировании?
Введите число.
Подсказка
Память пароля — длина, умноженная на биты одного символа.
Решение
Четырём символам хватает 2 бит, пароль из 6 символов — 6 · 2 = 12 бит. Число 4⁶ = 4096 — сколько разных паролей можно составить, а не сколько битов занимает один.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i print(6 * bits(4))Ответ: 12
Описания узоров
Описание узора — последовательность из 40 элементов; всего существует 150 видов элементов, каждый кодируется одинаковым минимальным числом битов, описанию выделяется минимальное целое число байтов. Сколько Кбайт займут 1024 описания?
Введите число.
Подсказка
Элементы вместо символов: расчёт тот же.
Решение
150 видам элементов нужно 8 бит. Описание — 40 · 8 = 320 бит = 40 байтов. 1024 описания — 1024 · 40 байтов = 40 Кбайт.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i print(1024 * ceil(40 * bits(150) / 8) // 1024)Ответ: 40
Идентификаторы в Мбайтах
При регистрации каждому объекту присваивается идентификатор из 180 символов; символы — цифры шестнадцатеричной системы и знаки из специального алфавита в 2000 символов. Для каждого идентификатора отведено одинаковое минимально возможное целое число байтов, кодирование посимвольное, все символы кодируются одинаковым минимальным числом битов. Определи объём памяти в Мбайт для хранения 524 288 идентификаторов.
Введите число.
Подсказка
Цифр шестнадцатеричной системы 16.
Решение
Алфавит — 16 цифр шестнадцатеричной системы и 2000 знаков, N = 2016, на символ 11 бит. Идентификатор 180 · 11 = 1980 бит → 248 байтов. Все: 524 288 · 248 байтов, делим на 2²⁰ — 124 Мбайт.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i per = ceil(180 * bits(16 + 2000) / 8)print(524_288 * per // 2 ** 20)Ответ: 124
Наименьшее целое число Кбайт
Номер детали состоит из 95 символов: десятичные цифры, заглавные латинские буквы и знаки специального набора из 1200 символов. Каждый номер занимает одинаковое минимально возможное целое число байтов, кодирование посимвольное, все символы кодируются одинаковым минимальным числом битов. Определи наименьшее целое число Кбайт, достаточное для хранения 12 000 номеров.
Введите число.
Подсказка
Наименьшее целое число Кбайт, которого хватит, — округление вверх.
Решение
N = 10 + 26 + 1200 = 1236, на символ 11 бит. Номер 95 · 11 = 1045 бит → 131 байт. Все номера — 12 000 · 131 = 1 572 000 байтов = 1535,15… Кбайт; чтобы всё поместилось, нужно 1536 Кбайт.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i per = ceil(95 * bits(10 + 26 + 1200) / 8)print(ceil(12_000 * per / 1024))Ответ: 1536