К содержанию

Подтема 3 из 6

Наибольшее значение: «не более»

Как найти наибольшие длину пароля, алфавит и число записей, когда памяти «не более» заданной.

Длина по байтам

Пароль из алфавита задачи темы занимает 12 байт. Какой он длины?

По числу байт длину точно не восстановить: округление вверх прячет пустой хвост. 12 байт — это больше 88 бит (иначе хватило бы 11 байт) и не больше 96. Подходят 6 · 15 = 90 и 6 · 16 = 96 бит, то есть K = 15 или K = 16; 6 · 14 = 84 бита уместились бы в 11 байт.

Поэтому в обратных задачах спрашивают наибольшее или наименьшее значение. Они зависят от слов условия: «не более» — в этой подтеме, «более» и «не менее» — в подтеме 4.

Наибольшая длина

Для 40 пользователей выделено не более 1200 байт, сведения — 18 байт. Какой наибольшей длины может быть пароль?

«Не более» сначала переводят в наибольший размер одной записи, потом — в наибольшее число битов пароля. Запись не больше 1200 / 40 = 30 байт, пароль не больше 30 − 18 = 12 байт = 96 бит. Значит, 6 · K ≤ 96, K ≤ 16.

Длины пароля на прямой битов: каждые 6 бит — ещё один символ. Все длины до 16 укладываются в 12 байт, длина 17 — 102 бита — уже нет.
Вручную

Проверь найденную длину и следующую. K = 16: 96 бит = 12 байт, 40 · (12 + 18) = 1200 — подходит. K = 17: 102 бита → 13 байт, 40 · 31 = 1240 — больше 1200. Ответ 16.

Python

Программа перебирает длины (), для каждой считает объём прямо, как в подтемах 1–2, и запоминает последнюю подходящую ():

from math import ceilbest = 0for k in range(1, 100):    password = ceil(k * 6 / 8)    if 40 * (password + 18) <= 1200:        best = kprint(best)
16

Условие <= 1200 — дословно «не более 1200»: перебору не нужно думать об округлениях.

Тонкости:память не делится нацело

Пусть выделено не более 1210 байт. 1210 / 40 = 30,25, но запись — целое число байт, поэтому она по-прежнему не больше 30: при 31 байте 40 записей займут 1240. При «не более» дробь отбрасывают.

Наибольший алфавит

Длина пароля — 15, ограничение то же: не более 1200 байт на 40 пользователей. Какова наибольшая мощность алфавита?

Сначала находят, сколько битов на символ можно себе позволить, а потом — сколько символов закодирует столько битов: N = 2ⁱ. Пароль не больше 96 бит: 15 · i ≤ 96, i ≤ 6,4, то есть i = 6. Шесть битов кодируют до 2⁶ = 64 символов.

Вручную

Проверка соседа: N = 64 — 6 бит, 90 бит, 12 байт, всего 1200 — подходит; N = 65 — 7 бит, 105 бит, 14 байт, всего 1280 — нет. Ответ 64, а не 62: алфавит задачи можно расширить ещё на 2 символа.

Python
from math import ceilbest = 0for n in range(1, 1000):    password = ceil(15 * bits(n) / 8)    if 40 * (password + 18) <= 1200:        best = nprint(best)
64

Если спрашивают, сколько специальных знаков можно добавить к цифрам и буквам, из наибольшего алфавита вычитают известные символы: 64 − 62 = 2.

Наибольшее число записей

О каком наибольшем числе пользователей можно хранить сведения в 1 Кбайт?

Наибольшее число записей — целая часть от деления памяти на размер записи. 1024 / 30 = 34,13…: 34 записи займут 1020 байт, 35-я уже не поместится. Неполную запись хранить нельзя, поэтому дробь отбрасывают.

В 1024 байта помещаются 34 записи по 30 байт, на 35-ю места уже нет.

Сначала округляют вверх размер одной записи, потом делят память и округляют вниз. В Python это деление нацело .

На экзамене числа крупные: номер детали из 200 символов, 300 000 номеров, не более 64 Мбайт. Какова наибольшая мощность алфавита? Тот же перебор, только по числу битов:

from math import ceilbest = 0for i in range(1, 30):    if 300000 * ceil(200 * i / 8) <= 64 * 2 ** 20:        best = iprint(best, 2 ** best)
8 256

Восемь битов на символ — наибольший алфавит 2⁸ = 256. Вручную: на номер не больше 64 · 2²⁰ / 300 000 = 223,6… → 223 байта = 1784 бита, 1784 / 200 = 8,92 → 8 бит.

Итого

  • По байтамдлина — диапазон, а не одно число
  • Не болеезапись — целая часть памяти / число записей
  • ДлинаK · i ≤ биты пароля, проверить K + 1
  • Алфавитнаибольшее i, ответ 2ⁱ
  • Записипамять // запись
  • Pythonперебор кандидатов, условие дословно: <=

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

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

Вопрос 1
Пароль из алфавита в 40 символов занимает минимально возможные 9 байт. Какой наибольшей длины он может быть?
ОтветСкрыть ответ
Ответ
12: 9 байт — 72 бита, по 6 бит на символ, 72 / 6 = 12.
Вопрос 2
Алфавит — 33 символа, сведения — 3 байта на пользователя, на 100 пользователей не более 2 Кбайт. Наибольшая длина пароля?
ОтветСкрыть ответ
Ответ
22: запись не больше 2048 / 100 = 20,48 → 20 байт, пароль не больше 17 байт = 136 бит, 136 / 6 = 22,6 → 22.
Вопрос 3
Пароль — 15 символов, на 40 паролей не более 480 байт. Наибольшая мощность алфавита?
ОтветСкрыть ответ
Ответ
64: пароль не больше 12 байт = 96 бит, 96 / 15 = 6,4 → 6 бит, 2⁶.
Вопрос 4
Сколько записей по 30 байт поместится в 2 Кбайт?
ОтветСкрыть ответ
Ответ
68: 2048 / 30 = 68,26… — целая часть.
Вопрос 5
В задаче темы стало «не более 1210 байт» на 40 пользователей. Изменится ли наибольшая длина пароля 16?
ОтветСкрыть ответ
Ответ
Нет: 1210 / 40 = 30,25, запись по-прежнему не больше 30 байт.

Практика

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

Наибольшая длина по 9 байтам

Пароль использует алфавит мощностью 40 и занимает минимально возможные 9 байтов. Какой наибольшей длины может быть пароль?

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

Наименьший алфавит по 9 байтам

Пароль содержит 12 символов и занимает минимально возможные 9 байтов. Какова наименьшая возможная мощность алфавита?

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

Наибольшая длина пароля

Алфавит содержит 33 символа. Дополнительные сведения занимают 3 байта на пользователя. Для 100 пользователей доступно не более 2 Кбайт. Найди максимальную длину пароля.

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

Длина серийного номера

Серийный номер содержит десятичные цифры, заглавные и строчные латинские буквы и символы из специального алфавита в 700 символов. Каждому номеру отведено одинаковое минимально возможное целое число байтов, кодирование посимвольное, все символы кодируются одинаковым минимальным числом битов. Для хранения 3000 номеров отведено не более 500 Кбайт. Определи максимально возможную длину номера.

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

Наибольшая мощность алфавита

Длина пароля — 15 символов. Для 40 паролей выделено не более 480 байтов, каждому паролю — минимальное целое число байтов. Найди наибольшую мощность алфавита.

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

Специальные символы

Код из 24 символов может содержать заглавные латинские буквы, десятичные цифры и символы специального набора. Каждому коду — одинаковое минимальное целое число байтов, кодирование посимвольное. Для 1000 кодов выделено не более 30 Кбайт. Какое наибольшее количество символов может быть в специальном наборе?

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

Пользователи в 3 Мбайт

Пароль содержит 16 символов алфавита мощностью 40, на дополнительные сведения выделено 19 байтов на пользователя, паролю — минимальное целое число байтов. О каком наибольшем количестве пользователей можно хранить сведения в 3 Мбайт?

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

Мощность алфавита серийного номера

На предприятии каждой детали присваивают серийный номер из 310 символов. Каждому номеру отведено одинаковое минимально возможное целое число байтов, кодирование посимвольное, все символы кодируются одинаковым минимальным числом битов. Для хранения 700 000 номеров отведено не более 200 Мбайт. Определи максимально возможную мощность алфавита.

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