1p1sumu — различия между версиями
Веда (обсуждение | вклад) |
Shersh (обсуждение | вклад) м (→Псевдокод) |
||
| Строка 10: | Строка 10: | ||
===Псевдокод=== | ===Псевдокод=== | ||
| − | schedule(d: '''int[n]'''): '''int[]''' | + | '''function''' schedule(d: '''int[n]'''): '''int[]''' |
'''int[]''' S = [] | '''int[]''' S = [] | ||
'''int''' time = 0 | '''int''' time = 0 | ||
Версия 22:24, 8 июня 2016
| Задача: |
| Дан один станок и работ, для которых заданы их дедлайны , а все времена выполнения на этом станке . Нужно успеть выполнить как можно больше работ. |
Содержание
Алгоритм
Чтобы получить оптимальное расписание, будем строить максимальное множество тех работ, которые успеют выполниться. Само расписание тогда будет состоять из всех работ из , упорядоченных по неубыванию дедлайнов. Во время сортировки стоит учитывать, что дедлайны могут значительно превосходить количество задач. В таком случае необходимо предварительно пересчитать дедлайны по формуле (в оптимальном расписании мы не выполняем работы позже времени ). Для упорядочивания дедлайнов будем использовать карманную сортировку(bucket sort).
Псевдокод
function schedule(d: int[n]): int[]
int[] S = []
int 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
Во избежание лишнего копирования массивов, мы можем делать проход по массиву блоков(bucket'ов) и для каждого блока проходить по спискам работ внутри него. Начальное значение . После рассмотрения очередной работы мы будем добавлять ее в расписание и увеличивать на 1. Тогда, если значение становится равным номеру блока, то мы переходим к следующему блоку, а нерассмотренные задачи помечаем как просроченные и выполняем в конце.
Время работы
Cортировку работ по неубыванию дедлайнов осуществляем с помощью карманной сортировки за , а значит и весь алгоритм будет работать за .
Корректность и оптимальность
В результате выполнения данного алгоритма будет получено корректное расписание, в котором каждая работа встречается не более одного раза. Вначале расписания будут стоять все работы, которые мы успеваем выполнить до дедлайна. Остальные работы дописываются в конец в произвольном порядке.
Оптимальность полученного расписания доказывается аналогично .
См. также
Источники информации
- Peter Brucker. «Scheduling Algorithms» — «Springer», 2006 г. — 86 стр. — ISBN 978-3-540-69515-8