1precpmtnrifmax — различия между версиями
(→Общий алгоритм) |
(→Время работы: добавил доказательство) |
||
Строка 34: | Строка 34: | ||
== Время работы == | == Время работы == | ||
− | + | {{Теорема | |
+ | |statement= | ||
+ | Время работы алгоритма MakeSchedule() — <tex> O(n^2) </tex> операций. | ||
+ | |proof= | ||
+ | Обозначим за <tex> P(n) </tex> время, необходимое для выполнения алгоритма MakeSchedule() на n работах. Очевидно, для корректно определенной функции P в силу структуры алгоритма должно выполняться неравенство: | ||
+ | |||
+ | <tex> P(n) \ge сn + \sum\limits_{i = 1}^{k} P(n_i) </tex> | ||
+ | |||
+ | Здесь <tex> n_i </tex> - размер блока с номером <tex> i </tex>, построенного алгоритмом Blocks(). Заметим, что <tex> \sum\limits_{i = 1}^{k} n_i = n - 1</tex>. | ||
+ | |||
+ | Если P(n) = an^2, то имеем: | ||
+ | |||
+ | <tex> an^2 \ge cn + a \sum\limits_{i = 1}^{k} n_i^2 </tex> | ||
+ | |||
+ | Так как <tex> n^2 > (n - 1)^2 = (\sum\limits_{i = 1}^{k} n_i)^2 = \sum\limits_{i = 1}^{k} n_i^2 + 2\sum\limits_{\substack{i, j = 1\\ i \ne j}}^{k} n_i n_j </tex>, то можно переписать неравенство в следующем виде: | ||
+ | |||
+ | <tex> 2a \sum\limits_{\substack{i, j = 1\\ i \ne j}}^{k} n_i n_j \ge cn </tex> | ||
+ | |||
+ | Чтобы получить максимальную нижнюю оценку на <tex> a </tex>, оценим снизу <tex> \sum\limits_{i, j = 1}^{k} n_i n_j </tex>: | ||
+ | |||
+ | Так как <tex> \sum\limits_{\substack{i, j = 1\\ i \ne j}}^{k} n_i n_j \ge \sum\limits_{\substack{i, j = 1\\ i \ne j}}^{k} 1 \cdot n_j = \sum\limits_{j = 1}^{k} (k - 1) n_j = (k - 1) (n - 1) \ge \frac{nk}{4}</tex> | ||
+ | |||
+ | Значит, при <tex> a \ge \frac{c}{2} \frac{n}{\frac{nk}{4}} = \frac{2c}{k} </tex> требуемое неравенство будет выполняться. | ||
+ | |||
+ | }} |
Версия 20:54, 3 июня 2012
Содержание
Постановка задачи
Задача , но здесь у работ также есть времена появления, раньше которых их делать запрещено, и их можно прерывать.
является обобщениемАлгоритм
Работу будем обозначать просто ее номером (
), при этом, номера работ могут меняться в зависимости от того, по какому параметру они отсортированы. Время появления работы — , время, требуемое для ее выполнения — . Множество ребер графа обозначается как .Modify
Для начала, модифицируем времена появления работ. Если работа
зависит от , то, очевидно, она не может быть начата раньше, чем закончится выполнение </tex> i </tex>, поэтому нужно заменить на . Алгоритм, делающий это, представлен ниже (работы рассматриваются в порядке топологической сортировки):Modify() 1 for i2 for j: ij 3
После выполнения этого алгоритма для любых двух работ
, таких, что зависит от , выполняется , поэтому, при рассмотрении работ в порядке неубывания времен их появления, они также будут топологически отсортированы.Blocks
Здесь и далее считается, что работы отсортированы в порядке неубывания модифицированных
.Decompose
Идея следующая: допустим, у нас есть блок работ, который можно выполнить без прерываний. Найдем работу
, которую выгодно выполнить последней. Разобъем оставшееся множество работ на блоки, решим задачу для этих блоков рекурсивно и вставим в промежутки между этими блоками, до них и после них, начиная с .Общий алгоритм
Выполним Modify(), после чего разобъем все множество работ на блоки и для каждого блока запустим Decompose():
MakeSchedule() 1 Modify() 2 B = Blocks() 3 ans = - 4 for ( B): 5 ans = (ans, Decompose( )) 6 return ans
Время работы
Теорема: |
Время работы алгоритма MakeSchedule() — операций. |
Доказательство: |
Обозначим за время, необходимое для выполнения алгоритма MakeSchedule() на n работах. Очевидно, для корректно определенной функции P в силу структуры алгоритма должно выполняться неравенство:
Здесь - размер блока с номером , построенного алгоритмом Blocks(). Заметим, что .Если P(n) = an^2, то имеем:
Так как , то можно переписать неравенство в следующем виде:
Чтобы получить максимальную нижнюю оценку на , оценим снизу :Так как Значит, при требуемое неравенство будет выполняться. |