Подтема 2 из 6
Дополнительные сведения
Запись пользователя — пароль и сведения: как найти размер сведений, и ответ задачи темы.
Запись пользователя
Сведения о 40 пользователях заняли 1200 байт. Сколько байт приходится на дополнительные сведения одного пользователя?
Запись пользователя — его пароль и его сведения. Записи одинаковые, поэтому общий объём делят на число пользователей, а из одной записи вычитают пароль. 1200 / 40 = 30 байт на пользователя, пароль — 12 байт из подтемы 1, на сведения остаётся 30 − 12 = 18 байт. Ответ задачи темы: 18.
Пароль: 15 · 6 = 90 бит → 12 байт. Запись: 1200 / 40 = 30 байт. Сведения: 30 − 12 = 18 байт. Если общий объём дан в Кбайтах, сначала переведи его в байты: 15 Кбайт = 15 · 1024 = 15 360 байт.
Деление нацело даёт целое число, без «.0» в конце:
from math import ceilpassword = ceil(15 * bits(10 + 26 + 26) / 8)record = 1200 // 40print(password, record, record - password)Нельзя делить на 8 общий объём или вычитать пароль в битах: 30 байт записи — это 12 байт пароля целиком плюс сведения.
Объём записей
Обратный ход: сведения — 18 байт. Сколько байт займут 40 записей?
Объём всех записей — число записей, умноженное на пароль в целых байтах плюс сведения. 40 · (12 + 18) = 1200 байт — получился объём из условия, значит, ответ 18 найден верно. Такая подстановка — быстрая проверка любой задачи на сведения.
Если сведения даны в целых байтах, неважно, выделяют целые байты паролю или всей записи: 18 целых байт не меняют пустой хвост пароля.
Тонкости:общий заголовок
Иногда в файле есть заголовок, общий для всей базы, например 64 байта. Его прибавляют один раз: 40 · 30 + 64 = 1264 байта, а не 40 · (30 + 64).
Части в битах
Пусть сведения заданы в битах — 20 бит. Сколько байт займёт запись?
Если целые байты выделяют всей записи, сначала складывают биты частей, потом округляют. Если каждой части — округляют каждую. Всей записи: 90 + 20 = 110 бит → 14 байт. Каждой части: 12 + 3 = 15 байт.
В обратной задаче так же: запись в 14 байт — 112 бит, пароль не округляют отдельно, на сведения остаётся 112 − 90 = 22 бита. Если округлить пароль до 12 байт, получилось бы (14 − 12) · 8 = 16 бит — неверно.
Итого
- Записьпароль в целых байтах + сведения
- Сведенияобщий объём / число записей − пароль
- Все записичисло записей · запись
- Кбайтсначала перевести в байты: · 1024
- Части в битахбайты всей записи — сложить биты, потом округлить
- Заголовокобщий для базы — прибавить один раз
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Сведения на пользователя
Пароль содержит 13 символов из алфавита мощностью 40. Для 256 одинаковых по объёму пользовательских записей потребовалось 6 Кбайт. Дополнительные сведения занимают целое число байтов. Сколько байтов дополнительных сведений приходится на пользователя?
Введите число.
Подсказка
Из размера записи вычти байты пароля.
Решение
Одна запись: 6 · 1024 / 256 = 24 байта. Пароль: 40 символам нужно 6 бит, 13 · 6 = 78 бит → 10 байтов. На сведения остаётся 24 − 10 = 14 байтов.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i record = 6 * 1024 // 256print(record - ceil(13 * bits(40) / 8))Ответ: 14
Сведения при 1080 байтах
Пароль содержит 14 символов из алфавита мощностью 30, каждому паролю — минимальное целое число байтов. Для 30 пользователей потребовалось 1080 байтов. Сколько байтов дополнительных сведений приходится на пользователя?
Введите число.
Подсказка
Раздели общий объём на число пользователей и вычти пароль.
Решение
Одна запись: 1080 / 30 = 36 байтов. Пароль: 30 символам нужно 5 бит, 14 · 5 = 70 бит → 9 байтов. Сведения: 36 − 9 = 27 байтов.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i record = 1080 // 30print(record - ceil(14 * bits(30) / 8))Ответ: 27
Сведения при 300 Кбайт
Пароль из 60 символов составляют из заглавных и строчных латинских букв, десятичных цифр и знаков @, #, $, &. Каждому паролю отведено одинаковое минимально возможное целое число байтов, кодирование посимвольное, все символы кодируются одинаковым минимальным числом битов. Кроме пароля, для каждого пользователя хранятся дополнительные сведения, для чего выделено одинаковое целое число байтов. Для хранения сведений о 4096 пользователях потребовалось 300 Кбайт. Сколько байтов выделено для дополнительных сведений об одном пользователе?
Введите число.
Подсказка
Размер записи — память, делённая на число пользователей.
Решение
Алфавит — 52 буквы, 10 цифр и 4 знака, N = 66, на символ 7 бит. Пароль 60 · 7 = 420 бит → 53 байта. Запись 300 · 1024 / 4096 = 75 байтов, сведения 75 − 53 = 22.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i record = 300 * 1024 // 4096print(record - ceil(60 * bits(52 + 10 + 4) / 8))Ответ: 22
64 пользователя
Пароль содержит 10 заглавных латинских букв; на дополнительные сведения выделено 20 байтов на пользователя. Каждому паролю — минимальное целое число байтов. Сколько байтов нужно для 64 пользователей?
Введите число.
Подсказка
Запись — пароль в целых байтах и сведения.
Решение
26 буквам нужно 5 бит, пароль 10 · 5 = 50 бит → 7 байтов. Запись 7 + 20 = 27 байтов, 64 записи — 1728 байтов.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i print(64 * (ceil(10 * bits(26) / 8) + 20))Ответ: 1728
128 пользователей
Пароль содержит 15 символов из алфавита мощностью 12. Дополнительные сведения занимают 9 байтов на пользователя. Сколько байтов потребуется для 128 пользователей?
Введите число.
Подсказка
Запись — пароль в целых байтах и сведения.
Решение
12 символам хватает 4 бит, пароль 15 · 4 = 60 бит → 8 байтов. Запись 8 + 9 = 17 байтов, 128 записей — 2176 байтов.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i print(128 * (ceil(15 * bits(12) / 8) + 9))Ответ: 2176
Данные о 500 объектах
Код объекта состоит из 25 символов: заглавные латинские буквы, десятичные цифры, дефис и точка. Каждому коду отведено одинаковое минимально возможное целое число байтов, кодирование посимвольное, все символы кодируются одинаковым минимальным числом битов. Кроме кода, для каждого объекта выделено 30 байтов содержательной информации. Сколько байтов потребуется для хранения данных о 500 объектах?
Введите число.
Подсказка
Дефис и точка — тоже символы алфавита.
Решение
Алфавит — 26 букв, 10 цифр, дефис и точка, N = 38, на символ 6 бит. Код 25 · 6 = 150 бит → 19 байтов, запись 19 + 30 = 49 байтов, 500 объектов — 24 500 байтов.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i print(500 * (ceil(25 * bits(26 + 10 + 2) / 8) + 30))Ответ: 24500
База с общим заголовком
Пароль из 8 символов алфавита мощностью 12 и 12 байтов сведений образуют запись; каждому паролю — минимальное целое число байтов. База содержит 200 записей и один общий заголовок в 64 байта. Сколько байтов занимает база?
Введите число.
Подсказка
Общий заголовок прибавляют один раз, а не к каждой записи.
Решение
12 символам хватает 4 бит, пароль 8 · 4 = 32 бита = 4 байта, запись 4 + 12 = 16 байтов. 200 записей — 3200 байтов, общий заголовок прибавляем один раз: 3264.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i print(64 + 200 * (ceil(8 * bits(12) / 8) + 12))Ответ: 3264
Пароль и сведения подряд
Пароль содержит 11 символов алфавита мощностью 5, дополнительные сведения — 25 битов. Пароль и сведения записаны подряд, целое число байтов выделяется всей записи. Сколько байтов займёт запись?
Введите число.
Подсказка
Целые байты всей записи: сложи биты частей, потом округляй.
Решение
Пяти символам нужно 3 бита, пароль 11 · 3 = 33 бита. Подряд со сведениями — 33 + 25 = 58 бит, 58 / 8 = 7,25 → 8 байтов. С отдельными байтами у каждой части вышло бы 5 + 4 = 9.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i pwd = 11 * bits(5)print(ceil((pwd + 25) / 8))Ответ: 8
Сведения в битах
Вся пользовательская запись занимает 12 байтов. Пароль содержит 9 символов из алфавита мощностью 9. Пароль записывается без отдельного округления до байтов; вся остальная часть записи выделена дополнительным сведениям. Сколько это битов?
Введите число.
Подсказка
Пароль не округляют: вычитай его биты из битов записи.
Решение
Запись — 12 · 8 = 96 бит. Девяти символам нужно 4 бита, пароль 9 · 4 = 36 бит, и его не округляют отдельно. На сведения остаётся 96 − 36 = 60 бит.
Решение программой
from math import ceil def bits(alphabet): i = 1 while 2 ** i < alphabet: i += 1 return i print(12 * 8 - 9 * bits(9))Ответ: 60