Алгоритм Гопкрофта-Карпа
Содержание
- 1 Свойства и структура алгоритмов
- 1.1 Общее описание алгоритма
- 1.2 Математическое описание
- 1.3 Вычислительное ядро алгоритма
- 1.4 Макроструктура алгоритма
- 1.5 Описание схемы реализации последовательного алгоритма
- 1.6 Последовательная сложность алгоритма
- 1.7 Информационный граф
- 1.8 Описание ресурса параллелизма алгоритма
- 1.9 Описание входных и выходных данных
- 1.10 Свойства алгоритма
- 2 Программная реализация алгоритмов
- 2.1 Особенности реализации последовательного алгоритма
- 2.2 Описание локальности данных и вычислений
- 2.3 Возможные способы и особенности реализации параллельного алгоритма
- 2.4 Масштабируемость алгоритма и его реализации
- 2.5 Динамические характеристики и эффективность реализации алгоритма
- 2.6 Выводы для классов архитектур
- 2.7 Существующие реализации алгоритма
- 3 Литература
1 Свойства и структура алгоритмов
1.1 Общее описание алгоритма
Алгоритм Гопкрофта-Карпа[1] предназначен для решения задачи о назначениях в случае единичных цен. По заданному двудольному графу алгоритм находит максимальное паросочетание за время O(m \sqrt{n}).
1.2 Математическое описание
Граф G = (V, E) называется двудольным, если его вершины можно разделить на две части V = X \sqcup Y, так что каждое ребро e \in E соединяет вершины из X и Y. Набор рёбер M \subseteq E называется паросочетанием, если каждая вершина v \in V принадлежит не более чем одному ребру из M. Требуется найти максимальное паросочетание – паросочетание с максимально возможным числом рёбер.
Вершина v \in V называется свободной, если она не принадлежит ни одному ребру из M. Простой путь
- P: e_1 = (v_1, v_2), e_2 = (v_2, v_3), \ldots, e_{2k-1} = (v_{2k-1}, v_{2k})
называется увеличивающей цепью, если его концы v_1 и v_{2k} – свободные вершины, а каждое второе ребро принадлежит текущему паросочетанию:
- e_2, e_4, \ldots, e_{2k-2} \in M.
Паросочетание M является максимальным, если для него не существует увеличивающей цепи.
Множество M', полученное заменой в M рёбер e_2, e_4, \ldots, e_{2k-2} на рёбра e_1, e_3, \ldots, e_{2k-1}, является паросочетанием и содержит на одно ребро больше, чем M. Множество M' = M \mathop{\Delta} P, где \mathop{\Delta} обозначает операцию симметрической разности множеств.
На каждом шаге алгоритма Гопкрофта-Карпа строится максимальное по включению множество кратчайших увеличивающих цепей \{ P_1, \ldots, P_q \}, не пересекающихся по вершинам, и текущее паросочетание M заменяется на M = M \mathop{\Delta} P_1 \mathop{\Delta} P_2 \mathop{\Delta} \dots \mathop{\Delta} P_q. Гарантируется, что число шагов не превышает 2 (\sqrt{\mu} + 1) = O(\sqrt{n}), где \mu – число рёбер максимального паросочетания.
Для поиска максимального множества кратчайших увеличивающих цепей применяется поиск в ширину с последующим поиском в глубину.
1.3 Вычислительное ядро алгоритма
Основная вычислительная сложность алгоритма приходится на операции поиска в ширину и поиска в глубину.
1.4 Макроструктура алгоритма
- Выбрать начальное паросочетание M_0 (например, M_0 = \emptyset или паросочетание, полученное жадным алгоритмом).
- Вычислить максимальное по включение множество кратчайших увеличивающих цепей \{ P_1, \ldots, P_q \}, не пересекающихся по вершинам. Если улучшающих цепей не существует, остановиться: текущее паросочетание M_i является максимальным.
- Составить новое паросочетание M_{i + 1} = M_i \mathop{\Delta} P_1 \mathop{\Delta} P_2 \mathop{\Delta} \dots \mathop{\Delta} P_q и перейти к шагу 2.
1.5 Описание схемы реализации последовательного алгоритма
1.6 Последовательная сложность алгоритма
Алгоритм выполняет не более O(\sqrt{n}) шагов, на каждом из которых производятся поиск в ширину и поиск в глубину сложностью O(m). Таким образом, общая сложность составляет O(m \sqrt{n}).
1.7 Информационный граф
1.8 Описание ресурса параллелизма алгоритма
1.9 Описание входных и выходных данных
1.10 Свойства алгоритма
2 Программная реализация алгоритмов
2.1 Особенности реализации последовательного алгоритма
2.2 Описание локальности данных и вычислений
2.3 Возможные способы и особенности реализации параллельного алгоритма
2.4 Масштабируемость алгоритма и его реализации
2.5 Динамические характеристики и эффективность реализации алгоритма
2.6 Выводы для классов архитектур
2.7 Существующие реализации алгоритма
- Java: JGraphT (класс
HopcroftKarpBipartiteMatching
).
3 Литература
- ↑ Hopcroft, John E, and Richard M Karp. “An $N^{5/2} $ Algorithm for Maximum Matchings in Bipartite Graphs.” SIAM Journal on Computing 2, no. 4 (1973): 225–31. doi:10.1137/0202019.