1pi=1wirisumwi(ci - pi -ri) — различия между версиями
Dimitrova (обсуждение | вклад) (→Доказательство корректности алгоритма) |
Dimitrova (обсуждение | вклад) (→Псевдокод) |
||
| Строка 33: | Строка 33: | ||
==Псевдокод== | ==Псевдокод== | ||
| + | <tex> S \leftarrow \{1 \dots n\}</tex> | ||
| + | <tex> time \leftarrow 0</tex> | ||
| + | <tex> answer \leftarrow 0</tex> | ||
| + | while <tex> S \neq \varnothing </tex> | ||
| + | <tex> j \leftarrow i : (\max \limits_{i \in S, r_{i} \leq time} w_{i})</tex> | ||
| + | if <tex>j \neq null </tex> | ||
| + | <tex> S \leftarrow S \setminus j</tex> | ||
| + | <tex> Answer \leftarrow Answer + (time - r_{j})w_{j}</tex> | ||
| + | <tex> time++</tex> | ||
| + | |||
| + | ==Сложность алгоритма== | ||
| + | Множество <tex>S</tex> станет пустым не позже, чем через <tex>n + \max r_{i}</tex> шагов цикла. Определить максимум в множестве можно за время <tex>O(\log n)</tex>, используя , например, очередь с приоритетами. Значит общее время работы алгоритма <tex>O((n + \max r_{i})\log n)</tex> | ||
Версия 22:25, 18 июня 2012
Содержание
Постановка задачи
Рассмотрим задачу:
- Дано работ и один станок.
- Для каждой работы известно её время появления и вес . Время выполнения всех работ равно .
Требуется выполнить все работы, чтобы значение было минимальным.
Описание алгоритма
Пусть — текущий момент времени.
Для каждого очередного значения , которое изменяется от до времени окончания последний работы, будем:
- Выбирать работу из множества невыполненных работ, у которой и значение максимально.
- Если мы смогли найти работу , то выполняем её в момент времени
- Увеличиваем на один.
Доказательство корректности алгоритма
| Теорема: |
Расписание, построенное данным алгоритмом, является корректным и оптимальным. |
| Доказательство: |
|
Доказательство будем вести от противного. Первая скобка отрицательная: . Вторая скобка тоже отрицательная из того, что в работа с весом выполняется раньше, значит её вес должен быть больше . |
Псевдокод
while if
Сложность алгоритма
Множество станет пустым не позже, чем через шагов цикла. Определить максимум в множестве можно за время , используя , например, очередь с приоритетами. Значит общее время работы алгоритма