Что требуется найти в задании 11
Во всех трёх разборах символы кодируются одинаковым минимальным числом бит, а под каждый номер выделяется отдельное минимальное целое число байт. Сначала пойми, в какую сторону нужно пройти цепочку.
| Известно | Спрашивают | Маршрут |
|---|---|---|
| Алфавит K, длина L, число номеров n | Объём памяти | K → i → B → B · n |
| Длина L, число n, нижнее ограничение памяти | Минимальный алфавит | Проверяем i по памяти → первый подходящий i → минимальное K |
| Длина L, число n, верхнее ограничение памяти | Максимальный алфавит | Проверяем i по памяти → последний подходящий i → максимальное K |
Как связаны алфавит и биты на символ
i бит дают 2ⁱ различных кодов. Для алфавита мощности K выбираем минимальное целое i с условием 2**i ≥ K. Если 4096 кодов уже заняты, ещё один символ требует дополнительного бита.
| Биты i | Какие мощности K требуют именно i бит | Максимум кодов |
|---|---|---|
| 5 | 17…32 | 32 |
| 6 | 33…64 | 64 |
| 7 | 65…128 | 128 |
| 8 | 129…256 | 256 |
| 12 | 2049…4096 | 4096 |
| 13 | 4097…8192 | 8192 |
Для алфавитов с K ≥ 2 диапазон, соответствующий ровно i битам, задаётся так:
Отсюда минимальное K = 2**(i−1) + 1, а максимальное K = 2**i. Эти формулы выбирают разные концы одного диапазона.
Где именно округлять байты
Номер длиной L при i битах на символ содержит L · i бит. Если под каждый номер выделяется целое количество байт, нужно округлить один номер вверх до байта, затем умножить на количество номеров.
Для положительных целых величин в Python это B = (L * i + 7) // 8. Если L · i делится на 8, лишний байт не прибавляется.
Пример: три номера по 9 бит
Один номер: 9 / 8 = 1,125 байта → выделяем 2 байта. Три номера занимают 6 байт. Если сложить 27 бит всех номеров и округлить только один раз, получится 4 байта — такая общая упаковка не соответствует условию отдельного хранения.
В Мбайты переводим уже общий объём в байтах: V / 1024**2. Дополнительное округление Мбайтов делают только по требованию вопроса.
Определи тип до вычислений
В этих шести вопросах не нужно подставлять числа. Выбери, что искать, какую связь использовать и как закончить решение.
Определено: 0 из 6
Найти общий объём памяти
Шаг 1. Собери общий алфавит
В семнадцатеричной системе 17 разных цифр. Поэтому K = 17 + 4080 = 4097.
Шаг 2. Выбери число бит
2¹² = 4096 < 4097, а 2¹³ = 8192 ≥ 4097. Нужно i = 13 бит на символ.
Шаг 3. Округли один номер до байта
257 · 13 = 3341 бит. Делим на 8: 417,625 байта → 418 байт на номер.
Шаг 4. Посчитай все номера
Число номеров равно 8 · 1024², поэтому после перевода в Мбайты остаётся 418 · 8.
alphabet = 17 + 4080
bits = 0
while 2 ** bits < alphabet:
bits += 1
bytes_per_id = (257 * bits + 7) // 8
total_bytes = bytes_per_id * 8388608
print(total_bytes // (1024 ** 2)) # здесь результат — целое число МбайтНайти минимальную мощность алфавита
Шаг 1. Запиши ограничение на всю память
Ищем первые целые i бит, при которых это неравенство выполнено. В шпаргалке деление 12 · 1024² · 8 / 94 523 / 204 ≈ 5,222 даёт ориентир. Окончательно проверяем хранение в целых байтах.
| i | Биты одного номера | Целые байты одного номера | Весь объём | Подходит? |
|---|---|---|---|---|
| 5 | 1020 | 128 | 12 098 944 байта ≈ 11,538 Мбайт | Нет: меньше 12 Мбайт |
| 6 | 1224 | 153 | 14 462 019 байт ≈ 13,792 Мбайт | Да: не менее 12 Мбайт |
Шаг 2. Возьми минимальный алфавит для 6 бит
Пять бит вмещают 32 символа. Чтобы понадобился шестой бит, нужен хотя бы 33-й символ.
length = 204
count = 94523
limit_bytes = 12 * 1024 ** 2
bits = 1
while ((length * bits + 7) // 8) * count < limit_bytes:
bits += 1
min_alphabet = 2 ** (bits - 1) + 1
print(min_alphabet)Цикл в коде продолжается, пока объём ещё меньше 12 Мбайт. Он заканчивается на первых битах, для которых условие «не менее» уже выполнено.
Найти максимальную мощность алфавита
Шаг 1. Сохрани строгое неравенство
Ориентир из деления — примерно 8,145 бита. Проверяем 8 и 9 с округлением каждого номера до байта:
| i | Биты одного номера | Целые байты одного номера | Весь объём | Подходит? |
|---|---|---|---|---|
| 8 | 992 | 124 | 15 448 788 байт ≈ 14,733 Мбайт | Да: меньше 15 Мбайт |
| 9 | 1116 | 140 | 17 442 180 байт ≈ 16,634 Мбайт | Нет: больше предела |
Шаг 2. Возьми верхний конец допустимого алфавита
Последняя подходящая глубина i = 8. При ней можно использовать до 2⁸ символов.
length = 124
count = 124587
limit_bytes = 15 * 1024 ** 2
bits = 0
while ((length * (bits + 1) + 7) // 8) * count < limit_bytes:
bits += 1
max_alphabet = 2 ** bits
print(max_alphabet)Почему одной дробной оценки бит недостаточно
Деление общего лимита битов на число символов удобно для оценки. Но оно не учитывает свободные биты в округлённых байтах каждого номера. Поэтому общий объём нужно проверять по точной формуле ((L * i + 7) // 8) * n.
Возьмём два номера длиной по 3 символа. Посмотрим, сколько они занимают при разных i:
| i бит/символ | Бит в одном номере | Байт на номер | Байт на два номера |
|---|---|---|---|
| 2 | 6 | 1 | 2 |
| 3 | 9 | 2 | 4 |
| 4 | 12 | 2 | 4 |
| 5 | 15 | 2 | 4 |
| 6 | 18 | 3 | 6 |
Теперь одна таблица даёт три разных ответа:
| Что сказано о памяти | Вопрос | Выбор i | Мощность алфавита |
|---|---|---|---|
| Не менее 4 байт: V ≥ 4 | Минимальный алфавит | Первый подходящий i = 3 | 2² + 1 = 5 |
| Менее 4 байт: V < 4 | Максимальный алфавит | Последний подходящий i = 2 | 2² = 4 |
| Не более 4 байт: V ≤ 4 | Максимальный алфавит | Последний подходящий i = 5 | 2⁵ = 32 |
Подбери i и выбери нужную границу алфавита
Выбери условие и меняй число бит на символ. Смотри, сколько байт выделяется на номер, выполняется ли ограничение и какой диапазон алфавита соответствует этим битам. Затем введи итоговую мощность алфавита.
Для этих пяти примеров достаточно проверять от 1 до 16 бит. При новом условии диапазон поиска нужно выбирать по его данным.
Двенадцать упражнений на память и алфавит
Проверяй, где округлить байты и какой конец диапазона алфавита нужен. После ошибки можно изменить ответ.
Решено: 0 из 12
1. Вместимость кода
Сколько различных символов можно закодировать 12 битами?
2. На один символ больше
Сколько бит нужно для алфавита из 4097 символов?
3. Один номер
Идентификатор содержит 9 бит данных. Сколько целых байт минимально выделят под него?
4. Три отдельных номера
Три номера по 9 бит каждый хранятся отдельно в минимальном целом количестве байт. Сколько байт займут все номера?
5. Минимальный алфавит
Для символа требуется ровно 6 бит при минимальном кодировании. Какова минимальная мощность алфавита?
6. Максимальный алфавит
При тех же 6 битах какова максимальная мощность алфавита?
7. Байты большого номера
Длина 257 символов, на каждый по 13 бит. Сколько целых байт минимально выделяется под один номер?
8. Объём всей базы
Один номер занимает 418 байт, номеров 8 · 1024². Сколько Мбайт требуется?
9. «Не менее»
Допустимо ли равенство V = 12 Мбайт, если требуется «не менее 12 Мбайт»? Ответь «да» или «нет».
10. «Менее»
Допустимо ли равенство V = 15 Мбайт, если требуется «менее 15 Мбайт»? Ответь «да» или «нет».
11. Короткие номера: минимум
Два номера по 3 символа занимают не менее 4 байт при отдельном минимальном хранении. Найди минимальную мощность алфавита.
12. Короткие номера: максимум
Те же два номера по 3 символа должны занимать не более 4 байт. Найди максимальную мощность алфавита.
Проверка перед ответом
- Мощность алфавита включает все разные символы, в том числе цифры указанной системы счисления.
- Для i бит выполнено 2ⁱ ≥ K, а меньшего числа бит недостаточно.
- Байты округлены вверх отдельно для каждого номера.
- Количество номеров применено после округления одного номера.
- Слова «менее», «не более», «больше», «не менее» переведены в точные знаки сравнения.
- При обратном поиске проверены подходящее и соседнее неподходящее число бит.
- Если спрашивают алфавит, в ответе записано K, а не i.
- Для минимума выбран 2**(i−1)+1, для максимума — 2**i.
Программы с точным байтовым подсчётом
Три полных решения из разборов и два небольших опыта: отдельное округление номеров и сравнение трёх ограничений памяти. Все программы печатают конечные ответы.
Скачать программы PythonВидео по заданию №11
Видео скоро выйдет.
Продолжи подготовку в учебнике
Теория и полный разбор задания 11 ЕГЭ доступны в учебнике. В практике решай новые условия: сначала определи направление поиска, затем проверь точную память по целым байтам.