Найти тему
Стив Май

Разбор ЕГЭ. Информатика. Задача № 13

Оглавление

+Оглавление

Разбираем задачу №13 в ЕГЭ по информатике.

Обратите внимание, здесь будет не только пример решения, но и разбор задания по существу.

Для примера я беру демоверсию 2020 года (актуальная на момент написания статьи) с сайта fipi.ru.

Задание №13 ЕГЭ информатика
Задание №13 ЕГЭ информатика

Прежде чем приступать к решению этого примера, посмотрим в спецификацию к демоверсии.

Спецификация
Спецификация

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

Кодификатор
Кодификатор

Ещё недавно в это задание входила и скорость передачи информации, но теперь только оценка памяти. Это и разумно: оценивать память в сложных случаях куда полезнее, чем оценивать память и скорость в простых.

Немного теории.

Во многом это задание походит по смыслу на задание №9. Однако теперь речь идёт о записи в память не изображения, и даже вообще не однородного информационного объекта, а нескольких сложных фрагментов. Это существенно осложняет работу, и уложиться в предложенные 3 минуты можно только если заранее знаешь, на какой элемент задания обращать внимание.

О посимвольном кодировании

Это наиболее распространённый метод кодирования текстов, однако не единственный. Заключается он в том, что каждому символу назначается двоичный код, и эти коды записываются один за другим. Таких кодов два варианта - равномерный (когда все символы кодируются одинаковым по длине кодом) и неравномерный (длины кодов различаются, как в задании № 5). Остановимся на первом как на наиболее актуальном к этому заданию. Чаще всего, для минимальности длины кода, каждой букве просто назначают двоичную запись её номера (начиная с 0). По хорошему, для определения, сколько бит будет занимать каждая буква, можно пользоваться формулой

N - количество букв, i - количество бит
N - количество букв, i - количество бит

Здесь есть два важных момента:

1. Может так статься, что букв будет не "хорошее" количество, и для строго равенства i должно быть дробным. В таких случаях не отчаиваются, а берут максимум, и при этом просто некоторые коды останутся незадействованными:

Для кодирования 6 букв надо брать 3 бита, оставляя пару кодов без букв
Для кодирования 6 букв надо брать 3 бита, оставляя пару кодов без букв

2. Память машины группируется по байтам (8 бит), поэтому почти всегда мы должны задействовать целое количество байтов. Для кодирования всего лишь одной буквы кодом из п. 1 потребуется не 0,375 байт, а целый. Как пирожки в коробке:

Задействованы первые три бита от байта, остальные 5 остались "пустыми", в них неиспользуемые "единички".
Задействованы первые три бита от байта, остальные 5 остались "пустыми", в них неиспользуемые "единички".

Для двух символов, кстати, тоже 1 целый байт:

Теперь занят тот же самый байт, но "пустыми" остаются только 2 бита.
Теперь занят тот же самый байт, но "пустыми" остаются только 2 бита.

Решение задания

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

  1. 15 символов пароля
  2. дополнительные сведения

Информационный объём каждой записи в БД будет складываться из этих двух. Для второго мы заранее знаем объём (24 байта), а для первого нужно вычислить. Вычислять по безликим формулам очень погано, поэтому я рекомендую просто прописать реальные коды для каждой буквы. Благо, букв в этих заданиях никогда не бывает много. Коды можно назначать "от балды", но лучше по порядку:

-8

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

В каждом пароле используется по 15 символов, поэтому количество бит, необходимых для записи можно получить просто умножением: 15*3=45. Обратите внимание: не байт, а бит. Каждый раз в задании надо внимательно читать, что надо - байты или биты. Это важно вот почему. Попытаемся 45 бит распределить по байтам:

Распределение пароля из 15 символов (по 3 бита каждый) в байты
Распределение пароля из 15 символов (по 3 бита каждый) в байты

Смотрите, задействовано 5 целых байтов и ещё один не до конца. Всего для работы нужно 6 байтов, но в них останется незадействованными три бита.

Если к этим 6 байтам добавить 24 байта "дополнительной информации", то в сумме наберётся 30 байт на запись. Таковых у нас 20 штук: это 30*20=600 байт.

Ответ: 600

Подводные камни

Задание безумно лёгкое, на него отводится всего 3 минуты, но процент решаемости низковат - 60% (в прошлом 2019 году). Практически все ошибки сосредоточены вокруг нескольких моментов.

1. Посимвольное и полнотекстовое кодирование. Эти два варианта путают, и начинают рассчитывать количество возможных паролей из 8 различных символов с длиной 15 символов. 8 в 15 степень возводится довольно легко (даже часто оставляют в виде степени двойки), но в экзаменационных КИМах, бывает, попадаются и задания с 7 или 9 символами. Там возведение гораздо труднее, а применение формулы (см. выше) становится просто нереальным. Ни разу не встречал заданий, в которых это было бы нужно (видел задания, цель которых - посчитать количество паролей, но не кодировать).

2. Целое число байт. Это просто заноза какая-то. Ладно, насчитали 45 бит. Поняли, что это не байты, поделили на 8. Получили 5,625. Но это не целое количество байт.

Иногда дробь сразу в ответ и пишут (даже про 24 дополнительных забывают).

Кто-то догадывается округлить, но лишь в самом конце: (5,625+24)*20=592,5≈593

Округление до сложения (5,625≈6) тоже работает лишь в половине случаев, потому что сделай вам не 15, а 14 символов, и бит уже будет на 45, а 42. Это 42/8=5,25≈5 байт!

Ещё раз: Сколько нужно коробок, чтобы впихнуть в них 45 пирожков по 8 штук в каждый? Последняя коробка тоже нужна целая, даже если пирожок в ней будет лежать один.

Как избежать

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

Другие варианты

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

Например, самое редкорешаемое задание звучит примерно так: один компьютер принимает файл из интернета и потом передаёт его на другой компьютер, передача может производиться одновременно с приёмом, но только если загружено уже не менее какого-то объёма. Это довольно грубое описание кэширующего прокси-сервера. Технология, которая сейчас может быть востребована в крупных организациях с относительно медленным внешним интернет-каналом, если сотрудники, например, регулярно посещают один и тот же сайт, для ускорения работы или экономии внешнего трафика.

Решение опять то же - нужно рисовать, но в этот раз не разбиение по байтам, а временную диаграмму:

Временная диаграмма загрузки файла через кэширующий прокси-сервер
Временная диаграмма загрузки файла через кэширующий прокси-сервер