1precpmtnrifmax — различия между версиями
(→Время работы) |
(→Общий алгоритм) |
||
| Строка 27: | Строка 27: | ||
MakeSchedule() | MakeSchedule() | ||
1 Modify() | 1 Modify() | ||
| − | 2 B | + | 2 B <tex> \leftarrow </tex> Blocks(<tex> \{1 \ldots n \} </tex>) |
| − | 3 ans | + | 3 ans <tex> \leftarrow </tex> <tex> -\infty </tex> |
| − | 4 for (<tex> B_i \in </tex> | + | 4 for (<tex> B_i \in B</tex>): |
| − | 5 ans = | + | 5 ans = max(ans, Decompose(<tex> B_i </tex>)) |
6 return ans | 6 return ans | ||
Версия 21:16, 3 июня 2012
Содержание
Постановка задачи
Задача является обобщением , но здесь у работ также есть времена появления, раньше которых их делать запрещено, и их можно прерывать.
Алгоритм
Работу будем обозначать просто ее номером (), при этом, номера работ могут меняться в зависимости от того, по какому параметру они отсортированы. Время появления работы — , время, требуемое для ее выполнения — . Множество ребер графа обозначается как .
Modify
Для начала, модифицируем времена появления работ. Если работа зависит от , то, очевидно, она не может быть начата раньше, чем закончится выполнение </tex> i </tex>, поэтому нужно заменить на . Алгоритм, делающий это, представлен ниже (работы рассматриваются в порядке топологической сортировки):
Modify() 1 for i 2 for j: ij 3
После выполнения этого алгоритма для любых двух работ , таких, что зависит от , выполняется , поэтому, при рассмотрении работ в порядке неубывания времен их появления, они также будут топологически отсортированы.
Blocks
Здесь и далее считается, что работы отсортированы в порядке неубывания модифицированных .
Decompose
Идея следующая: допустим, у нас есть блок работ, который можно выполнить без прерываний. Найдем работу , которую выгодно выполнить последней. Разобъем оставшееся множество работ на блоки, решим задачу для этих блоков рекурсивно и вставим в промежутки между этими блоками, до них и после них, начиная с .
Общий алгоритм
Выполним Modify(), после чего разобъем все множество работ на блоки и для каждого блока запустим Decompose():
MakeSchedule() 1 Modify() 2 B Blocks() 3 ans 4 for (): 5 ans = max(ans, Decompose()) 6 return ans
Время работы
| Теорема: |
Время работы алгоритма MakeSchedule() — операций. |
| Доказательство: |
|
Обозначим за время, необходимое для выполнения алгоритма MakeSchedule() на n работах. Очевидно, для корректно определенной функции P в силу структуры алгоритма должно выполняться неравенство:
Здесь - размер блока с номером , построенного алгоритмом Blocks(). Заметим, что . Если , то имеем:
Так как , то можно переписать неравенство в следующем виде:
Чтобы получить максимальную нижнюю оценку на , оценим снизу : Так как Значит, при требуемое неравенство будет выполняться. |