F2Cmax — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Псевдокод)
(Сложность алгоритма)
Строка 44: Строка 44:
  
 
==Сложность алгоритма==
 
==Сложность алгоритма==
 +
Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за <tex>O(\log n)</tex> (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за <tex>O(\log n)</tex>). И делаем мы это <tex> n </tex> раз, следовательно алгоритм работает за <tex>O(n\log n)</tex>.
  
 
==Источники==
 
==Источники==

Версия 19:10, 10 июня 2013

Постановка задачи

Рассмотрим задачу:

  1. Дано [math]n[/math] работ и [math]2[/math] станка.
  2. Для каждой работы известно её время выполнения на каждом станке.
  3. Каждую работу необходимо выполнить сначала на первом станке, а потом на втором.

Требуется минимизировать время окончания всех работ.

Описание алгоритма

Пусть [math]p_{i1}[/math] — время выполнения [math]i[/math]-ой работы на первом станке, а [math]p_{i2}[/math] — на втором.

  1. Будем в ходе нашего алгоритма строить два списка [math] L [/math] и [math] R [/math]. Изначально оба списка пусты. И будем поддерживать множество еще не распределенных по спискам [math] L [/math] и [math] R [/math] работ [math]X = \{i \mid i = 1, \dots, n\}[/math]
  2. Пока множество [math] X [/math] непусто будем распределять работы по спискам следующим образом:
    • Находим такие индексы [math] i [/math] и [math] j [/math], что [math]p_{ij} = \min \{ p_{ij} \mid i \in X; j = 1, 2\}[/math]
    • Если минимум достигается на первом станке (иными словами [math] j = 1 [/math]), то поставим работу [math] i [/math] в конец листа [math] L [/math], иначе ставим в начало листа [math] R [/math]
    • Удаляем работу [math] i [/math] из множества [math] X [/math]
  3. Рассмотрим лист [math] T = L \circ R[/math]. Утверждается, что этот лист является оптимальной перестановкой работ как на первом, так и на втором станке. Далее расставляем подряд работы на первом станке согласно перестановке, после чего ставим в том же порядке работы на втором стане, при этом избегая одновременного выполнения одной и той же работы.

Доказательство корректности алгоритма

Псевдокод

  [math]L \leftarrow \varnothing [/math]
  [math]R \leftarrow \varnothing [/math]
  [math]X \leftarrow \{1, \dots, n\}[/math]
  while [math] X \neq \varnothing[/math]
     Найти [math] i [/math] и [math] j [/math], где [math]p_{ij} = \min \{ p_{ij}  \mid i \in X; j = 1, 2\}[/math]
     if j = 1
        [math]L \leftarrow L \circ i [/math]
     else 
        [math]R \leftarrow i \circ R [/math]
     [math]X \leftarrow X \setminus \{i\} [/math]
  [math]T \leftarrow L \circ R[/math]

  Расставляем работы на первом станке согласно перестановке [math] T [/math]
  
  Расставляем работы на втором станке согласно перестановке [math] T [/math]
  и времени начала соответсвующей работы на первом станке.

Сложность алгоритма

Заметим, что на каждом шаге алгоритма мы выбираем минимум из оставшихся элементов за [math]O(\log n)[/math] (либо предварительной сортировкой, либо любой структурой данных, поддеживающей нахождение минимума и удаление за [math]O(\log n)[/math]). И делаем мы это [math] n [/math] раз, следовательно алгоритм работает за [math]O(n\log n)[/math].

Источники

  • Peter Brucker. «Scheduling Algorithms» — «Springer», 2006 г. — 175 стр. — ISBN 978-3-540-69515-8