Подготовка к школе
1 класс
2 класс
3 класс
4 класс
5 класс
6 класс
7 класс
8 класс
9 класс
10 класс
11 класс
ОГЭ
ЕГЭ
Для всех
Назад

22. Вычислительные процессы: #298258

Сообщить о проблеме
Задание #298258
Задание было решено верно
Задание было решено неверно

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

Информация о процессах представлена в файле в виде таблицы. В первом столбце таблицы указан идентификатор процесса (ID), во втором столбце таблицы – время его выполнения в миллисекундах, в третьем столбце перечислены с разделителем «;» ID процессов, от которых зависит данный процесс. Если процесс является независимым, то в таблице указано значение $0$.

Типовой пример организации данных в файле:

ID процесса $B$Время выполнения процесса $B$ (мс)ID процесса(-ов) $A$
$1$$4$$0$
$2$$3$$0$
$3$$1$$1$; $2$
$4$$7$$3$

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

Используя данные из файла, составим таблицу, на какой мс может закончиться каждый из процессов. Независимые процессы $2$, $4$ и $1$ завершатся на $3$, $6$ и $8$ мс соответственно.

Процесс $3$ зависит от $1$ и $2$: позже заканчивается $1$ (на $8$ мс), значит $3$ завершится на $8+1=9$ мс. Процесс $6$ зависит от $3$ и завершится на $9+5=14$ мс. Процесс $5$ зависит от $3$ и $4$, позже заканчивается $3$, поэтому $5$ завершится на $9+7=16$ мс.

От процесса $5$ зависят два процесса: $8$ заканчивается на $16+9=25$ мс, $7$ — на $16+10=26$ мс. Процесс $9$ зависит от $8$ и завершится на $25+4=29$ мс, процесс $10$ зависит от $7$ и завершится на $26+4=30$ мс. Процесс $16$ зависит от $10$ и $9$: позже заканчивается $10$, значит $16$ завершится на $30+9=39$ мс.

Процесс $11$ зависит от $6$ и $7$: позже заканчивается $7$ (на $26$ мс), поэтому $11$ завершится на $26+8=34$ мс. От него зависят сразу три процесса: $13$ заканчивается на $34+4=38$ мс, $14$ — на $34+7=41$ мс, $12$ — на $34+9=43$ мс.

Наконец, процесс $15$ зависит от $12$, $13$ и $14$: позже всех заканчивается $12$ (на $43$ мс), значит $15$ завершится на $43+10=53$ мс.

Таким образом, вся совокупность процессов завершится на $53$ мс.

Время, мсID процесса
$3$$2$
$6$$4$
$8$$1$
$9$$3$
$14$$6$
$16$$5$
$25$$8$
$26$$7$
$29$$9$
$30$$10$
$34$$11$
$38$$13$
$39$$16$
$41$$14$
$43$$12$
$53$$15$

Приведём другое решение на языке Python.

import pandas as pd
from functools import lru_cache

df = pd.read_excel('22-24.ods', engine='odf', header=None, skiprows=1)

t, dep = {}, {}
for _, row in df.iterrows():
    pid = int(row[0])
    t[pid] = int(row[1])
    s = str(row[2]).replace(' ', '').strip()   # в файле есть пробелы после ';'
    dep[pid] = [] if s == '0' else [int(x) for x in s.split(';')]

@lru_cache(None)
def finish(p):                        # момент завершения процесса p
    return t[p] + max([finish(d) for d in dep[p]], default=0)

print(max(finish(p) for p in t))   # 53

Обратите внимание, что процесс $16$ заканчивается на $39$ мс, хотя стоит в таблице почти последним, а критический путь идёт через $1 \to 3 \to 5 \to 7 \to 11 \to 12 \to 15$ и упирается в $53$ мс. Поэтому нужен максимум по всем процессам, а не по последней строке таблицы.

Показать
Очки опыта 20
Спросить Зави
0 заданий сегодня

Предложить улучшение