Введение в задание 11

Задание 11 ЕГЭ по информатике проверяет умение определять объём памяти, необходимый для хранения паролей, идентификаторов, серийных номеров и других символьных последовательностей.

В большинстве задач используется равномерное кодирование: каждый символ кодируется одинаковым и минимально возможным количеством бит.

Как устроена задача

Что может быть даноЧто это означает
Мощность алфавитаКоличество символов, которые разрешено использовать
Длина пароляКоличество символов в одном пароле
Количество паролейСколько записей хранится в базе данных
Дополнительные сведения(неоябязательно)Информация, которая хранится вместе с каждым паролем
Ограничение на памятьМаксимальный объём базы данных или одной записи

Обычно решение состоит из трёх основных действий:

  1. Определить количество бит на один символ.
  2. Найти объём одного пароля.
  3. Найти объём всех паролей вместе с дополнительными сведениями.

Что такое алфавит

Рассмотрим шестизначный пароль. Предположим, что в нём можно использовать около 100 разных символов:

  • цифры от 0 до 9;
  • заглавные и строчные латинские буквы;
  • знаки препинания;
  • специальные символы клавиатуры.

Набор всех символов, которые разрешено использовать, называется алфавитом, а количество символов в нём — мощностью алфавита.

В нашем примере:

N=100N = 100

где NN — мощность алфавита.

Сколько бит требуется на один символ

Каждый символ пароля кодируется одинаковым и минимально возможным количеством бит.

Чтобы определить это количество, используется уже знакомая по заданию 7 формула:

N=2iN = 2^i

ОбозначениеЧто означает
NNМощность алфавита, то есть количество допустимых символов
iiКоличество бит, необходимое для кодирования одного символа
2i2^iКоличество различных двоичных кодов длиной ii бит

Для алфавита из 100 символов нужно найти минимальное значение ii, при котором выполняется условие:

2i1002^i \geq 100

Сравним ближайшие степени двойки:

Количество бит iiКоличество кодов 2i2^iДостаточно для 100 символов?
5 бит25=322^5 = 32Нет
6 бит26=642^6 = 64Нет
7 бит27=1282^7 = 128Да

Получаем:

26<100272^6 < 100 \leq 2^7

Следовательно, для кодирования одного символа требуется:

i=7 битi = 7\text{ бит}

Важно: мы определяем не количество символов в одном бите, а количество бит, необходимое для кодирования одного символа.

Наглядная схема кодирования

Алфавит из 100 символов

↓ ищем ближайшую подходящую степень двойки

27=1282^7 = 128 возможных кодов

↓ значит

Один символ занимает 7 бит

↓ пароль состоит из 6 символов

67=426 \cdot 7 = 42 бита

↓ переводим в байты

42:8=5,2542 : 8 = 5{,}25 байта

↓ округляем вверх

Один пароль занимает 6 байт

Объём одного пароля

Объём пароля до округления вычисляется по формуле:

V=LiV = L \cdot i

ОбозначениеЧто означает
VVИнформационный объём пароля в битах
LLДлина пароля в символах
iiКоличество бит на один символ

В нашем примере пароль состоит из шести символов, каждый из которых занимает 7 бит:

V=67=42 битаV = 6 \cdot 7 = 42\text{ бита}

Таким образом, непосредственно для кодирования символов пароля требуется 42 бита.

Что означает «целое количество байт»

В условии задания часто встречается следующая фраза:

В базе данных для хранения каждого пароля отведено одинаковое и минимально возможное целое количество байт.

Разберём эту формулировку по частям.

Часть формулировкиЧто она означает
Одинаковое количество байтДля каждого пароля выделяется один и тот же объём памяти
Целое количество байтОбъём одной записи не может быть равен 5,25 или 6,5 байта
Минимально возможноеНужно выделить как можно меньше памяти, но её должно хватить для хранения пароля

Сначала переведём 42 бита в байты:

428=5,25 байта\frac{42}{8} = 5{,}25\text{ байта}

Выделить 5,25 байта невозможно, поэтому результат необходимо округлить вверх:

Vпароля=6 байтV_{\text{пароля}} = 6\text{ байт}

Почему округляем вверх

Проверим, хватит ли пяти байтов:

58=40 бит5 \cdot 8 = 40\text{ бит}

Пяти байтов недостаточно, потому что пароль занимает 42 бита.

Проверим шесть байтов:

68=48 бит6 \cdot 8 = 48\text{ бит}

Шести байтов достаточно.

Выделенная памятьКоличество битХватит для 42 бит?
5 байт40 битНет
6 байт48 битДа

Следовательно, минимальный целый объём памяти равен:

Vпароля=6 байтV_{\text{пароля}} = 6\text{ байт}

Из 48 выделенных бит:

  • 42 бита используются для кодирования символов пароля;
  • 6 бит остаются неиспользованными.

Два разных округления

В задании встречаются два разных этапа определения целого значения.

ЭтапЧто делаемПочему
Определяем количество бит на символВыбираем минимальное ii, при котором 2iN2^i \geq NКодовых комбинаций должно хватить для всех символов алфавита
Определяем количество байт на парольДелим количество бит на 8 и округляем вверхДля записи выделяется целое количество байт

Для нашего примера:

10027i=7 бит100 \leq 2^7 \Rightarrow i = 7\text{ бит}

V=67=42 битаV = 6 \cdot 7 = 42\text{ бита}

Vпароля=428=5,25 байтаV_{\text{пароля}} = \frac{42}{8} = 5{,}25\text{ байта}

После округления вверх:

Vпароля=6 байтV_{\text{пароля}} = 6\text{ байт}

Что может попасться в задании

В задании № 11 обычно требуется определить один из параметров, связанных с хранением паролей, идентификаторов или серийных номеров в базе данных.

Что требуется найтиОбозначениеОсновная идея
Объём памятиVVНайти размер одной записи и умножить его на количество записей
Длину пароля или номераLLОпределить допустимый размер одной записи и подобрать длину
Мощность алфавитаNNСначала найти количество бит на символ, а затем определить границы мощности алфавита
Количество бит на символiiНайти по мощности алфавита или доступному объёму памяти

Основные величины связаны следующей схемой:

ОбозначениеЗначение
NNмощность алфавита — количество допустимых символов
iiколичество бит, необходимое для кодирования одного символа
LLколичество символов в пароле или серийном номере
bbцелое количество байт, выделяемое на одну запись
KKколичество паролей, номеров или пользователей
VVобщий объём памяти

Шаг 1. Определить мощность алфавита

Если в условии перечислены разные группы символов, необходимо сложить их количество.

Например, если используются:

  • 10 десятичных цифр;
  • 26 латинских букв;
  • 450 специальных символов,

то мощность алфавита равна:

N=10+26+450=486N = 10 + 26 + 450 = 486

Если сказано, что используются прописные и строчные латинские буквы, их необходимо считать отдельно:

N=26+26=52N = 26 + 26 = 52

Важно. Фраза «без учёта регистра» означает, что прописные и строчные буквы не различаются. В таком случае латинских букв будет 26, а не 52.

Шаг 2. Найти количество бит на один символ

Все символы кодируются одинаковым и минимально возможным количеством бит. Поэтому нужно найти наименьшее целое значение ii, для которого выполняется условие:

2iN2^i \geq N

Например, если в алфавите 52 символа:

25=32<522^5 = 32 < 52

26=64522^6 = 64 \geq 52

Следовательно:

i=6 битi = 6\text{ бит}

Для быстрого решения полезно помнить степени двойки:

Бит на символ iiМаксимальное количество символов 2i2^i
12
24
38
416
532
664
7128
8256
9512
101024

Шаг 3. Найти объём одного пароля в битах

Если пароль состоит из LL символов, а для кодирования одного символа используется ii бит, то информационный объём пароля равен:

Vпароля=LiV_{\text{пароля}} = L \cdot i

Например, для пароля длиной 10 символов при i=6i = 6:

Vпароля=106=60 битV_{\text{пароля}} = 10 \cdot 6 = 60\text{ бит}

Шаг 4. Перевести объём одной записи в байты

В базе данных для хранения каждого пароля отводится одинаковое и минимально возможное целое количество байт.

Поэтому полученное количество бит необходимо разделить на 8 и округлить вверх:

b=Li8b = \left\lceil \frac{L \cdot i}{8} \right\rceil

Для пароля объёмом 60 бит получаем:

b=608=7,5=8 байтb = \left\lceil \frac{60}{8} \right\rceil = \left\lceil 7{,}5 \right\rceil = 8\text{ байт}

Выделено памятиВместимостьДостаточно для 60 бит?
7 байт56 битНет
8 байт64 битаДа

Следовательно, на один пароль необходимо выделить 8 байт.

Округлять нужно именно вверх. Если округлить 7,57{,}5 до 7 байт, для хранения пароля не хватит памяти.

Шаг 5. Учесть количество записей

Если в базе хранится KK паролей или серийных номеров, общий объём памяти равен:

V=KbV = K \cdot b

Полная формула имеет вид:

V=KLi8V = K \cdot \left\lceil \frac{L \cdot i}{8} \right\rceil

Если ответ необходимо получить в Кбайтах, используем перевод:

VКбайт=Vбайт1024V_{\text{Кбайт}} = \frac{V_{\text{байт}}}{1024}

Основные прототипы задания

Прототип 1. Найти общий объём памяти

В условии обычно известны:

  • мощность алфавита NN;
  • длина пароля LL;
  • количество записей KK.

Требуется найти общий объём памяти VV.

Порядок решения:

  1. Найти количество бит на символ ii из условия 2iN2^i \geq N.
  2. Найти объём одного пароля в битах: LiL \cdot i.
  3. Разделить полученный объём на 8.
  4. Округлить количество байт вверх.
  5. Умножить размер одной записи на количество записей.
  6. При необходимости перевести результат в Кбайты.

Схема решения:

NiLiLi8KbN \longrightarrow i \longrightarrow L \cdot i \longrightarrow \left\lceil \frac{L \cdot i}{8} \right\rceil \longrightarrow K \cdot b

Прототип 2. Найти длину пароля или серийного номера

В условии обычно известны:

  • мощность алфавита NN;
  • количество записей KK;
  • ограничение на общий объём памяти VV.

Требуется найти длину одной записи LL.

Порядок решения:

  1. Найти количество бит на символ ii.
  2. Перевести общий объём памяти в байты.
  3. Определить допустимое количество байт на одну запись.
  4. Использовать формулу:

b=Li8b = \left\lceil \frac{L \cdot i}{8} \right\rceil

  1. Найти подходящее целое значение LL.
  2. Проверить найденную длину и соседнее значение.

При решении необходимо внимательно прочитать формулировку ограничения:

ФормулировкаМатематическое условие
Не более VVОбъём V\leq V
Менее VVОбъём <V< V
Не менее VVОбъём V\geq V
Более VVОбъём >V> V

Если общий объём должен быть более указанного значения, получить равенство недостаточно: результат должен строго превышать границу.

Из-за округления до целого количества байт найденную длину обязательно нужно проверить подстановкой. Желательно также проверить соседнее значение.

Прототип 3. Найти мощность алфавита

В условии обычно известны:

  • длина серийного номера LL;
  • количество записей KK;
  • общий объём памяти VV.

Требуется определить мощность алфавита NN.

Порядок решения:

  1. Перевести общий объём памяти в байты.
  2. Определить количество байт, выделяемое на одну запись.
  3. Перевести размер одной записи в биты.
  4. Определить количество бит на один символ ii.
  5. По найденному значению ii определить мощность алфавита NN.

Главная сложность этого прототипа заключается в последнем действии.

Почему нельзя всегда использовать формулу N=2iN = 2^i

Формула

N=2iN = 2^i

показывает максимальное количество символов, которое можно закодировать с помощью ii бит.

Однако фактическая мощность алфавита может быть меньше этого значения.

Если на кодирование одного символа требуется 4 бита, то:

23<N242^3 < N \leq 2^4

8<N168 < N \leq 16

Следовательно, алфавит может содержать от 9 до 16 символов.

Мощность алфавита NNНеобходимое количество бит
83 бита
94 бита
104 бита
154 бита
164 бита
175 бит

Если требуется найти максимальную мощность алфавита, используется формула:

Nmax=2iN_{\max} = 2^i

Если требуется найти минимальную мощность алфавита, при которой уже необходимо ii бит, используется формула:

Nmin=2i1+1N_{\min} = 2^{i-1} + 1

Например, если для кодирования одного символа требуется 4 бита:

Nmax=24=16N_{\max} = 2^4 = 16

Nmin=23+1=9N_{\min} = 2^3 + 1 = 9

Частая ошибка: получить i=4i = 4 и сразу записать в ответе 16. Это правильно только тогда, когда требуется максимальная мощность алфавита. Если требуется минимальная мощность, ответом будет 9.

Таблица возможных границ:

Бит на символ iiВозможные значения NNМинимальная мощностьМаксимальная мощность
22<N42 < N \leq 434
34<N84 < N \leq 858
48<N168 < N \leq 16916
516<N3216 < N \leq 321732
632<N6432 < N \leq 643364
764<N12864 < N \leq 12865128
8128<N256128 < N \leq 256129256
9256<N512256 < N \leq 512257512

Как определить размер одной записи по общему объёму

Пусть на хранение KK записей отведено VV байт.

Если сказано, что общий объём составляет не более VV байт, максимальный размер одной записи равен:

bmax=VKb_{\max} = \left\lfloor \frac{V}{K} \right\rfloor

Если сказано, что общий объём составляет не менее VV байт, минимальный размер одной записи равен:

bmin=VKb_{\min} = \left\lceil \frac{V}{K} \right\rceil

Если сказано, что общий объём составляет более VV байт, равенство не подходит. Необходимо найти первое целое количество байт, при котором:

Kb>VK \cdot b > V

В таком случае:

bmin=VK+1b_{\min} = \left\lfloor \frac{V}{K} \right\rfloor + 1

После этого нужно найти такое значение ii или LL, при котором размер одной записи удовлетворяет условию:

b=Li8b = \left\lceil \frac{L \cdot i}{8} \right\rceil

Из-за округления байтов вверх найденное значение нужно проверить подстановкой.

Универсальная схема решения

  1. Выписать известные величины: NN, ii, LL, KK и VV.
  2. Перевести общий объём памяти в байты.
  3. Если известна мощность алфавита, найти минимальное ii из условия 2iN2^i \geq N.
  4. Если известен общий объём, определить допустимое количество байт на одну запись.
  5. Использовать формулу:

b=Li8b = \left\lceil \frac{L \cdot i}{8} \right\rceil

  1. Найти неизвестную величину.
  2. Проверить полученный результат и соседнее целое значение.
  3. Если требуется мощность алфавита, определить, какую именно границу спрашивают.
Что требуется найтиФормула
Максимальная мощность алфавитаNmax=2iN_{\max} = 2^i
Минимальная мощность алфавитаNmin=2i1+1N_{\min} = 2^{i-1} + 1

Разбор заданий с реального ЕГЭ

Задание с основной волны 2026

На предприятии каждой изготовленной детали присваивают серийный номер, состоящий из 440 символов. В базе данных для хранения каждого серийного номера отведено одинаковое и минимально возможное целое число байт. Используется посимвольное кодирование серийных номеров: все символы кодируются одинаковым и минимально возможным количеством бит. Известно, что для хранения 1 892 412 серийных номеров требуется не менее 305 726 Кбайт памяти. Определите минимально возможную мощность алфавита, используемого для записи серийных номеров. В ответе запишите только целое число.

Необходимо по общему объёму памяти определить минимальное количество бит, используемое для кодирования одного символа. После этого нужно найти не максимальную, а минимальную мощность алфавита, при которой требуется такое количество бит.

Дано

ВеличинаЗначение
Длина серийного номераL=440L = 440 символов
Количество серийных номеровK=1,892,412K = 1,892,412
Общий объём памятине менее 305 726 Кбайт
Кодированиепосимвольное
Размер одной записицелое количество байт

Что нужно найти

Минимально возможную мощность алфавита NminN_{\min}.

Решение

Шаг 1. Переведём общий объём памяти в байты

В одном Кбайте содержится 1024 байта:

V=305,7261024=313,063,424 байтаV = 305,726 \cdot 1024 = 313,063,424\text{ байта}

Шаг 2. Выразим размер одного серийного номера

Пусть для кодирования одного символа используется ii бит.

Тогда информационный объём серийного номера равен:

Vномер=440i битV_{\text{номер}} = 440i\text{ бит}

Количество байт, выделяемое на один номер:

b=440i8b = \left\lceil \frac{440i}{8} \right\rceil

Поскольку 440 делится на 8 без остатка:

b=55i байтb = 55i\text{ байт}

Шаг 3. Составим неравенство

Объём всех серийных номеров должен быть не меньше 313 063 424 байт:

1,892,41255i313,063,4241,892,412 \cdot 55i \geq 313,063,424

104,082,660i313,063,424104,082,660i \geq 313,063,424

i313,063,424104,082,660i \geq \frac{313,063,424}{104,082,660}

i3,0078i \geq 3{,}0078\ldots

Количество бит должно быть целым, поэтому:

i=4i = 4

Шаг 4. Проверим соседнее значение

Если i=3i = 3, размер одного номера составляет:

b=553=165 байтb = 55 \cdot 3 = 165\text{ байт}

Общий объём:

1651,892,412=312,247,980 байт165 \cdot 1,892,412 = 312,247,980\text{ байт}

Это меньше 313 063 424 байт, поэтому трёх бит недостаточно.

При i=4i = 4 условие уже выполняется.

Шаг 5. Найдём минимальную мощность алфавита

Если для одного символа требуется 4 бита, мощность алфавита находится в пределах:

23<N242^3 < N \leq 2^4

8<N168 < N \leq 16

Минимальное целое значение:

Nmin=23+1=9N_{\min} = 2^3 + 1 = 9

Важно. В этой задаче нельзя записывать N=24=16N = 2^4 = 16, потому что требуется минимальная, а не максимальная мощность алфавита.

Ответ

9\boxed{9}

Задание с основной волны 2025

На предприятии каждой изготовленной детали присваивают серийный номер, содержащий десятичные цифры и символы из 27-символьного специального алфавита. В базе данных каждый серийный номер занимает одинаковое и минимально возможное целое число байт. Используется посимвольное кодирование: все символы кодируются одинаковым и минимально возможным количеством бит. Известно, что для хранения 3548 серийных номеров необходимо более 12 Кбайт памяти. Определите минимально возможную длину серийного номера.

Сначала необходимо определить мощность алфавита и количество бит на один символ. Затем по общему объёму памяти нужно найти минимальное количество байт на одну запись и подобрать минимальную длину серийного номера.

Дано

ВеличинаЗначение
Десятичные цифры10 символов
Специальный алфавит27 символов
Количество серийных номеровK=3548K = 3548
Общий объём памятиболее 12 Кбайт
Размер одной записицелое количество байт

Что нужно найти

Минимально возможную длину серийного номера LL.

Решение

Шаг 1. Найдём мощность алфавита

Серийный номер может содержать десятичные цифры и специальные символы:

N=10+27=37N = 10 + 27 = 37

Шаг 2. Найдём количество бит на один символ

Подберём минимальное значение ii, при котором 2i372^i \geq 37:

25=32<372^5 = 32 < 37

26=64372^6 = 64 \geq 37

Следовательно:

i=6 битi = 6\text{ бит}

Шаг 3. Переведём общий объём в байты

12 Кбайт=121024=12,288 байт12\text{ Кбайт} = 12 \cdot 1024 = 12,288\text{ байт}

По условию общий объём должен быть более 12 288 байт.

Шаг 4. Определим минимальный размер одной записи

Разделим общий объём на количество серийных номеров:

12,28835483,46 байта\frac{12,288}{3548} \approx 3{,}46\text{ байта}

Если выделить по 3 байта на один номер, получим:

35483=10,644 байта3548 \cdot 3 = 10,644\text{ байта}

Этого недостаточно.

Следовательно, минимальный подходящий размер одной записи составляет:

b=4 байтаb = 4\text{ байта}

Шаг 5. Найдём минимальную длину номера

Размер одного номера определяется формулой:

b=Li8b = \left\lceil \frac{L \cdot i}{8} \right\rceil

Подставим i=6i = 6:

b=6L8b = \left\lceil \frac{6L}{8} \right\rceil

Нужно найти минимальное значение LL, при котором размер записи станет равен 4 байтам.

Проверим L=4L = 4:

b=468=3=3 байтаb = \left\lceil \frac{4 \cdot 6}{8} \right\rceil = \left\lceil 3 \right\rceil = 3\text{ байта}

Общий объём:

35483=10,644 байта3548 \cdot 3 = 10,644\text{ байта}

Условие не выполняется.

Проверим L=5L = 5:

b=568=3,75=4 байтаb = \left\lceil \frac{5 \cdot 6}{8} \right\rceil = \left\lceil 3{,}75 \right\rceil = 4\text{ байта}

Общий объём:

35484=14,192 байта3548 \cdot 4 = 14,192\text{ байта}

14,192>12,28814,192 > 12,288

Условие выполняется, поэтому минимальная длина серийного номера равна 5 символам.

Ответ

5\boxed{5}

Задание с основной волны 2024

На предприятии каждой изготовленной детали присваивается серийный номер, содержащий десятичные цифры, 26 латинских букв без учёта регистра и символы из 450-символьного специального алфавита. В базе данных для хранения каждого серийного номера отведено одинаковое и минимально возможное целое число байт. Используется посимвольное кодирование серийных номеров: все символы кодируются одинаковым и минимально возможным количеством бит. Известно, что для хранения 708 серийных номеров отведено более 213 Кбайт памяти. Определите минимально возможную длину серийного номера.

Необходимо найти мощность общего алфавита и количество бит на один символ. Затем по ограничению на общий объём памяти определяется минимальный размер одной записи, после чего подбирается минимальная длина серийного номера.

Дано

ВеличинаЗначение
Десятичные цифры10 символов
Латинские буквы без учёта регистра26 символов
Специальный алфавит450 символов
Количество серийных номеровK=708K = 708
Общий объём памятиболее 213 Кбайт
Размер одной записицелое количество байт

Что нужно найти

Минимально возможную длину серийного номера LL.

Решение

Шаг 1. Найдём мощность алфавита

Сложим количество символов всех групп:

N=10+26+450=486N = 10 + 26 + 450 = 486

Шаг 2. Найдём количество бит на один символ

Подберём минимальное значение ii, при котором 2i4862^i \geq 486:

28=256<4862^8 = 256 < 486

29=5124862^9 = 512 \geq 486

Следовательно:

i=9 битi = 9\text{ бит}

Шаг 3. Переведём общий объём в байты

213 Кбайт=2131024=218,112 байт213\text{ Кбайт} = 213 \cdot 1024 = 218,112\text{ байт}

По условию общий объём должен быть более 218 112 байт.

Шаг 4. Определим минимальный размер одной записи

Разделим общий объём на количество номеров:

218,112708308,07 байта\frac{218,112}{708} \approx 308{,}07\text{ байта}

Проверим 308 байт на одну запись:

708308=218,064 байта708 \cdot 308 = 218,064\text{ байта}

Полученный объём меньше 218 112 байт, поэтому 308 байт недостаточно.

Минимальный подходящий размер одной записи:

b=309 байтb = 309\text{ байт}

Проверка:

708309=218,772 байта708 \cdot 309 = 218,772\text{ байта}

218,772>218,112218,772 > 218,112

Шаг 5. Найдём минимальную длину номера

Размер одной записи определяется формулой:

b=Li8b = \left\lceil \frac{L \cdot i}{8} \right\rceil

Подставим i=9i = 9:

b=9L8b = \left\lceil \frac{9L}{8} \right\rceil

Нужно найти минимальное значение LL, при котором размер записи станет равен 309 байтам.

Проверим L=273L = 273:

b=27398=307,125=308 байтb = \left\lceil \frac{273 \cdot 9}{8} \right\rceil = \left\lceil 307{,}125 \right\rceil = 308\text{ байт}

Этого недостаточно.

Проверим L=274L = 274:

b=27498=308,25=309 байтb = \left\lceil \frac{274 \cdot 9}{8} \right\rceil = \left\lceil 308{,}25 \right\rceil = 309\text{ байт}

Условие выполняется.

Следовательно, минимальная длина серийного номера равна 274 символам.

Ответ

274\boxed{274}

Задание с основной волны 2023

При регистрации в компьютерной системе каждому пользователю выдаётся пароль, состоящий из 10 символов. В качестве символов используются прописные и строчные буквы латинского алфавита, то есть всего 52 различных символа. В базе данных для хранения каждого пароля отведено одинаковое и минимально возможное целое число байт. Используется посимвольное кодирование паролей: все символы кодируются одинаковым и минимально возможным количеством бит. Определите объём памяти в Кбайтах, необходимый для хранения данных о 65 536 пользователях. В ответе запишите только целое число — количество Кбайт.

Необходимо определить количество бит на один символ, найти размер одного пароля в целом количестве байт, а затем умножить его на количество пользователей.

Дано

ВеличинаЗначение
Мощность алфавитаN=52N = 52 символа
Длина пароляL=10L = 10 символов
Количество пользователейK=65,536K = 65,536
Размер одной записицелое количество байт

Что нужно найти

Общий объём памяти VV в Кбайтах.

Решение

Шаг 1. Найдём количество бит на один символ

Подберём минимальное значение ii, при котором 2i522^i \geq 52:

25=32<522^5 = 32 < 52

26=64522^6 = 64 \geq 52

Следовательно:

i=6 битi = 6\text{ бит}

Шаг 2. Найдём объём одного пароля в битах

Пароль состоит из 10 символов:

Vпароля=LiV_{\text{пароля}} = L \cdot i

Vпароля=106=60 битV_{\text{пароля}} = 10 \cdot 6 = 60\text{ бит}

Шаг 3. Переведём объём одного пароля в байты

Для каждого пароля выделяется минимально возможное целое количество байт:

b=608b = \left\lceil \frac{60}{8} \right\rceil

b=7,5=8 байтb = \left\lceil 7{,}5 \right\rceil = 8\text{ байт}

На хранение одного пароля требуется 8 байт.

Округление выполняется вверх отдельно для каждого пароля, а не после вычисления объёма всех паролей.

Шаг 4. Найдём общий объём памяти

V=KbV = K \cdot b

V=65,5368=524,288 байтV = 65,536 \cdot 8 = 524,288\text{ байт}

Шаг 5. Переведём байты в Кбайты

VКбайт=524,2881024V_{\text{Кбайт}} = \frac{524,288}{1024}

VКбайт=512 КбайтV_{\text{Кбайт}} = 512\text{ Кбайт}

Ответ

512\boxed{512}

Решение задания 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 * 102423 Мбайт, переведённые в байты

Как работает программа

  1. Перебирается возможная длина:
for dlina in range(1, 1000):

Сначала программа проверит длину 1, затем 2, 3 и так далее.

  1. Находится мощность алфавита:
alf = 10 + 62

В данном случае алфавит состоит из двух групп: 10 и 62 символов.

N=10+62=72N = 10 + 62 = 72

  1. Определяется минимальное количество бит на один символ:
i = ceil(log2(alf))

Функция log2(alf) вычисляет, в какую степень нужно возвести 2, чтобы получить мощность алфавита. Функция ceil() округляет результат вверх.

Таким образом, эта строка соответствует условию:

2iN2^i \geq N

  1. Находится размер одной записи в байтах:
V = ceil(dlina * i / 8)

Сначала длина умножается на количество бит на символ. Затем результат делится на 8 и округляется вверх до целого количества байт:

V=Li8V = \left\lceil \frac{L \cdot i}{8} \right\rceil

  1. Проверяется общий объём памяти:
if V * 5_895_222 > 23 * 1024 * 1024:

Размер одной записи умножается на количество записей. Полученное значение сравнивается с 23 Мбайт.

  1. Выводится первая подходящая длина:
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 ** 254 Мбайт, переведённые в байты

Как работает программа

  1. Перебирается возможная мощность алфавита:
for x in range(1, 1000):

Программа последовательно проверяет алфавиты мощностью 1, 2, 3 и так далее.

  1. Текущее значение записывается в переменную alf:
alf = x
  1. Указывается известная длина номера:
dlina = 172
  1. Находится минимальное количество бит на один символ:
bit = ceil(log2(alf))
  1. Вычисляется размер одного номера в целых байтах:
V = ceil(dlina * bit / 8)
  1. Проверяется общий объём всех номеров:
if 356_984 * V >= 54 * 1024 ** 2:

Левая часть — фактический объём всех записей. Правая часть — 54 Мбайт, переведённые в байты.

  1. Выводится первая подходящая мощность алфавита:
print(x)
break

Первое найденное значение является минимальной мощностью алфавита.

Такой перебор особенно удобен в задачах на минимальную мощность алфавита. Программа проверяет сами значения NN, поэтому не возникает ошибки, когда вместо минимальной мощности записывают максимальное значение 2i2^i.

Чем отличаются два кода

КодЧто перебираетсяЧто остаётся постояннымЧто выводится
Поиск длиныdlinaМощность алфавитаМинимальная длина
Поиск алфавитаxДлина номераМинимальная мощность алфавита

Общий принцип у обоих решений одинаковый:

  1. Перебрать возможное значение.
  2. Найти количество бит на символ.
  3. Найти целое количество байт на одну запись.
  4. Вычислить общий объём памяти.
  5. Проверить условие.
  6. Вывести первое подходящее значение и остановить перебор.