Алгоритм Коффмана-Грэма — это алгоритм организации элементов частично упорядоченного множества в последовательность уровней. Алгоритм выбирает такое расположение, при котором элемент, следующий за другим в порядке, назначается более низкому уровню и такой, чтобы каждый уровень имел количество элементов, не превышающее фиксированную границу ширины W . Когда W = 2 , он использует минимально возможное количество различных уровней и, как правило, использует не более чем в 2–2/ W раз больше уровней, чем необходимо.
Он назван в честь Эдварда Г. Коффмана-младшего и Рональда Грэма , которые опубликовали его в 1972 году для применения в планировании рабочих мест . В этом приложении упорядочиваемыми элементами являются задания, ограничение W — это количество заданий, которые можно запланировать одновременно, а частичный порядок описывает обязательные отношения между заданиями. Цель состоит в том, чтобы найти расписание, при котором все задания выполняются за минимальное общее время. Впоследствии тот же алгоритм стал использоваться и при рисовании графов как способ размещения вершин ориентированного графа в слоях фиксированной ширины так, чтобы большинство или все ребра были направлены последовательно вниз.
Для частичного упорядочения, заданного его транзитивной редукцией (отношением покрытия), алгоритм Коффмана – Грэма может быть реализован за линейное время , используя структуру данных уточнения разделения в качестве подпрограммы. Если транзитивная редукция не задана, ее построение занимает полиномиальное время .
В версии задачи планирования цеха, решаемой алгоритмом Коффмана–Грэма, дается набор из n заданий J 1 , J 2 , ..., J n вместе с системой ограничений предшествования J i < J j требование, чтобы задание J i было завершено до начала задания J j . Предполагается, что выполнение каждой работы занимает единицу времени. Задача планирования состоит в том, чтобы назначить каждое из этих заданий временным интервалам в системе из W идентичных процессоров, минимизируя время выполнения назначения (время от начала первого задания до завершения последнего задания). Абстрактно, ограничения приоритета определяют частичный порядок заданий, поэтому проблему можно перефразировать как задачу присвоения элементов этого частичного порядка уровням (временным интервалам) таким образом, чтобы каждый временной интервал содержал не более процессоров (не более W элементов на уровень), соблюдая ограничения приоритета. Это приложение стало первоначальным стимулом для Коффмана и Грэма разработать свой алгоритм. [1] [2]
В структуре рисования многоуровневых графов , описанной Сугиямой, Тагавой и Тодой (1981) [3], входными данными является ориентированный граф , а рисунок графа строится в несколько этапов: [4] [5]
В этой структуре присвоение координаты y снова включает группировку элементов частично упорядоченного набора (вершины графа с упорядочением достижимости набора вершин) в слои (наборы вершин с одинаковой координатой y ), что задача, решаемая алгоритмом Коффмана–Грэма. [4] Хотя существуют альтернативные подходы к этапу наслоения, отличные от алгоритма Коффмана-Грэма, эти альтернативы, как правило, либо не могут включать ограничение на максимальную ширину уровня, либо полагаются на сложные процедуры целочисленного программирования . [6]
Более абстрактно, обе эти проблемы можно формализовать как задачу, в которой входные данные состоят из частично упорядоченного набора и целого числа W. Желаемый результат — это присвоение чисел целочисленного уровня элементам частично упорядоченного набора так, что, если x < y является упорядоченной парой связанных элементов частичного порядка, число, присвоенное x , меньше, чем число, присвоенное y. , так что не более чем W элементам присваиваются одинаковые номера, и минимизируется разница между наименьшим и наибольшим присвоенными номерами.
Алгоритм Коффмана – Грэма выполняет следующие шаги. [4]
Как первоначально доказали Коффман и Грэм (1972), их алгоритм вычисляет оптимальное назначение для W = 2 ; то есть для задач планирования задач единичной длины на двух процессорах или для задач рисования многослойных графов с не более чем двумя вершинами на слой. [1] Близко связанный алгоритм также находит оптимальное решение для планирования заданий различной длины, позволяя вытеснять запланированные задания на двух процессорах. [7] Для W > 2 алгоритм Коффмана–Грэма использует несколько уровней (или вычисляет расписание с интервалом выполнения), которое находится в пределах 2–2/ W от оптимального. [8] [9] Например, для W = 3 это означает, что он использует максимум в 4/3 раза больше уровней, чем оптимально. Когда частичный порядок ограничений предшествования является интервальным порядком или принадлежит нескольким связанным классам частичных порядков, алгоритм Коффмана – Грэма находит решение с минимальным количеством уровней независимо от его границы ширины. [10]
Алгоритм Коффмана-Грэма (модифицированный по сравнению с представленной здесь презентацией так, что он топологически упорядочивает обратный граф G и размещает вершины как можно раньше, а не как можно позже) не только позволяет находить расписания с небольшим интервалом выполнения, но и минимизирует общее время потока . двухпроцессорных расписаний — сумма времен завершения отдельных заданий. Соответствующий алгоритм можно использовать для минимизации общего времени потока для версии задачи, в которой разрешено вытеснение заданий. [11]
Коффман и Грэм (1972) и Ленстра и Риннуй Кан (1978) [12] утверждают, что временная сложность алгоритма Коффмана-Грэма в частичном порядке из n -элементов равна O ( n 2 ) . Однако в этом анализе не учитывается время на построение транзитивной редукции, которая, как известно, невозможна в пределах этой границы. Sethi (1976) показывает, как реализовать стадию топологического упорядочения алгоритма за линейное время , основываясь на идее уточнения разделов . [13] Сетхи также показывает, как эффективно реализовать этап назначения уровня алгоритма, используя структуру данных с непересекающимися наборами . В частности, в версии этой структуры, опубликованной позже Габоу и Тарджаном (1985), этот этап также занимает линейное время. [14]