1p1sumu — различия между версиями
Веда (обсуждение | вклад) (→Алгоритм) |
Веда (обсуждение | вклад) (→Алгоритм) |
||
| Строка 10: | Строка 10: | ||
Будем добавлять в <tex>S</tex> работы в порядке неубывания значений <tex>d_j</tex>, если успеваем их выполнить. | Будем добавлять в <tex>S</tex> работы в порядке неубывания значений <tex>d_j</tex>, если успеваем их выполнить. | ||
| − | '''function''' | + | ==Псевдокод== |
| + | '''function''' schedule(d: '''int[n]'''): '''int[]''' | ||
S = <tex>\varnothing</tex> | S = <tex>\varnothing</tex> | ||
time = 0 | time = 0 | ||
'''for''' i = 1 '''to''' n '''do''' | '''for''' i = 1 '''to''' n '''do''' | ||
| − | d[i] = min | + | d[i] = min(d[i], n) |
Сортиуем d подсчетом | Сортиуем d подсчетом | ||
'''for''' i = 1 '''to''' n '''do''' | '''for''' i = 1 '''to''' n '''do''' | ||
| Строка 21: | Строка 22: | ||
time <code>+=</code> 1 | time <code>+=</code> 1 | ||
'''return''' S | '''return''' S | ||
| − | + | ||
| + | ==Время работы== | ||
Cортировку работ по неубыванию дедлайнов осуществляем с помощью сортировки подсчетом за <tex>O(n)</tex>, а значит и весь алгоритм будет работать за <tex>O(n)</tex>. | Cортировку работ по неубыванию дедлайнов осуществляем с помощью сортировки подсчетом за <tex>O(n)</tex>, а значит и весь алгоритм будет работать за <tex>O(n)</tex>. | ||
| − | Во время сортировки стоит учитывать, что дедлайны могут значительно превосходить количество задач. В таком случае необходимо предварительно пересчитать дедлайны по формуле <tex>d_i = \min\{d_i, n\}</tex> (в оптимальном расписании мы не выполняем работы позже времени <tex> | + | Во время сортировки стоит учитывать, что дедлайны могут значительно превосходить количество задач. В таком случае необходимо предварительно пересчитать дедлайны по формуле <tex>d_i = \min\{d_i, n\}</tex> (в оптимальном расписании мы не выполняем работы позже времени <tex>time=n</tex>). |
| + | ==Корректность и оптимальность== | ||
В результате выполнения данного алгоритма будет получено корректное расписание, в котором каждая работа встречается не более одного раза. Оптимальность полученного расписания доказывается аналогично [[1sumwu|<tex>1 \mid \mid \sum w_{i}U_{i}</tex>]]. | В результате выполнения данного алгоритма будет получено корректное расписание, в котором каждая работа встречается не более одного раза. Оптимальность полученного расписания доказывается аналогично [[1sumwu|<tex>1 \mid \mid \sum w_{i}U_{i}</tex>]]. | ||
Версия 21:04, 8 июня 2016
| Задача: |
| Дан один станок и работ, для которых заданы их дедлайны , а все времена выполнения на этом станке . Нужно успеть выполнить как можно больше работ. |
Содержание
Алгоритм
Чтобы получить оптимальное расписание, будем строить максимальное множество тех работ, которые успеют выполниться. Само расписание тогда будет состоять из всех работ из , упорядоченных по неубыванию дедлайнов. Будем добавлять в работы в порядке неубывания значений , если успеваем их выполнить.
Псевдокод
function schedule(d: int[n]): int[]
S =
time = 0
for i = 1 to n do
d[i] = min(d[i], n)
Сортиуем d подсчетом
for i = 1 to n do
if time < d[i]
S = S {i}
time += 1
return S
Время работы
Cортировку работ по неубыванию дедлайнов осуществляем с помощью сортировки подсчетом за , а значит и весь алгоритм будет работать за . Во время сортировки стоит учитывать, что дедлайны могут значительно превосходить количество задач. В таком случае необходимо предварительно пересчитать дедлайны по формуле (в оптимальном расписании мы не выполняем работы позже времени ).
Корректность и оптимальность
В результате выполнения данного алгоритма будет получено корректное расписание, в котором каждая работа встречается не более одного раза. Оптимальность полученного расписания доказывается аналогично .
См. также
Источники информации
- Peter Brucker. «Scheduling Algorithms» — «Springer», 2006 г. — 86 стр. — ISBN 978-3-540-69515-8