ЕГЭ, ОГЭ, программирование и робототехника в Калининграде

Алгоритм решения задания 7. Часть 1

О задании

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

Все эти величины связаны общими формулами. Поэтому, если внимательно выписать данные из условия и привести их к одним единицам измерения, найти неизвестное значение будет несложно.

Формулировки задания

Формулировки задания 7 различаются прежде всего величиной, которую требуется найти. Это могут быть следующие значения:

  1. Размер файла с данными
  2. Время или объём переданных данных
  3. Количество цветов в палитре
  4. Число снимков в пакете
  5. Глубина кодирования

В условии также может использоваться сжатие, уменьшающее итоговый размер файла. Но пугаться разнообразия формулировок не стоит. В основном вам предстоит работать с двумя видами данных: изображениями и звуком. Реже встречаются видеофайлы, которые содержат и изображение, и звук.

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

Работа с изображением

Для начала вспомним, что такое изображение. Изображение на экране состоит из маленьких точек, которые называются пикселями.

Количество пикселей определяет разрешение изображения. Например, на рисунке ниже представлено изображение 4 на 2 пикселя.

Чем больше пикселей содержит изображение при одинаковом физическом размере, тем больше деталей оно может передать. При низком разрешении отдельные пиксели становятся заметнее, поэтому изображение выглядит менее чётким.

Каждый пиксель имеет свой цвет. В модели RGB цвет пикселя задаётся тремя компонентами: красной (R), зелёной (G) и синей (B). Изменяя интенсивность каждой компоненты, можно получать разные оттенки.

Модель RGB работает так: цвет пикселя описывается тремя числами, которые задают интенсивность красной, зелёной и синей компонент. Если все три значения максимальны, получается белый цвет, а если равны нулю — чёрный.

Далее познакомимся с понятием глубины цвета. Глубина цвета — это количество бит, используемых для кодирования цвета одного пикселя. От неё зависит, сколько различных цветов можно представить.

Глубина цвета измеряется в битах. При глубине 1 бит можно закодировать два цвета, при глубине 8 бит — 256 цветов, а при глубине 24 бита — 16 777 216 цветов.

Количество цветов N, которое можно закодировать при глубине цвета i, вычисляется по формуле:

N = 2^i

Если количество цветов N является степенью двойки, глубину цвета можно найти по формуле:

i = log_2{N}

Эта зависимость следует из формулы Хартли. Она связывает количество равновероятных вариантов и объём информации, необходимый для выбора одного из них.

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

Давайте разберём её на примере. В распространённом варианте модели RGB на каждую цветовую компоненту выделяется по 8 бит. Тогда один пиксель занимает 3 · 8 = 24 бита

Теперь найдём количество цветов при глубине 24 бита. Для этого возведём 2 в степень 24 и получим 16 777 216 цветов.

Теперь выведем формулу для определения размера всего изображения. Мы знаем ширину, высоту и размер одного пикселя. Перемножив эти три величины, получим объём памяти для хранения изображения без сжатия.

Формула для определения объёма памяти, необходимого для хранения растрового изображения:

V = h\cdot w \cdot i

Здесь:

  • h — высота изображения,
  • w — ширина изображения,
  • i — вес одного пикселя.

Работа с передачей данных

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

Для работы с передачей данных у нас есть следующая формула:

V = q \cdot t

Здесь:

  • V — объём файла в битах,
  • q — скорость передачи данных в битах в секунду (бит/с),
  • t — время в секундах.

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

А если в условии говорится, что файл сжали на N процентов, то его новый размер составляет (100 − N)% от исходного. Например, после сжатия на 20% файла весом 10 МБ, от него останется 80% исходного объёма, то есть 8 МБ. Найти же исходный объём вы можете через пропорцию: если 8 МБ — это 80%, то чтобы найти 100% нужно 8 МБ разделить на 80% (число 0,8).

Алгоритм решения задания 7

Далее рассмотрим алгоритмы решения задания 7, связанные с изображениями.

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

  1. Каково максимально возможное количество снимков в одном пакете?
  2. Какое максимальное/минимальное количество цветов можно использовать в изображении?
  3. Какой объём трафика экономится при передаче сжатого изображения?
  4. Сколько изображений поместится на носителе данных?

Все эти задания решаются по формулам. Вы можете расписывать вычисления на бумаге или выполнять их в Python. Программа особенно удобна при работе с большими числами и помогает увидеть результат каждого этапа.

Тип 1

Начнём разбор мы с такой формулировки:

Прибор автоматической фиксации нарушений правил дорожного движения делает цветные фотографии размером 1024 на 768 пикселей, используя палитру из 4096 цветов. Снимки сохраняются в памяти камеры, группируются в пакеты по несколько штук, затем передаются в центр обработки информации со скоростью передачи данных 1 310 720 бит/с.

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

В ответ запишите целое число.

Открыть задание

Давайте распишем решение этого задания полностью, как если бы мы решали его на бумаге.

Сначала необходимо найти размер одного пикселя — i. Для этого вычислим логарифм по основанию 2 от 4096, то есть количества цветов в палитре. Получим 12, потому что 2¹² = 4096.

Нам известны высота и ширина изображения, а также глубина цвета i. Подставим эти значения в формулу и определим объём одного изображения:

V = h · w · i = 1024 · 768 · 12 = 9 437 184 бита.

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

Вспоминаем, что у нас есть формула вычисления объёма переданных данных:

V_п = q · t.

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

V_п = 1 310 720 · 300 = 393 216 000 бит.

Почему максимально допустимый? На передачу пакета отводится не более 300 секунд. Пакет меньшего объёма передастся быстрее, что условию не противоречит.

Если пакет будет хотя бы на один бит больше, передача займёт более 300 секунд и условие нарушится.

Теперь известны максимальный объём пакета и объём одного изображения. Разделим первое значение на второе и найдём количество изображений:

Q = 393 216 000 / 9 437 184 ≈ 41,67

Получается, что в пакет помещается 41 полное изображение и часть 42-го. Но передать часть снимка вместо целого по условию нельзя.

Проверим, поместятся ли в пакет 42 полных изображения. Их общий объём равен:

V_п = 9 437 184 · 42 = 396 361 728 бит.

Полученное число превышает максимальный объём пакета, поэтому передача займёт более 300 секунд. Такой вариант нам не подходит.

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

Теперь мы готовы дать ответ на это задание: 41.

Пример 1

Рассмотрим ещё одну формулировку задания 7 первого типа:

Автоматическая фотоловушка в заповеднике, оснащённая датчиком движения, делает цветные фотографии проходящих мимо леопардов. Размер каждой фотографии 1024 х 64 пикселя, при этом используется палитра из 4096 цветов. Снимки сохраняются в памяти камеры, группируются по несколько штук, а затем передаются в центр охраны природы со скоростью передачи данных 655 360 бит/с.

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

В ответе запишите целое число.

Открыть задание

В этот раз решим задачу в среде разработки. Алгоритм останется тем же, но вычисления выполнит Python.

Чтобы найти глубину цвета по количеству цветов, импортируем функции log2() и ceil() из модуля math.

from math import ceil, log2

Округление вверх (ceil()) важно, если количество цветов не является степенью двойки!

Далее запишем все известные данные в виде переменных:

res = 1024 * 64
bitrate = 655_360
colors = 4096
time = 70

Вычисляем глубину цвета, то есть размер одного пикселя:

pixel_size = ceil(log2(colors))

Далее вычисляем вес одного изображения:

img_size = res * pixel_size

Затем находим максимально допустимый объём пакета:

package_size = bitrate * time

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

img_in_package = package_size // img_size

print(img_in_package)

Вся программа у нас выглядит следующим образом:

from math import ceil, log2

res = 1024 * 64
bitrate = 655_360
colors = 4096
time = 70

pixel_size = ceil(log2(colors))
img_size = res * pixel_size
package_size = bitrate * time
img_in_package = package_size // img_size

print(img_in_package)

В ответ записываем полученное число 58.

Тип 2

В заданиях следующего типа необходимо вычислить количество цветов, которое можно использовать в изображении, то есть значение N из формулы Хартли:

N = 2^i

Ознакомимся с такой формулировкой:

Прибор автоматической фиксации нарушений правил дорожного движения делает цветные фотографии размером 1280×720 пикселей. Снимки сохраняются в памяти камеры, группируются в пакеты по 69 штук, затем передаются в центр обработки информации со скоростью передачи данных 245760 байт/с.

Каково минимальное возможное количество цветов в палитре изображения, если на передачу одного пакета отводится более 270 секунд?

В ответе запишите целое число.

Открыть задание

Как и первую задачу прошлого типа, сначала решим её вручную, подробно расписав каждое действие.

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

V_п = q · t = 245 760 · 8 · 270 = 530 841 600 бит.

Скорость дана в байтах в секунду, поэтому мы сразу перевели её в биты в секунду, умножив на 8.

В пакете 69 изображений размером 1280 × 720 пикселей. Найдём граничное значение глубины цвета для одного пикселя:

i > 530 841 600 / (69 · 1280 · 720) ≈ 8,35 бита.

Глубина цвета должна быть целым числом и превышать 8,35. Минимальное подходящее значение — 9 бит.

Важно, что в условии сказано «более 270 секунд». При глубине 8 бит пакет передался бы быстрее, поэтому это значение не подходит.

Теперь определим минимальное количество цветов, для которого требуется 9 бит на пиксель.

В 8 битах можно закодировать 2⁸ = 256 цветов. Поэтому при 256 цветах хватит 8 бит, а девятый бит впервые понадобится для 257 цветов.

Следовательно, минимальное подходящее количество цветов равно 257.

В общем виде минимальное количество цветов, требующее глубины i бит, вычисляется так: N_min = 2(i — 1) + 1.

Подставляем i = 9 и получаем N_min = 2⁸ + 1 = 257. Это число и записываем в ответ.

Пример 2

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

Для хранения произвольного растрового изображения размером 2560 х 5040 пикселей отведено 14 175 Кбайт памяти без учёта размера заголовка файла. Для кодирования цвета каждого пикселя используется одинаковое количество бит, коды пикселей записываются в файл один за другим без промежутков.

Какое максимальное количество цветов можно использовать в изображении?

Открыть задание

И снова решать будем с помощью Python. Здесь нет ни пакетов, ни передачи данных. Сначала найдём максимальное целое количество бит на пиксель, которое помещается в выделенную память. Затем вычислим N.

Количество бит на пиксель обязательно целое, поэтому результат деления объёма памяти на число пикселей нужно округлить вниз (i = V // (h * w))

Запишем известные значения в переменные и сразу переведём килобайты в биты:

Запишем известные значения в переменные и сразу переведём килобайты в биты:

res = 2560 * 5040
memory_size = 14_175 * 2 ** 13

Целочисленно делим доступный объём памяти на количество пикселей, а затем находим количество цветов:

pixel_size = memory_size // res
colors = 2 ** pixel_size
print(colors)

Получаем глубину 9 бит и ответ – 29, или же 512 цветов.

Тип 3

В заданиях третьего типа предстоит работать со сжатыми изображениями и вычислять объём трафика, сэкономленного при их передаче.

Разберём задачу с такой формулировкой:

Виталий делает снимки интересных мест и событий цифровой камерой своего смартфона. Каждая фотография представляет собой растровое изображение размером 1920×1080 пикселей и с палитрой из 223 цветов. В конце дня Виталий отправляет снимки друзьям с помощью приложения-мессенджера. Для экономии трафика приложение сжимает снимки, используя размер 1280×1024 пикселей и глубину цвета 21 бит.

Сколько Кбайт трафика экономится таким образом при передаче 120 фотографий?

В ответе укажите целую часть полученного числа.

Открыть задание

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

Для начала выпишем все известные значения:

res = 1920 * 1080
color_depth = 23
res_comp = 1280 * 1024
compressed_depth = 21
num_img = 120

Вычислим вес несжатого изображения:

mem_size = res * color_depth

И вес сжатого:

mem_size_comp = res_comp * compressed_depth

Чтобы получить ответ, найдём разницу между размерами исходного и сжатого изображений, умножим её на количество снимков и переведём биты в килобайты, разделив на 2 в тринадцатой степени:

ans = (mem_size - mem_size_comp) * num_img // (2 ** 13)
print(ans)

Получаем 295425 Кбайт. В ответ записываем число 295425.

Пример 3

Следующая формулировка будет такой:

Виталий фотографирует интересные места и события цифровой камерой своего смартфона. Каждая фотография представляет собой растровое изображение размером 1024×768 пикселей, при этом используется палитра из 230 цветов. В конце дня Виталий отправляет снимки друзьям с помощью приложения-мессенджера. Для экономии трафика приложение оцифровывает снимки повторно, используя размер 800×600 пикселей и глубину цвета 28 бит.

Сколько Кбайт трафика экономится при передаче 100 фотографий?

В ответе укажите целую часть полученного числа.

Открыть задание

Решение аналогично предыдущему: меняются только исходные данные.

res = 1024 * 768
color_depth = 30
res_comp = 800 * 600
compressed_depth = 28
num_img = 100

mem_size = res * color_depth
mem_size_comp = res_comp * compressed_depth

ans = (mem_size - mem_size_comp) * num_img // (2 ** 13)
print(ans)

В результате получаем 123937 Кбайт. Это число и записываем в ответ.

Тип 4

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

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

Фотограф делает цветные фотографии размером 7680×4320 пикселей, используя палитру из 216 цветов. Для сохранения снимков фотограф использует сменные карты памяти, каждая из которых вмещает не более 9 Гбайт данных. Когда на карте памяти остаётся недостаточно места для записи новой фотографии, фотограф берёт следующую, свободную карту. Известно, что фотограф сделал 4010 снимков.

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

В ответе запишите целое число.

Открыть задание

Здесь не нужно отдельно вычислять количество цветов: в формуле используется глубина цвета i, которая уже дана и равна 16 битам.

Чтобы узнать, сколько полных снимков помещается на одну карту, воспользуемся целочисленным делением //.

Выпишем имеющиеся данные:

res = 7680 * 4320
image = res * 16
memory_card = 9 * 2 ** 33

Найдём, сколько снимков помещается на одну карту памяти:

images_per_card = memory_card // image

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

images_on_last_card = (4010 - 1) % images_per_card + 1

Весь код для этого задания будет таким:

res = 7680 * 4320
image = res * 16
memory_card = 9 * 2 ** 33

images_per_card = memory_card // image

images_on_last_card = (4010 - 1) % images_per_card + 1
print(images_on_last_card)

Получаем число 95. Это и есть ответ.

Пример 4

И последняя задача в этой статье имеет такую формулировку:

Фотограф делает цветные фотографии размером 3840х2160 пикселей, используя палитру из 224 цветов. Для сохранения снимков фотограф использует сменные карты памяти, каждая из которых вмещает не более 16 Гбайт данных. Когда на карте остаётся недостаточно места для записи новой фотографии, фотограф заменяет карту на следующую свободную. Известно, что фотограф сделал 3742 снимка.

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

В ответе запишите целое число.

Открыть задание

Решение строится по тому же алгоритму:

res = 3840 * 2160
image = res * 24
memory_card = 16 * 2 ** 33

images_per_card = memory_card // image

images_on_last_card = (3742 - 1) % images_per_card + 1

print(images_on_last_card)

В ответ записываем число 292.

На этом мы закончим работу с изображениями в 7 заданиях. А в следующей статье разберём решения заданий со звуковыми файлами.

Разберём эту тему на бесплатном пробном занятии

Преподаватель покажет, как решать такие задачи, и подскажет, с чего начать подготовку. Группы до 8 человек, очно в Калининграде и онлайн.

Записаться на пробное занятие