Изменения

Перейти к: навигация, поиск

1p1sumu

1215 байт добавлено, 22:42, 8 июня 2016
м
Псевдокод
==Алгоритм==
Чтобы получить оптимальное расписание, будем строить максимальное множество <tex>S</tex> тех работ, которые успеют выполниться. Само расписание тогда будет состоять из всех работ из <tex>S</tex>, упорядоченных по неубыванию дедлайнов.
Будем добавлять в <tex>S</tex> работы в порядке неубывания значений <tex>d_j</tex>, если успеваем их выполнить.
'''function''' <tex>\mathrm{sequence}</tex>(<tex>d</tex>: '''int[]'''): '''int[]''' <tex>S = \varnothing</tex> <tex>time = 0</tex> '''for''' <tex> i = 1 </tex> '''to''' <tex>n</tex> '''do''' <tex>d[i] Описание алгоритма== \min\{d[i], n\}</tex> Сортиуем d подсчетом '''for''' <tex> i = 1 </tex> '''to''' <tex>n</tex> '''do''' '''if''' <tex>time < d[i]</tex> Чтобы получить оптимальное расписание, будем строить максимальное множество <tex>S = S \cup \{ i \}</tex> <tex>time</tex> <code>+=</code> <tex>1</tex> '''return''' тех работ, которые успеют выполниться. Само расписание тогда будет состоять из всех работ из <tex>S</tex> Cортировку работ , упорядоченных по неубыванию дедлайнов осуществляем с помощью сортировки подсчетом за <tex>O(n)</tex>, а значит и весь алгоритм будет работать за <tex>O(n)</tex>. Во время сортировки стоит учитывать, что дедлайны могут значительно превосходить количество задач. В таком случае необходимо предварительно пересчитать дедлайны по формуле <tex>d_i = \min\{d_i, n\}</tex> (в оптимальном расписании мы не выполняем все работы позже до времени <tex>ttime=n</tex>). Для упорядочивания дедлайнов будем использовать [[Карманная сортировка|карманную сортировку]].
===Псевдокод=== '''function''' schedule(d: '''int[n]'''): '''list<int>''' '''list<int>''' S = <tex>\varnothing</tex> '''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 <tex>\cup</tex> {i} time += 1 '''return''' S Во избежание лишнего копирования массивов, мы можем делать проход по массиву блоков (bucket'ов) и для каждого блока проходить по спискам работ внутри него. Начальное значение <tex> time = 0</tex>. После рассмотрения очередной работы мы будем добавлять ее в расписание и увеличивать <tex> time</tex> на <tex>1</tex>. Тогда, если значение <tex> time</tex> становится равным номеру блока, то мы переходим к следующему блоку, а нерассмотренные задачи помечаем как просроченные и выполняем в конце. Работы с <tex>d_i = 0</tex> заранее отметим как просроченные. ===Время работы===Cортировку работ по неубыванию дедлайнов осуществляем с помощью карманной сортировки за <tex>O(n)</tex>, а значит и весь алгоритм будет работать за <tex>O(n)</tex>.  ===Корректность и оптимальность===В результате выполнения данного алгоритма будет получено корректное расписание, в котором каждая работа встречается не более одного раза. Вначале расписания будут стоять все работы, которые мы успеваем выполнить до дедлайна. Остальные работы дописываются в конец в произвольном порядке.  Оптимальность полученного расписания доказывается аналогично [[1sumwu|<tex>1 \mid \mid \sum w_{i}U_{i}</tex>]].
== См. также ==

Навигация