Алгоритм Гопкрофта-Карпа: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Строка 29: Строка 29:
=== Описание схемы реализации последовательного алгоритма ===
=== Описание схемы реализации последовательного алгоритма ===
=== Последовательная сложность алгоритма ===
=== Последовательная сложность алгоритма ===
Алгоритм выполняет не более <math>O(\sqrt{n})</math> шагов, на каждом из которых производятся поиск в ширину и поиск в глубину сложностью <math>O(m)</math>. Таким образом, общая сложность составляет <math>O(m \sqrt{n})</math>.
=== Информационный граф ===
=== Информационный граф ===
=== Описание ресурса параллелизма алгоритма ===
=== Описание ресурса параллелизма алгоритма ===

Версия от 21:11, 24 июня 2015

Свойства и структура алгоритмов

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

Алгоритм Гопкрофта-Карпа[1] предназначен для решения задачи о назначениях в случае единичных цен. По заданному двудольному графу алгоритм находит максимальное паросочетание за время [math]\displaystyle{ O(m \sqrt{n}) }[/math].

Математическое описание

Граф [math]\displaystyle{ G = (V, E) }[/math] называется двудольным, если его вершины можно разделить на две части [math]\displaystyle{ V = X \sqcup Y }[/math], так что каждое ребро [math]\displaystyle{ e \in E }[/math] соединяет вершины из [math]\displaystyle{ X }[/math] и [math]\displaystyle{ Y }[/math]. Набор рёбер [math]\displaystyle{ M \subseteq E }[/math] называется паросочетанием, если каждая вершина [math]\displaystyle{ v \in V }[/math] принадлежит не более чем одному ребру из [math]\displaystyle{ M }[/math]. Требуется найти максимальное паросочетание – паросочетание с максимально возможным числом рёбер.

Вершина [math]\displaystyle{ v \in V }[/math] называется свободной, если она не принадлежит ни одному ребру из [math]\displaystyle{ M }[/math]. Простой путь

[math]\displaystyle{ P: e_1 = (v_1, v_2), e_2 = (v_2, v_3), \ldots, e_{2k-1} = (v_{2k-1}, v_{2k}) }[/math]

называется увеличивающей цепью, если его концы [math]\displaystyle{ v_1 }[/math] и [math]\displaystyle{ v_{2k} }[/math] – свободные вершины, а каждое второе ребро принадлежит текущему паросочетанию:

[math]\displaystyle{ e_2, e_4, \ldots, e_{2k-2} \in M. }[/math]

Паросочетание [math]\displaystyle{ M }[/math] является максимальным, если для него не существует увеличивающей цепи.

Множество [math]\displaystyle{ M' }[/math], полученное заменой в [math]\displaystyle{ M }[/math] рёбер [math]\displaystyle{ e_2, e_4, \ldots, e_{2k-2} }[/math] на рёбра [math]\displaystyle{ e_1, e_3, \ldots, e_{2k-1} }[/math], является паросочетанием и содержит на одно ребро больше, чем [math]\displaystyle{ M }[/math]. Множество [math]\displaystyle{ M' = M \mathop{\Delta} P }[/math], где [math]\displaystyle{ \mathop{\Delta} }[/math] обозначает операцию симметрической разности множеств.

На каждом шаге алгоритма Гопкрофта-Карпа строится максимальное по включению множество кратчайших увеличивающих цепей [math]\displaystyle{ \{ P_1, \ldots, P_q \} }[/math], не пересекающихся по вершинам, и текущее паросочетание [math]\displaystyle{ M }[/math] заменяется на [math]\displaystyle{ M = M \mathop{\Delta} P_1 \mathop{\Delta} P_2 \mathop{\Delta} \dots \mathop{\Delta} P_q }[/math]. Гарантируется, что число шагов не превышает [math]\displaystyle{ 2 (\sqrt{\mu} + 1) = O(\sqrt{n}) }[/math], где [math]\displaystyle{ \mu }[/math] – число рёбер максимального паросочетания.

Для поиска максимального множества кратчайших увеличивающих цепей применяется поиск в ширину с последующим поиском в глубину.

Вычислительное ядро алгоритма

Основная вычислительная сложность алгоритма приходится на операции поиска в ширину и поиска в глубину.

Макроструктура алгоритма

Описание схемы реализации последовательного алгоритма

Последовательная сложность алгоритма

Алгоритм выполняет не более [math]\displaystyle{ O(\sqrt{n}) }[/math] шагов, на каждом из которых производятся поиск в ширину и поиск в глубину сложностью [math]\displaystyle{ O(m) }[/math]. Таким образом, общая сложность составляет [math]\displaystyle{ O(m \sqrt{n}) }[/math].

Информационный граф

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

Описание входных и выходных данных

Свойства алгоритма

Программная реализация алгоритмов

Особенности реализации последовательного алгоритма

Описание локальности данных и вычислений

Возможные способы и особенности реализации параллельного алгоритма

Масштабируемость алгоритма и его реализации

Динамические характеристики и эффективность реализации алгоритма

Выводы для классов архитектур

Существующие реализации алгоритма

Литература

  1. ↑ 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.