Подтема 3 из 5
Сжатие и заголовки
Как меняется объём после сжатия, как вернуть исходный и как учесть заголовки файлов.
Сжатие
Пусть снимок задачи темы перед отправкой сжимают на 25 %. Сколько он займёт?
Сжатие умножает объём на оставшуюся долю: после сжатия на 25 % остаётся 75 %. 1152 · 0,75 = 864 Кбайт.
«На 25 %», «до 25 %» и «в 4 раза» — разные множители. Выбери формулировку, чтобы увидеть, что осталось:
- Объём уменьшился на 25 %
- осталось 75 %q = 0,75
- Объём уменьшился до 25 % исходного
- осталось 25 %q = 0,25
- Объём уменьшился в 4 раза
- осталась четвертьq = 1/4 = 0,25
- Сжатия нет
- осталось всёq = 1
Процент уменьшения считают от исходного объёма: с 80 до 20 Мбайт — это уменьшение на 60 / 80 = 75 %, а не на 60 %.
Тонкости:два сжатия подряд
Доли перемножаются: после сжатия на 20 %, а затем ещё на 25 % остаётся 0,8 · 0,75 = 0,6 исходного. Итоговое уменьшение — 40 %, а не 45 %.
Исходный объём
Если известен сжатый объём, исходный находят делением на оставшуюся долю. Сжатый снимок занимает 864 Кбайт, сжатие на 25 %: 864 / 0,75 = 1152 Кбайт.
Прибавить к 864 ещё 25 % было бы ошибкой: получилось бы 1080. Эти 25 % считались от исходного, большего объёма.
Заголовок
Заголовок — служебная часть файла: его объём прибавляют к данным. Важно, что сжимают: только данные или весь файл вместе с заголовком.
Слово «каждый» меняет расчёт. Если у каждого из n файлов свой заголовок H, набор занимает n · (V + H); если заголовок один на весь набор — n · V + H.
Обратный ход
Если известен только итоговый объём, действия отменяют в обратном порядке. Пусть 32 изображения 512 × 256 вместе заняли 8 Мбайт; данные каждого сжаты на 25 %, после сжатия к каждому добавлен заголовок 64 Кбайт. Какова глубина цвета?
- Набор строился слева направо: глубина → данные → сжатие → заголовок → 32 файла. Известен только конец цепочки.
- 8 · 1024 / 32 = 256 Кбайт: сначала делим общий объём между файлами.
- 256 − 64 = 192 Кбайт: убираем заголовок: он добавлен последним.
- 192 / 0,75 = 256 Кбайт: восстанавливаем объём до сжатия.
- 256 · 8192 / (512 · 256) = 16 бит: делим биты данных на число пикселей. Глубина 16 бит, цветов 2¹⁶ = 65 536.
На файл 8 · 1024 / 32 = 256 Кбайт, без заголовка 192, до сжатия 192 / 0,75 = 256 Кбайт, глубина 256 · 8192 / (512 · 256) = 16 бит. Если бы получилась дробная глубина, взяли бы её целую часть: набор должен поместиться.
Тонкости:проценты в программе — целыми числами
Запись 1 - 0.70 в Python — не ровно 0,3, и вместо 10 получается 9,999…: целая часть станет 9. Поэтому долю записывают целыми числами: «осталось 30 из 100» — делимое умножают на 100, делитель на 30.
limit = 48 * 1024 * 8pixels = 512 * 256print(limit / (pixels * (1 - 0.70)))print(limit * 100 // (pixels * 30))Итого
- Сжатие на p %умножить на (100 − p) / 100
- «До p %», «в k раз»осталось p % или 1/k
- Исходный объёмсжатый / оставшаяся доля
- Заголовокприбавить; у каждого файла — n · (V + H)
- Обратный ходотменять действия с конца, глубину — вниз
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Сжатие на 15 %
Файл объёмом 40 Мбайт сжали на 15 %. Сколько Мбайт он занимает теперь?
Введите число.
Подсказка
Осталось 85 %.
Решение
После сжатия на 15 % остаётся 85 % объёма: 40 · 0,85 = 34 Мбайт.
Решение программой
print(40 * 85 // 100)Ответ: 34
На сколько процентов уменьшился объём
Объём файла уменьшился с 80 до 20 Мбайт. На сколько процентов он уменьшился?
Введите число.
Подсказка
Процент уменьшения считают от исходного объёма.
Решение
Объём уменьшился на 80 − 20 = 60 Мбайт. От исходных 80 Мбайт это 60 / 80 = 0,75, то есть 75 %.
Решение программой
print((80 - 20) * 100 // 80)Ответ: 75
Два сжатия подряд
Файл сначала сжали на 20 %, а затем получившийся файл — ещё на 50 %. На сколько процентов уменьшился исходный объём?
Введите число.
Подсказка
Оставшиеся доли перемножаются.
Решение
После первого сжатия осталось 0,8 объёма, после второго — 0,8 · 0,5 = 0,4. Осталось 40 %, значит, объём уменьшился на 60 %.
Решение программой
print(100 - 80 * 50 // 100)Ответ: 60
Объём до сжатия
После уменьшения на 30 % файл занимает 28 Мбайт. Сколько он занимал до сжатия?
Введите число.
Подсказка
Сжатый объём делят на оставшуюся долю.
Решение
После уменьшения на 30 % осталось 70 % исходного объёма: 28 = 0,7 · V. Значит, V = 28 / 0,7 = 40 Мбайт.
Решение программой
print(28 * 100 // 70)Ответ: 40
Сжат весь файл с заголовком
Данные занимают 300 Кбайт, заголовок — 24 Кбайт. Весь файл вместе с заголовком сжимают в 3 раза. Каков объём сжатого файла в Кбайтах?
Введите число.
Подсказка
Сжимается вся сумма: данные и заголовок.
Решение
Весь файл до сжатия занимает 300 + 24 = 324 Кбайт. После сжатия в 3 раза — 324 / 3 = 108 Кбайт.
Решение программой
print((300 + 24) // 3)Ответ: 108
Заголовок у каждого файла
Десять файлов содержат по 96 Кбайт данных, у каждого файла свой заголовок 8 Кбайт. Каков общий объём файлов в Кбайтах?
Введите число.
Подсказка
Заголовок есть у каждого файла.
Решение
Каждый файл занимает 96 + 8 = 104 Кбайт, десять файлов — 10 · 104 = 1040 Кбайт.
Решение программой
print(10 * (96 + 8))Ответ: 1040
Палитра при сжатии на 40 %
Изображение 1024 × 768 пикселей хранится в сжатом виде: сжатие уменьшает объём на 40 %. На изображение отведено не более 576 Кбайт. Какое наибольшее количество цветов можно использовать?
Введите число.
Подсказка
Сжатый объём — 60 % исходного.
Решение
Сжатый объём — 60 % исходного: 0,6 · 1024 · 768 · i ≤ 576 · 8192. Отсюда i ≤ 10, глубина 10 бит, цветов 2¹⁰ = 1024.
Решение программой
i = int(576 * 8192 / (0.6 * 1024 * 768))print(2 ** i)Ответ: 1024
Палитра 64 изображений
В системе хранятся 64 изображения размером 1024 × 512 пикселей. Данные каждого изображения сжимаются на 25 %, после сжатия к каждому добавляется служебная информация объёмом 32 Кбайт. Все изображения вместе заняли 20 Мбайт. Сколько цветов использовано в палитре каждого изображения?
Введите число.
Подсказка
Действия отменяют в обратном порядке: заголовок, затем сжатие.
Решение
На одно изображение приходится 20 · 1024 / 64 = 320 Кбайт. Без заголовка 320 − 32 = 288 Кбайт, до сжатия 288 / 0,75 = 384 Кбайт. Глубина 384 · 8192 / (1024 · 512) = 6 бит, цветов 2⁶ = 64.
Решение программой
per = 20 * 1024 // 64data = (per - 32) * 100 // 75i = data * 8192 // (1024 * 512)print(2 ** i)Ответ: 64
Описание карточки
Карточка каталога состоит из фотографии и текстового описания. Фотографии имеют размер 800 × 600 пикселей и палитру из 2²⁴ цветов; при сохранении их объём уменьшается на 75 %. 100 карточек занимают 50 Мбайт. Сколько Кбайт в среднем занимает описание одной карточки? Ответ округли до целого числа.
Введите число.
Подсказка
Из объёма одной карточки вычти сжатую фотографию.
Решение
Фотография с палитрой 2²⁴ цветов занимает 800 · 600 · 3 = 1 440 000 байт, после сжатия на 75 % — 360 000 байт = 351,5625 Кбайт. На карточку приходится 50 · 1024 / 100 = 512 Кбайт, на описание — 512 − 351,5625 = 160,4… Кбайт, округлённо 160.
Решение программой
photo = 800 * 600 * 3 * 25 / 100 / 1024card = 50 * 1024 / 100print(round(card - photo))Ответ: 160