Многопоточные вычисления: максимальное число одновременных процессов
Задание 22 · Билет 1 · ЕГЭ по информатике
Условие
В файле содержится информация о 400 процессах. Для каждого процесса в отдельной строке записаны два натуральных числа: время начала и время окончания. Процесс выполняется начиная с момента начала включительно и до момента окончания не включая его. Процессы выполняются параллельно.
Скачивать не обязательно: если решаете на сайте, данные уже есть в программе. Скачайте, только чтобы посмотреть файл отдельно на компьютере.
Попробуйте программой
Необязательно, но удобно: напишите здесь свой код на Python, который найдёт ответ. Если не получится — откройте решение и вставьте готовую программу одной кнопкой.
Решите программой на Python
в браузереНапишите свой код, который найдёт ответ, и нажмите «Выполнить». Горячая клавиша запуска: Ctrl/⌘ + Enter.
Файл задачи уже в песочнице: task22-1-processy.txt — читайте через open('task22-1-processy.txt').
Разбор задачи
Задание 22 ЕГЭ по информатике — многопоточные вычисления: дан файл, в котором для каждого процесса указаны время начала и время окончания. Нужно найти, сколько процессов выполнялось одновременно в самый нагруженный момент.
Процессов много, вручную не перебрать, поэтому считают короткой программой: каждый процесс превращают в два события — начало и окончание.
Что важно знать
- Задание повышенного уровня — оценивается в 1 балл
- Ответ — одно целое число: максимум одновременно выполнявшихся процессов
- Процесс идёт от начала включительно до окончания не включая
План решения
- Прочитайте файл: в каждой строке — время начала и время окончания процесса.
- Превратите каждый процесс в два события: +1 в момент начала и −1 в момент окончания.
- Отсортируйте события по времени; при равенстве окончание идёт раньше начала.
- Идите по событиям, складывая изменения, и запоминайте максимум счётчика.
- Запишите наибольшее значение счётчика.
Потренируйся на процессах: тренажёр соберёт новый набор интервалов и попросит найти максимум одновременно выполнявшихся процессов.
Решение
Теория с нуля: что нужно знать
Решение
открыто шагов: 5 из 5Способ 1 · перебор по моментам времени
data = [tuple(map(int, line.split())) for line in open('task22-1-processy.txt')] # пары (начало, окончание)
lo = min(s for s, e in data) # самое раннее начало
hi = max(e for s, e in data) # самое позднее окончание
best = 0
for t in range(lo, hi + 1): # идём по времени по единице
cur = 0
for s, e in data: # сколько процессов охватывают момент t
if s <= t < e: # начало включительно, окончание — нет
cur += 1
best = max(best, cur)
print(best) # максимальное число одновременных процессов Способ 2 · метод событий
data = [tuple(map(int, line.split())) for line in open('task22-1-processy.txt')] # пары (начало, окончание)
events = [] # события: (время, изменение)
for s, e in data:
events.append((s, 1)) # в момент начала процессов на 1 больше
events.append((e, -1)) # в момент окончания — на 1 меньше
events.sort() # при равном времени окончание (−1) раньше начала (+1)
cur = 0 # сколько процессов выполняется сейчас
best = 0 # максимум за всё время
for t, d in events:
cur += d
best = max(best, cur)
print(best) # максимальное число одновременных процессов Проверка
Типовые ошибки и проверка
- Считают процессы, у которых совпал момент окончания одного и начала другого, одновременными — а они не пересекаются.
- Берут модуль числа активных процессов или путают максимум с суммой длительностей.
- В переборе берут только моменты, когда что-то начинается, — но максимум может достигаться и «в середине» интервала; нужно идти по всем целым моментам.
- В методе событий забывают отсортировать события или не учитывают порядок «окончание раньше начала» при равном времени.
- Проверка: прогоните решение на нескольких процессах вручную, затем сверьте максимум на полном файле. Оба способа должны дать одно и то же число.
Режимы
Сейчас открыт режим обучения: теория, разбор и ответ видны. Скоро появится режим проверки — только условие и поле ответа, без подсказок.
Практикум Все задания Режим проверки — скоро