1ridipi1 — различия между версиями
Sofya (обсуждение | вклад) (→Источники информации) |
Sofya (обсуждение | вклад) (→Алгоритм) |
||
Строка 8: | Строка 8: | ||
Отсортируем работы по порядку их появления. | Отсортируем работы по порядку их появления. | ||
− | Алгоритм <tex>1 | r_{i}, d_{i}, p_{i}=1 | -</tex> | + | Алгоритм <tex>1 | r_{i}, d_{i}, p_{i}=1 | -</tex>: |
− | + | <tex>S = \varnothing;</tex> | |
− | + | <tex>j = 1;</tex> | |
− | + | <tex>time = 1;</tex> | |
− | + | '''for''' <tex> i = 1 </tex> '''to''' <tex> n </tex>: | |
− | + | '''if''' <tex>S == \varnothing</tex>: | |
− | + | <tex>time=r_{j}</tex> | |
− | + | '''while''' <tex>time==r_{j}</tex>: | |
− | + | <tex>S \leftarrow S \cup \{j\}</tex> | |
− | + | <tex>j = j + 1;</tex> | |
− | + | <tex>d_{k} = min\{d_{i}</tex> | <tex>i \in S\}</tex> | |
− | + | '''if''' <tex>d_{k} \le time</tex>: | |
− | + | Расписание составить невозможно | |
− | + | '''else''': | |
− | + | <tex>S \leftarrow S \setminus \{k\}</tex> | |
− | + | <tex>time = time + 1;</tex> | |
− | <tex> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | Сложность алгоритма <tex>O(n\log n)</tex> если в качестве <tex>S</tex> использовать структуру, которая позволяет поиск элемента с минимальным <tex>d_{i}</tex> за <tex>O(\log n)</tex>. | + | Сложность алгоритма <tex>O(n\log n)</tex> если в качестве <tex>S</tex> использовать структуру, которая позволяет поиск элемента с минимальным <tex>d_{i}</tex> за <tex>O(\log n)</tex>. |
==Доказательство корректности алгоритма== | ==Доказательство корректности алгоритма== |
Версия 20:47, 4 июня 2016
Содержание
Постановка задачи
Дан один станок на котором нужно выполнить
работ. Для каждой работы известны моменты времени, когда можно начинать её выполнять — и когда необходимо закончить её выполнение — . Время выполнения у всех работ одинаково и равно 1. Необходимо узнать, можно ли построить расписание, при котором все работы будут выполнены.Алгоритм
Идея алгоритма в том, чтобы из тех работ, которые уже можно выполнить, ставить в расписание ту, у которой наименьшее
. Если эта работа уже просрочена, значит хорошее расписание построить нельзя.Пусть
- множество ещё не включенных в расписание работ, к выполнению которых уже можно приступить. Изначально пустое. Отсортируем работы по порядку их появления.Алгоритм
:for to : if : while : | if : Расписание составить невозможно else:
Сложность алгоритма
если в качестве использовать структуру, которая позволяет поиск элемента с минимальным за .Доказательство корректности алгоритма
Пусть с помощью нашего алгоритма составить хорошее расписание не удалось. Докажем, что в этом случае хорошего расписания не существует. Заметим, что расписание состоит из непрерывных блоков, между которыми есть пропуски - все поступившие работы выполнены, а новых работ ещё не появилось. Расписание может состоять из одного блока.
Рассмотрим первый блок, для которого не получилось составить расписание. Возьмем в нём первую работу, для которой не нашлось места. Пусть её индекс будет
. Попробуем вставить эту работу в расписание. До блока её вставить нельзя, так как больше или равно времени начала блока. А в блоке нет пропусков, поэтому нужно поменять её с какой-то -ой, которая уже стоит в этом блоке расписания. У всех таких работ меньше или равно , так как в алгоритме мы каждый раз брали работу с минимальным . Но -ую работу нельзя выполнить после -ой. Значит -ую работу выполнить нельзя.Источники информации
- P. Brucker. Scheduling Algorithms (2006), 5th edition, стр. 200