Введение в задание 11
Задание 11 ЕГЭ по информатике проверяет умение определять объём памяти, необходимый для хранения паролей, идентификаторов, серийных номеров и других символьных последовательностей.
В большинстве задач используется равномерное кодирование: каждый символ кодируется одинаковым и минимально возможным количеством бит.
Как устроена задача
| Что может быть дано | Что это означает |
|---|---|
| Мощность алфавита | Количество символов, которые разрешено использовать |
| Длина пароля | Количество символов в одном пароле |
| Количество паролей | Сколько записей хранится в базе данных |
| Дополнительные сведения(неоябязательно) | Информация, которая хранится вместе с каждым паролем |
| Ограничение на память | Максимальный объём базы данных или одной записи |
Обычно решение состоит из трёх основных действий:
- Определить количество бит на один символ.
- Найти объём одного пароля.
- Найти объём всех паролей вместе с дополнительными сведениями.
Что такое алфавит
Рассмотрим шестизначный пароль. Предположим, что в нём можно использовать около 100 разных символов:
- цифры от 0 до 9;
- заглавные и строчные латинские буквы;
- знаки препинания;
- специальные символы клавиатуры.
Набор всех символов, которые разрешено использовать, называется алфавитом, а количество символов в нём — мощностью алфавита.
В нашем примере:
где — мощность алфавита.
Сколько бит требуется на один символ
Каждый символ пароля кодируется одинаковым и минимально возможным количеством бит.
Чтобы определить это количество, используется уже знакомая по заданию 7 формула:
| Обозначение | Что означает |
|---|---|
| Мощность алфавита, то есть количество допустимых символов | |
| Количество бит, необходимое для кодирования одного символа | |
| Количество различных двоичных кодов длиной бит |
Для алфавита из 100 символов нужно найти минимальное значение , при котором выполняется условие:
Сравним ближайшие степени двойки:
| Количество бит | Количество кодов | Достаточно для 100 символов? |
|---|---|---|
| 5 бит | Нет | |
| 6 бит | Нет | |
| 7 бит | Да |
Получаем:
Следовательно, для кодирования одного символа требуется:
Важно: мы определяем не количество символов в одном бите, а количество бит, необходимое для кодирования одного символа.
Наглядная схема кодирования
Алфавит из 100 символов
↓ ищем ближайшую подходящую степень двойки
возможных кодов
↓ значит
Один символ занимает 7 бит
↓ пароль состоит из 6 символов
бита
↓ переводим в байты
байта
↓ округляем вверх
Один пароль занимает 6 байт
Объём одного пароля
Объём пароля до округления вычисляется по формуле:
| Обозначение | Что означает |
|---|---|
| Информационный объём пароля в битах | |
| Длина пароля в символах | |
| Количество бит на один символ |
В нашем примере пароль состоит из шести символов, каждый из которых занимает 7 бит:
Таким образом, непосредственно для кодирования символов пароля требуется 42 бита.
Что означает «целое количество байт»
В условии задания часто встречается следующая фраза:
В базе данных для хранения каждого пароля отведено одинаковое и минимально возможное целое количество байт.
Разберём эту формулировку по частям.
| Часть формулировки | Что она означает |
|---|---|
| Одинаковое количество байт | Для каждого пароля выделяется один и тот же объём памяти |
| Целое количество байт | Объём одной записи не может быть равен 5,25 или 6,5 байта |
| Минимально возможное | Нужно выделить как можно меньше памяти, но её должно хватить для хранения пароля |
Сначала переведём 42 бита в байты:
Выделить 5,25 байта невозможно, поэтому результат необходимо округлить вверх:
Почему округляем вверх
Проверим, хватит ли пяти байтов:
Пяти байтов недостаточно, потому что пароль занимает 42 бита.
Проверим шесть байтов:
Шести байтов достаточно.
| Выделенная память | Количество бит | Хватит для 42 бит? |
|---|---|---|
| 5 байт | 40 бит | Нет |
| 6 байт | 48 бит | Да |
Следовательно, минимальный целый объём памяти равен:
Из 48 выделенных бит:
- 42 бита используются для кодирования символов пароля;
- 6 бит остаются неиспользованными.
Два разных округления
В задании встречаются два разных этапа определения целого значения.
| Этап | Что делаем | Почему |
|---|---|---|
| Определяем количество бит на символ | Выбираем минимальное , при котором | Кодовых комбинаций должно хватить для всех символов алфавита |
| Определяем количество байт на пароль | Делим количество бит на 8 и округляем вверх | Для записи выделяется целое количество байт |
Для нашего примера:
После округления вверх:
Что может попасться в задании
В задании № 11 обычно требуется определить один из параметров, связанных с хранением паролей, идентификаторов или серийных номеров в базе данных.
| Что требуется найти | Обозначение | Основная идея |
|---|---|---|
| Объём памяти | Найти размер одной записи и умножить его на количество записей | |
| Длину пароля или номера | Определить допустимый размер одной записи и подобрать длину | |
| Мощность алфавита | Сначала найти количество бит на символ, а затем определить границы мощности алфавита | |
| Количество бит на символ | Найти по мощности алфавита или доступному объёму памяти |
Основные величины связаны следующей схемой:
| Обозначение | Значение |
|---|---|
| мощность алфавита — количество допустимых символов | |
| количество бит, необходимое для кодирования одного символа | |
| количество символов в пароле или серийном номере | |
| целое количество байт, выделяемое на одну запись | |
| количество паролей, номеров или пользователей | |
| общий объём памяти |
Шаг 1. Определить мощность алфавита
Если в условии перечислены разные группы символов, необходимо сложить их количество.
Например, если используются:
- 10 десятичных цифр;
- 26 латинских букв;
- 450 специальных символов,
то мощность алфавита равна:
Если сказано, что используются прописные и строчные латинские буквы, их необходимо считать отдельно:
Важно. Фраза «без учёта регистра» означает, что прописные и строчные буквы не различаются. В таком случае латинских букв будет 26, а не 52.
Шаг 2. Найти количество бит на один символ
Все символы кодируются одинаковым и минимально возможным количеством бит. Поэтому нужно найти наименьшее целое значение , для которого выполняется условие:
Например, если в алфавите 52 символа:
Следовательно:
Для быстрого решения полезно помнить степени двойки:
| Бит на символ | Максимальное количество символов |
|---|---|
| 1 | 2 |
| 2 | 4 |
| 3 | 8 |
| 4 | 16 |
| 5 | 32 |
| 6 | 64 |
| 7 | 128 |
| 8 | 256 |
| 9 | 512 |
| 10 | 1024 |
Шаг 3. Найти объём одного пароля в битах
Если пароль состоит из символов, а для кодирования одного символа используется бит, то информационный объём пароля равен:
Например, для пароля длиной 10 символов при :
Шаг 4. Перевести объём одной записи в байты
В базе данных для хранения каждого пароля отводится одинаковое и минимально возможное целое количество байт.
Поэтому полученное количество бит необходимо разделить на 8 и округлить вверх:
Для пароля объёмом 60 бит получаем:
| Выделено памяти | Вместимость | Достаточно для 60 бит? |
|---|---|---|
| 7 байт | 56 бит | Нет |
| 8 байт | 64 бита | Да |
Следовательно, на один пароль необходимо выделить 8 байт.
Округлять нужно именно вверх. Если округлить до 7 байт, для хранения пароля не хватит памяти.
Шаг 5. Учесть количество записей
Если в базе хранится паролей или серийных номеров, общий объём памяти равен:
Полная формула имеет вид:
Если ответ необходимо получить в Кбайтах, используем перевод:
Основные прототипы задания
Прототип 1. Найти общий объём памяти
В условии обычно известны:
- мощность алфавита ;
- длина пароля ;
- количество записей .
Требуется найти общий объём памяти .
Порядок решения:
- Найти количество бит на символ из условия .
- Найти объём одного пароля в битах: .
- Разделить полученный объём на 8.
- Округлить количество байт вверх.
- Умножить размер одной записи на количество записей.
- При необходимости перевести результат в Кбайты.
Схема решения:
Прототип 2. Найти длину пароля или серийного номера
В условии обычно известны:
- мощность алфавита ;
- количество записей ;
- ограничение на общий объём памяти .
Требуется найти длину одной записи .
Порядок решения:
- Найти количество бит на символ .
- Перевести общий объём памяти в байты.
- Определить допустимое количество байт на одну запись.
- Использовать формулу:
- Найти подходящее целое значение .
- Проверить найденную длину и соседнее значение.
При решении необходимо внимательно прочитать формулировку ограничения:
| Формулировка | Математическое условие |
|---|---|
| Не более | Объём |
| Менее | Объём |
| Не менее | Объём |
| Более | Объём |
Если общий объём должен быть более указанного значения, получить равенство недостаточно: результат должен строго превышать границу.
Из-за округления до целого количества байт найденную длину обязательно нужно проверить подстановкой. Желательно также проверить соседнее значение.
Прототип 3. Найти мощность алфавита
В условии обычно известны:
- длина серийного номера ;
- количество записей ;
- общий объём памяти .
Требуется определить мощность алфавита .
Порядок решения:
- Перевести общий объём памяти в байты.
- Определить количество байт, выделяемое на одну запись.
- Перевести размер одной записи в биты.
- Определить количество бит на один символ .
- По найденному значению определить мощность алфавита .
Главная сложность этого прототипа заключается в последнем действии.
Почему нельзя всегда использовать формулу
Формула
показывает максимальное количество символов, которое можно закодировать с помощью бит.
Однако фактическая мощность алфавита может быть меньше этого значения.
Если на кодирование одного символа требуется 4 бита, то:
Следовательно, алфавит может содержать от 9 до 16 символов.
| Мощность алфавита | Необходимое количество бит |
|---|---|
| 8 | 3 бита |
| 9 | 4 бита |
| 10 | 4 бита |
| 15 | 4 бита |
| 16 | 4 бита |
| 17 | 5 бит |
Если требуется найти максимальную мощность алфавита, используется формула:
Если требуется найти минимальную мощность алфавита, при которой уже необходимо бит, используется формула:
Например, если для кодирования одного символа требуется 4 бита:
Частая ошибка: получить и сразу записать в ответе 16. Это правильно только тогда, когда требуется максимальная мощность алфавита. Если требуется минимальная мощность, ответом будет 9.
Таблица возможных границ:
| Бит на символ | Возможные значения | Минимальная мощность | Максимальная мощность |
|---|---|---|---|
| 2 | 3 | 4 | |
| 3 | 5 | 8 | |
| 4 | 9 | 16 | |
| 5 | 17 | 32 | |
| 6 | 33 | 64 | |
| 7 | 65 | 128 | |
| 8 | 129 | 256 | |
| 9 | 257 | 512 |
Как определить размер одной записи по общему объёму
Пусть на хранение записей отведено байт.
Если сказано, что общий объём составляет не более байт, максимальный размер одной записи равен:
Если сказано, что общий объём составляет не менее байт, минимальный размер одной записи равен:
Если сказано, что общий объём составляет более байт, равенство не подходит. Необходимо найти первое целое количество байт, при котором:
В таком случае:
После этого нужно найти такое значение или , при котором размер одной записи удовлетворяет условию:
Из-за округления байтов вверх найденное значение нужно проверить подстановкой.
Универсальная схема решения
- Выписать известные величины: , , , и .
- Перевести общий объём памяти в байты.
- Если известна мощность алфавита, найти минимальное из условия .
- Если известен общий объём, определить допустимое количество байт на одну запись.
- Использовать формулу:
- Найти неизвестную величину.
- Проверить полученный результат и соседнее целое значение.
- Если требуется мощность алфавита, определить, какую именно границу спрашивают.
| Что требуется найти | Формула |
|---|---|
| Максимальная мощность алфавита | |
| Минимальная мощность алфавита |
Разбор заданий с реального ЕГЭ
Задание с основной волны 2026
На предприятии каждой изготовленной детали присваивают серийный номер, состоящий из 440 символов. В базе данных для хранения каждого серийного номера отведено одинаковое и минимально возможное целое число байт. Используется посимвольное кодирование серийных номеров: все символы кодируются одинаковым и минимально возможным количеством бит. Известно, что для хранения 1 892 412 серийных номеров требуется не менее 305 726 Кбайт памяти. Определите минимально возможную мощность алфавита, используемого для записи серийных номеров. В ответе запишите только целое число.
Необходимо по общему объёму памяти определить минимальное количество бит, используемое для кодирования одного символа. После этого нужно найти не максимальную, а минимальную мощность алфавита, при которой требуется такое количество бит.
Дано
| Величина | Значение |
|---|---|
| Длина серийного номера | символов |
| Количество серийных номеров | |
| Общий объём памяти | не менее 305 726 Кбайт |
| Кодирование | посимвольное |
| Размер одной записи | целое количество байт |
Что нужно найти
Минимально возможную мощность алфавита .
Решение
Шаг 1. Переведём общий объём памяти в байты
В одном Кбайте содержится 1024 байта:
Шаг 2. Выразим размер одного серийного номера
Пусть для кодирования одного символа используется бит.
Тогда информационный объём серийного номера равен:
Количество байт, выделяемое на один номер:
Поскольку 440 делится на 8 без остатка:
Шаг 3. Составим неравенство
Объём всех серийных номеров должен быть не меньше 313 063 424 байт:
Количество бит должно быть целым, поэтому:
Шаг 4. Проверим соседнее значение
Если , размер одного номера составляет:
Общий объём:
Это меньше 313 063 424 байт, поэтому трёх бит недостаточно.
При условие уже выполняется.
Шаг 5. Найдём минимальную мощность алфавита
Если для одного символа требуется 4 бита, мощность алфавита находится в пределах:
Минимальное целое значение:
Важно. В этой задаче нельзя записывать , потому что требуется минимальная, а не максимальная мощность алфавита.
Ответ
Задание с основной волны 2025
На предприятии каждой изготовленной детали присваивают серийный номер, содержащий десятичные цифры и символы из 27-символьного специального алфавита. В базе данных каждый серийный номер занимает одинаковое и минимально возможное целое число байт. Используется посимвольное кодирование: все символы кодируются одинаковым и минимально возможным количеством бит. Известно, что для хранения 3548 серийных номеров необходимо более 12 Кбайт памяти. Определите минимально возможную длину серийного номера.
Сначала необходимо определить мощность алфавита и количество бит на один символ. Затем по общему объёму памяти нужно найти минимальное количество байт на одну запись и подобрать минимальную длину серийного номера.
Дано
| Величина | Значение |
|---|---|
| Десятичные цифры | 10 символов |
| Специальный алфавит | 27 символов |
| Количество серийных номеров | |
| Общий объём памяти | более 12 Кбайт |
| Размер одной записи | целое количество байт |
Что нужно найти
Минимально возможную длину серийного номера .
Решение
Шаг 1. Найдём мощность алфавита
Серийный номер может содержать десятичные цифры и специальные символы:
Шаг 2. Найдём количество бит на один символ
Подберём минимальное значение , при котором :
Следовательно:
Шаг 3. Переведём общий объём в байты
По условию общий объём должен быть более 12 288 байт.
Шаг 4. Определим минимальный размер одной записи
Разделим общий объём на количество серийных номеров:
Если выделить по 3 байта на один номер, получим:
Этого недостаточно.
Следовательно, минимальный подходящий размер одной записи составляет:
Шаг 5. Найдём минимальную длину номера
Размер одного номера определяется формулой:
Подставим :
Нужно найти минимальное значение , при котором размер записи станет равен 4 байтам.
Проверим :
Общий объём:
Условие не выполняется.
Проверим :
Общий объём:
Условие выполняется, поэтому минимальная длина серийного номера равна 5 символам.
Ответ
Задание с основной волны 2024
На предприятии каждой изготовленной детали присваивается серийный номер, содержащий десятичные цифры, 26 латинских букв без учёта регистра и символы из 450-символьного специального алфавита. В базе данных для хранения каждого серийного номера отведено одинаковое и минимально возможное целое число байт. Используется посимвольное кодирование серийных номеров: все символы кодируются одинаковым и минимально возможным количеством бит. Известно, что для хранения 708 серийных номеров отведено более 213 Кбайт памяти. Определите минимально возможную длину серийного номера.
Необходимо найти мощность общего алфавита и количество бит на один символ. Затем по ограничению на общий объём памяти определяется минимальный размер одной записи, после чего подбирается минимальная длина серийного номера.
Дано
| Величина | Значение |
|---|---|
| Десятичные цифры | 10 символов |
| Латинские буквы без учёта регистра | 26 символов |
| Специальный алфавит | 450 символов |
| Количество серийных номеров | |
| Общий объём памяти | более 213 Кбайт |
| Размер одной записи | целое количество байт |
Что нужно найти
Минимально возможную длину серийного номера .
Решение
Шаг 1. Найдём мощность алфавита
Сложим количество символов всех групп:
Шаг 2. Найдём количество бит на один символ
Подберём минимальное значение , при котором :
Следовательно:
Шаг 3. Переведём общий объём в байты
По условию общий объём должен быть более 218 112 байт.
Шаг 4. Определим минимальный размер одной записи
Разделим общий объём на количество номеров:
Проверим 308 байт на одну запись:
Полученный объём меньше 218 112 байт, поэтому 308 байт недостаточно.
Минимальный подходящий размер одной записи:
Проверка:
Шаг 5. Найдём минимальную длину номера
Размер одной записи определяется формулой:
Подставим :
Нужно найти минимальное значение , при котором размер записи станет равен 309 байтам.
Проверим :
Этого недостаточно.
Проверим :
Условие выполняется.
Следовательно, минимальная длина серийного номера равна 274 символам.
Ответ
Задание с основной волны 2023
При регистрации в компьютерной системе каждому пользователю выдаётся пароль, состоящий из 10 символов. В качестве символов используются прописные и строчные буквы латинского алфавита, то есть всего 52 различных символа. В базе данных для хранения каждого пароля отведено одинаковое и минимально возможное целое число байт. Используется посимвольное кодирование паролей: все символы кодируются одинаковым и минимально возможным количеством бит. Определите объём памяти в Кбайтах, необходимый для хранения данных о 65 536 пользователях. В ответе запишите только целое число — количество Кбайт.
Необходимо определить количество бит на один символ, найти размер одного пароля в целом количестве байт, а затем умножить его на количество пользователей.
Дано
| Величина | Значение |
|---|---|
| Мощность алфавита | символа |
| Длина пароля | символов |
| Количество пользователей | |
| Размер одной записи | целое количество байт |
Что нужно найти
Общий объём памяти в Кбайтах.
Решение
Шаг 1. Найдём количество бит на один символ
Подберём минимальное значение , при котором :
Следовательно:
Шаг 2. Найдём объём одного пароля в битах
Пароль состоит из 10 символов:
Шаг 3. Переведём объём одного пароля в байты
Для каждого пароля выделяется минимально возможное целое количество байт:
На хранение одного пароля требуется 8 байт.
Округление выполняется вверх отдельно для каждого пароля, а не после вычисления объёма всех паролей.
Шаг 4. Найдём общий объём памяти
Шаг 5. Переведём байты в Кбайты
Ответ
Решение задания 11 с помощью Python
Некоторые задачи № 11 можно решить перебором. Программа последовательно проверяет возможные значения длины или мощности алфавита и выводит первое значение, которое удовлетворяет условию.
Код для нахождения минимальной длины
from math import *
for dlina in range(1, 1000):
alf = 10 + 62
i = ceil(log2(alf))
V = ceil(dlina * i / 8)
if V * 5_895_222 > 23 * 1024 * 1024:
print(dlina)
break
Этот код перебирает возможную длину пароля или серийного номера.
| Фрагмент кода | За что отвечает |
|---|---|
from math import * | Подключает математические функции log2() и ceil() |
range(1, 1000) | Перебирает числа от 1 до 999 |
dlina | Проверяемая длина пароля или номера |
alf | Мощность алфавита |
i | Количество бит на один символ |
V | Количество байт на одну запись |
5_895_222 | Количество записей |
23 * 1024 * 1024 | 23 Мбайт, переведённые в байты |
Как работает программа
- Перебирается возможная длина:
for dlina in range(1, 1000):
Сначала программа проверит длину 1, затем 2, 3 и так далее.
- Находится мощность алфавита:
alf = 10 + 62
В данном случае алфавит состоит из двух групп: 10 и 62 символов.
- Определяется минимальное количество бит на один символ:
i = ceil(log2(alf))
Функция log2(alf) вычисляет, в какую степень нужно возвести 2, чтобы получить мощность алфавита. Функция ceil() округляет результат вверх.
Таким образом, эта строка соответствует условию:
- Находится размер одной записи в байтах:
V = ceil(dlina * i / 8)
Сначала длина умножается на количество бит на символ. Затем результат делится на 8 и округляется вверх до целого количества байт:
- Проверяется общий объём памяти:
if V * 5_895_222 > 23 * 1024 * 1024:
Размер одной записи умножается на количество записей. Полученное значение сравнивается с 23 Мбайт.
- Выводится первая подходящая длина:
print(dlina)
break
Поскольку значения перебираются от меньшего к большему, первое подходящее значение будет минимальной длиной.
Команда
breakостанавливает перебор после нахождения ответа. Без неё программа выведет не только минимальную длину, но и все последующие подходящие значения.
Код для нахождения минимальной мощности алфавита
from math import *
for x in range(1, 1000):
alf = x
dlina = 172
bit = ceil(log2(alf))
V = ceil(dlina * bit / 8)
if 356_984 * V >= 54 * 1024 ** 2:
print(x)
break
Этот код перебирает возможную мощность алфавита.
| Фрагмент кода | За что отвечает |
|---|---|
x | Проверяемая мощность алфавита |
alf = x | Текущее значение мощности алфавита |
dlina = 172 | Длина одного серийного номера |
bit | Количество бит на один символ |
V | Размер одного номера в целых байтах |
356_984 | Количество серийных номеров |
54 * 1024 ** 2 | 54 Мбайт, переведённые в байты |
Как работает программа
- Перебирается возможная мощность алфавита:
for x in range(1, 1000):
Программа последовательно проверяет алфавиты мощностью 1, 2, 3 и так далее.
- Текущее значение записывается в переменную
alf:
alf = x
- Указывается известная длина номера:
dlina = 172
- Находится минимальное количество бит на один символ:
bit = ceil(log2(alf))
- Вычисляется размер одного номера в целых байтах:
V = ceil(dlina * bit / 8)
- Проверяется общий объём всех номеров:
if 356_984 * V >= 54 * 1024 ** 2:
Левая часть — фактический объём всех записей. Правая часть — 54 Мбайт, переведённые в байты.
- Выводится первая подходящая мощность алфавита:
print(x)
break
Первое найденное значение является минимальной мощностью алфавита.
Такой перебор особенно удобен в задачах на минимальную мощность алфавита. Программа проверяет сами значения , поэтому не возникает ошибки, когда вместо минимальной мощности записывают максимальное значение .
Чем отличаются два кода
| Код | Что перебирается | Что остаётся постоянным | Что выводится |
|---|---|---|---|
| Поиск длины | dlina | Мощность алфавита | Минимальная длина |
| Поиск алфавита | x | Длина номера | Минимальная мощность алфавита |
Общий принцип у обоих решений одинаковый:
- Перебрать возможное значение.
- Найти количество бит на символ.
- Найти целое количество байт на одну запись.
- Вычислить общий объём памяти.
- Проверить условие.
- Вывести первое подходящее значение и остановить перебор.