К содержанию

Подтема 4 из 6

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

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

Наименьшая запись

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

«Не менее» и «более» дают нижнюю границу одной записи — её округляют вверх до целых байт. «Более 1200»: 30 байт дают ровно 1200 — не больше, значит, запись хотя бы 31 байт. «Не менее 1200» допускает ровно 30 байт.

Условие на 40 записейОдна запись
не более 1200 байтне больше 30 байт
менее 1200 байтне больше 29 байт
не менее 1200 байтне меньше 30 байт
более 1200 байтне меньше 31 байта

На пароль при «более 1200» остаётся хотя бы 31 − 18 = 13 байт.

Наименьшая длина

Пароль должен занимать хотя бы 13 байт. Какой наименьшей длины он может быть?

Пароль занимает хотя бы 13 байт, если его код не помещается в 12 байт: 6 · K > 96. K > 16, наименьшая длина — 17. Заполнять все 13 байт код не обязан: 102 бита уже требуют 13 байт.

Длина 16 — 96 бит, ровно 12 байт. Длина 17 — 102 бита, тринадцатый байт уже нужен, хотя заполнен не весь.
Вручную

Проверь найденную длину и предыдущую. K = 16: 12 байт, всего 1200 — не больше 1200, не подходит. K = 17: 13 байт, 40 · 31 = 1240 — подходит. Запись 6 · K ≥ 104 дала бы K = 18 — ошибка: тринадцатый байт не обязан быть полным.

Python

Перебор идёт от малых длин, первая подходящая — ответ; останавливает цикл:

from math import ceilfor k in range(1, 100):    password = ceil(k * 6 / 8)    if 40 * (password + 18) > 1200:        print(k)        break
17

Условие — снова дословно: «более 1200» — это > 1200, «не менее» — >= 1200.

Наименьший алфавит

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

Сначала находят, сколько битов на символ понадобится, а потом — самый маленький алфавит, которому их нужно столько: N = 2ⁱ⁻¹ + 1. Пароль не помещается в 12 байт: 15 · i > 96, i > 6,4, i = 7. Шести битов хватает на 64 символа, седьмой нужен с 65-го: N = 65.

Вручную

Проверка соседа: N = 64 — 6 бит, 12 байт, всего 1200 — не больше 1200; N = 65 — 7 бит, 105 бит → 14 байт, всего 1280 — подходит. Наименьший специальный набор к 62 буквам и цифрам: 65 − 62 = 3 знака.

Python

Цикл увеличивает i, пока объём ещё не больше 1200, — условие цикла обратно условию задачи. Запусти по шагам:

from math import ceil i = 1while 40 * (ceil(15 * i / 8) + 18) <= 1200:    i += 1print(i, 2 ** (i - 1) + 1)
7 65

Шесть или семь битов меняют объём скачком: 64 символа — 1200 байт, 65 — сразу 1280. Число битов растёт целыми шагами, а байты пароля ещё и округляются.

Тонкости:крупные числа

Серийный номер — из цифр, строчных латинских букв и 900 знаков, 150 000 номеров занимают более 20 Мбайт. Наименьшая длина номера — тот же перебор:

from math import ceili = bits(10 + 26 + 900)for k in range(1, 1000):    if 150000 * ceil(k * i / 8) > 20 * 2 ** 20:        print(i, k)        break
10 112

Итого

  • Не менеезапись — память / число, вверх
  • Болееровно граница не подходит: + 1 байт
  • Длинакод не помещается в байт меньше: K · i > …
  • Алфавитнаименьшее i, ответ 2ⁱ⁻¹ + 1
  • Проверкапредыдущее значение не подходит
  • Pythonперебор от малых, первое подходящее, break

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

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

Вопрос 1
40 одинаковых записей вместе занимают не менее 1000 байт. Какое наименьшее целое число байт в одной записи?
ОтветСкрыть ответ
Ответ
25: 1000 / 40 = 25, «не менее» допускает ровно 25.
Вопрос 2
Те же 40 записей вместе занимают более 1000 байт. Наименьшее число байт в записи?
ОтветСкрыть ответ
Ответ
26: при 25 байтах получится ровно 1000 — не больше.
Вопрос 3
Алфавит — 30 символов, 50 паролей занимают более 450 байт. Наименьшая длина пароля?
ОтветСкрыть ответ
Ответ
15: пароль хотя бы 10 байт, код не помещается в 9 байт: 5K > 72, K > 14,4.
Вопрос 4
Пароль — 13 символов, 200 паролей требуют не менее 2001 байта. Наименьшая мощность алфавита?
ОтветСкрыть ответ
Ответ
65: 2001 / 200 = 10,005 → пароль хотя бы 11 байт, 13i > 80, i = 7, наименьший алфавит для 7 бит — 2⁶ + 1.
Вопрос 5
Пароль из 17 символов алфавита задачи темы. Сколько байт он занимает и заполнен ли последний байт?
ОтветСкрыть ответ
Ответ
13 байт: 102 бита, 12 байт — 96 бит мало; 2 бита последнего байта пустые.

Практика

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

Запись при «более»

40 одинаковых записей занимают целое число байтов каждая. Все записи вместе занимают более 1000 байтов. Какое наименьшее число байтов может занимать одна запись?

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

Наименьший заголовок

Отправлено 3 сообщения по 40 символов и 5 сообщений по 25 символов алфавита из 100 символов. Каждое сообщение кодируется минимальным целым числом байтов, к каждому добавляется заголовок одинакового целого размера. Всего передано более 300 байтов. Какое наименьшее число байтов может содержать заголовок?

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

Наименьшая длина при «более»

Алфавит содержит 17 символов. Каждый пароль занимает минимальное целое число байтов. 100 паролей требуют более 1000 байтов. Найди наименьшую длину пароля.

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

Более 450 байтов

Пароли используют алфавит из 30 символов, каждый пароль занимает минимальное целое число байтов. 50 паролей занимают более 450 байтов. Найди минимальную длину пароля.

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

Минимальная длина номера

Серийный номер содержит десятичные цифры, заглавные латинские буквы и символы из специального алфавита в 5000 символов. Каждому номеру отведено одинаковое минимально возможное целое число байтов, кодирование посимвольное, все символы кодируются одинаковым минимальным числом битов. Известно, что 200 000 номеров занимают более 30 Мбайт. Определи минимально возможную длину номера.

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

Минимальная мощность алфавита

Пароль содержит 13 символов. Для хранения 200 паролей требуется не менее 2001 байта. Каждый пароль занимает минимальное целое число байтов. Найди минимальную мощность алфавита.

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

Наименьший специальный набор

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

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

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

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

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