Алгоритм Хопкрофта – Карпа
Сорт | Алгоритм графа |
---|---|
Структура данных | График |
Худшая производительность | |
Наихудшая пространственная сложность |
В информатике — алгоритм Хопкрофта-Карпа (иногда точнее называемый алгоритмом Хопкрофта-Карпа-Карзанова ). [1] — это алгоритм , который принимает на вход двудольный граф и на выходе создает сопоставление максимальной мощности — набор из максимально возможного количества ребер со свойством, что никакие два ребра не имеют общей конечной точки. Он работает в время в худшем случае , где множество ребер в графе, – множество вершин графа, и предполагается, что . В случае плотных графов временная граница становится , а для разреженных случайных графов он выполняется за время с высокой вероятностью. [2]
Алгоритм был открыт Джоном Хопкрофтом и Ричардом Карпом ( 1973 ) и независимо Александром Карзановым ( 1973 ). [3] Как и в предыдущих методах сопоставления, таких как венгерский алгоритм и работа Эдмондса (1965) , алгоритм Хопкрофта-Карпа многократно увеличивает размер частичного сопоставления путем поиска дополнительных путей . Эти пути представляют собой последовательности ребер графа, которые чередуются между ребрами в совпадении и ребрами вне частичного совпадения, и где начальное и последнее ребро не входят в частичное совпадение. Нахождение дополняющего пути позволяет нам увеличивать размер частичного совпадения, просто переключая края дополняющего пути (вставляя в частичное совпадение те, которых не было, и наоборот). Более простые алгоритмы двустороннего сопоставления, такие как алгоритм Форда – Фулкерсона , находят один дополняющий путь за итерацию: вместо этого алгоритм Хопкрофта-Карпа находит максимальный набор кратчайших дополняющих путей, чтобы гарантировать, что только необходимы итерации вместо итерации. То же исполнение может быть достигнуто для поиска паросочетаний максимальной мощности в произвольных графах с помощью более сложного алгоритма Микали и Вазирани. [4]
Алгоритм Хопкрофта-Карпа можно рассматривать как частный случай алгоритма Диника для задачи максимального потока . [5]
Расширение путей
[ редактировать ]Вершина, которая не является конечной точкой ребра в некотором частичном сопоставлении. называется свободной вершиной . Основная концепция, на которую опирается алгоритм, — это дополняющий путь , путь, который начинается в свободной вершине, заканчивается в свободной вершине и чередуется между несовпадающими и совпадающими ребрами внутри пути. Из этого определения следует, что, за исключением конечных точек, все остальные вершины (если они есть) в увеличивающем пути должны быть несвободными вершинами. Дополняющий путь может состоять только из двух вершин (обе свободных) и одного несовпадающего ребра между ними.
Если является соответствием, и является увеличивающим путем относительно , то симметричная разность двух наборов ребер, , будет формировать соответствие с размером . Таким образом, находя дополнительные пути, алгоритм может увеличить размер сопоставления.
Обратно, предположим, что сопоставление не является оптимальным, и пусть быть симметричной разностью где является оптимальным соответствием. Потому что и оба паросочетания, каждая вершина имеет степень не выше 2 в . Так должен образовывать набор непересекающихся циклов путей с равным количеством совпадающих и несовпадающих ребер в , расширения путей для и расширения путей для ; но последнее невозможно, потому что является оптимальным. Теперь циклы и пути с равным количеством совпадающих и несовпадающих вершин не влияют на разницу в размерах между и , поэтому эта разница равна числу дополняющих путей для в . Таким образом, всякий раз, когда существует соответствие больше, чем текущее соответствие , также должен существовать дополняющий путь. Если дополняющий путь не найден, алгоритм может безопасно завершиться, поскольку в этом случае должно быть оптимальным.
Увеличивающий путь в задаче сопоставления тесно связан с увеличивающими путями, возникающими в задачах о максимальном потоке , путями, по которым можно увеличить величину потока между терминалами потока. Можно преобразовать задачу двустороннего сопоставления в экземпляр максимального потока, так что чередующиеся пути задачи сопоставления становятся дополнительными путями задачи потока. Достаточно вставить две вершины, исток и сток, и вставить ребра единичной емкости из истока в каждую вершину в , и из каждой вершины в в раковину; и пусть края из к имеют единичную мощность. [6] Обобщение метода, используемого в алгоритме Хопкрофта-Карпа для поиска максимального потока в произвольной сети, известно как алгоритм Диника .
Алгоритм
[ редактировать ]Алгоритм может быть выражен в следующем псевдокоде .
- Входные данные : двудольный граф.
- Выход : Сопоставление
- повторить
- максимальный набор вершинно-непересекающихся кратчайших дополняющих путей
- до
Подробнее позвольте и быть двумя множествами в двуразделении , и пусть сопоставление из к в любой момент быть представлено в виде множества . Алгоритм выполняется поэтапно. Каждый этап состоит из следующих шагов.
- Поиск в ширину разбивает вершины графа на слои. Свободные вершины в используются в качестве начальных вершин этого поиска и образуют первый уровень разбиения. На первом уровне поиска имеются только несовпадающие ребра, так как свободные вершины в по определению не смежны ни с одним совпадающим ребром. На последующих уровнях поиска пройденные ребра должны чередоваться совпадающими и несовпадающими. То есть при поиске наследников вершины в , можно проходить только несовпадающие ребра, а из вершины в можно пересекать только совпадающие края. Поиск завершается на первом уровне где одна или несколько свободных вершин в достигаются.
- Все свободные вершины в на слое собраны в комплект . То есть вершина помещается в тогда и только тогда, когда он заканчивает кратчайший увеличивающий путь.
- Алгоритм находит максимальный набор непересекающихся вершин, увеличивающих пути длины . ( Максимальный означает, что больше таких путей добавлять нельзя. Это отличается от поиска максимального числа таких путей, что было бы сложнее сделать. К счастью, здесь достаточно найти максимальный набор путей.) Этот набор может быть вычисляется методом поиска в глубину (DFS) из к свободным вершинам в , используя для поиска слои по ширине: DFS разрешено следовать только по ребрам, которые ведут к неиспользуемой вершине на предыдущем уровне, а пути в дереве DFS должны чередоваться между совпадающими и несовпадающими рёбрами. Как только будет найден увеличивающий путь, включающий одну из вершин , DFS продолжается со следующей начальной вершины. Любую вершину, встреченную во время DFS, можно сразу пометить как использованную, так как при отсутствии пути от нее к в текущей точке DFS, то эту вершину нельзя использовать для достижения в любой другой точке DFS. Это обеспечивает время работы DFS. Возможна работа и в другом направлении, от свободных вершин в тем, кто в , который является вариантом, используемым в псевдокоде.
- Каждый из найденных таким образом путей используется для увеличения .
Алгоритм завершает работу, когда в части поиска в ширину одной из фаз больше не найдено дополнительных путей.
Анализ
[ редактировать ]Каждая фаза состоит из одного поиска в ширину и одного поиска в глубину. Таким образом, одна фаза может быть реализована в время. Поэтому первый фазы, на графике с вершины и края, нужно время .
Каждая фаза увеличивает длину кратчайшего увеличивающего пути как минимум на один: фаза находит максимальный набор дополнительных путей заданной длины, поэтому любой оставшийся увеличивающий путь должен быть длиннее. Поэтому, как только начальный фазы алгоритма завершены, кратчайший оставшийся увеличивающий путь имеет по крайней мере края в нем. Однако симметричная разница окончательного оптимального сопоставления и частичного сопоставления M, найденного на начальных этапах, образует набор непересекающихся по вершинам дополняющих путей и чередующихся циклов. Если каждый из путей в этой коллекции имеет длину не менее , может быть максимум путей в коллекции, а размер оптимального соответствия может отличаться от размера максимум края. Поскольку каждая фаза алгоритма увеличивает размер паросочетания как минимум на один, может быть не более дополнительные этапы перед завершением работы алгоритма.
Поскольку алгоритм выполняет в общей сложности не более фаз, общее время занимает в худшем случае.
Однако во многих случаях время, затрачиваемое алгоритмом, может быть даже быстрее, чем показывает анализ наихудшего случая. Например, в среднем случае для разреженных двудольных случайных графов Баст и др. (2006) (улучшив предыдущий результат Мотвани 1994 ) показали, что с высокой вероятностью все неоптимальные сопоставления имеют увеличивающиеся пути логарифмической длины. Как следствие, для этих графов алгоритм Хопкрофта–Карпа принимает фазы и общее время.
Сравнение с другими алгоритмами двустороннего сопоставления
[ редактировать ]Для разреженных графов алгоритм Хопкрофта-Карпа продолжает иметь наилучшую известную производительность в наихудшем случае, но для плотных графов ( ) более поздний алгоритм Alt et al. (1991) достигают немного лучших временных ограничений: . Их алгоритм основан на использовании алгоритма максимального потока push-relabel с последующим переключением на метод Хопкрофта-Карпа, когда сопоставление, созданное этим алгоритмом, становится близким к оптимальному.
Несколько авторов провели экспериментальное сравнение алгоритмов двустороннего сопоставления. Их результаты в целом показывают, что метод Хопкрофта-Карпа на практике не так хорош, как в теории: его превосходят как более простые стратегии поиска расширяющих путей, ориентированные на ширину и глубину, так и методы push-relabel. . [7]
Недвудольные графы
[ редактировать ]Та же идея поиска максимального набора кратчайших дополняющих путей работает и для поиска паросочетаний максимальной мощности в недвудольных графах, и по тем же причинам алгоритмы, основанные на этой идее, принимают фазы. Однако для недвудольных графов задача поиска дополнительных путей внутри каждой фазы более сложна. Опираясь на работу нескольких более медленных предшественников, Микали и Вазирани (1980) показали, как реализовать фазу в линейном времени, в результате чего был получен недвудольный алгоритм сопоставления с той же временной привязкой, что и алгоритм Хопкрофта-Карпа для двудольных графов. Методика Микали-Вазирани сложна, и ее авторы не предоставили полных доказательств своих результатов; впоследствии, «ясное изложение» было опубликовано Петерсоном и Луи (1988) , а альтернативные методы были описаны другими авторами. [8] В 2012 году Вазирани предложил новое упрощенное доказательство алгоритма Микали-Вазирани. [9]
Псевдокод
[ редактировать ]/* G = U ∪ V ∪ {NIL} where U and V are the left and right sides of the bipartite graph and NIL is a special null vertex */ function BFS() is for each u in U do if Pair_U[u] = NIL then Dist[u] := 0 Enqueue(Q, u) else Dist[u] := ∞ Dist[NIL] := ∞ while Empty(Q) = false do u := Dequeue(Q) if Dist[u] < Dist[NIL] then for each v in Adj[u] do if Dist[Pair_V[v]] = ∞ then Dist[Pair_V[v]] := Dist[u] + 1 Enqueue(Q, Pair_V[v]) return Dist[NIL] ≠ ∞ function DFS(u) is if u ≠ NIL then for each v in Adj[u] do if Dist[Pair_V[v]] = Dist[u] + 1 then if DFS(Pair_V[v]) = true then Pair_V[v] := u Pair_U[u] := v return true Dist[u] := ∞ return false return true function Hopcroft–Karp is for each u in U do Pair_U[u] := NIL for each v in V do Pair_V[v] := NIL matching := 0 while BFS() = true do for each u in U do if Pair_U[u] = NIL then if DFS(u) = true then matching := matching + 1 return matching
Объяснение
[ редактировать ]Пусть вершины нашего графа разделены на U и V и рассмотрим частичное совпадение, как указано в таблицах Pair_U и Pair_V, которые содержат одну вершину, которой соответствует каждая вершина U и V, или NIL для несовпадающих вершин. Основная идея состоит в том, чтобы добавить две фиктивные вершины на каждой стороне графа: uDummy, соединенный со всеми несовпадающими вершинами в U, и vDummy, соединенный со всеми несовпадающими вершинами в V. Теперь, если мы запустим поиск в ширину (BFS) от uDummy до vDummy, то мы можем получить пути минимальной длины, которые соединяют несовпадающие в данный момент вершины в U с несовпадающими в данный момент вершинами в V. Обратите внимание, что, поскольку граф двудольный, эти пути всегда чередуются между вершинами в U и вершинами в V, и нам требуется в Наш BFS заключается в том, что при переходе от V к U мы всегда выбираем совпадающее ребро. Если мы достигнем несовпадающей вершины V, то мы закончим на vDummy и поиск путей в BFS прекратится. Подводя итог, BFS начинается с несовпадающих вершин в U, переходит ко всем их соседям в V, если все совпадают, то возвращается к вершинам в U, которым соответствуют все эти вершины (и которые ранее не посещались), затем он обращается ко всем соседям этих вершин и т. д., пока одна из вершин, достигнутых в V, не станет несоответствующей.
Обратите внимание, в частности, что BFS помечает несовпадающие узлы U расстоянием 0, а затем увеличивает расстояние каждый раз, когда возвращается в U. Это гарантирует, что пути, рассматриваемые в BFS, имеют минимальную длину для соединения несовпадающих вершин U с несовпадающими вершинами U. V, всегда возвращаясь от V к U на ребрах, которые в данный момент являются частью сопоставления. В частности, специальной NIL-вершине, соответствующей vDummy, затем присваивается конечное расстояние, поэтому функция BFS возвращает true, если какой-то путь был найден. Если путь не найден, значит, дополнительных путей не осталось и совпадение максимально.
Если BFS возвращает true, то мы можем продолжить и обновить пары вершин на путях минимальной длины, найденных от U до V: мы делаем это, используя поиск в глубину (DFS). Обратите внимание, что каждая вершина в V на таком пути, кроме последней, в данный момент сопоставлена. Таким образом, мы можем исследовать с помощью DFS, убедившись, что пути, по которым мы следуем, соответствуют расстояниям, вычисленным в BFS. Мы обновляем вдоль каждого такого пути, удаляя из сопоставления все ребра пути, которые в данный момент находятся в сопоставлении, и добавляя к сопоставлению все ребра пути, которые в данный момент не находятся в сопоставлении: поскольку это дополняющий путь (первый и последние ребра пути не были частью сопоставления, и путь чередовался между совпадающими и несовпадающими ребрами), то это увеличивает количество ребер в сопоставлении. Это то же самое, что заменить текущее сопоставление симметричной разницей между текущим сопоставлением и всем путем.
Обратите внимание, что код гарантирует, что все дополняющие пути, которые мы рассматриваем, не пересекаются по вершинам. Действительно, после выполнения симметричного различия пути ни одна из его вершин не может быть снова рассмотрена в DFS только потому, что Dist[Pair_V[v]] не будет равен Dist[u] + 1 (это будет именно Dist [у]).
Также обратите внимание, что DFS не посещает одну и ту же вершину несколько раз. Это благодаря следующим строкам:
Dist[u] = ∞ return false
Когда нам не удалось найти кратчайший увеличивающий путь из вершины u, DFS помечает вершину u, устанавливая Dist[u] на бесконечность, чтобы эти вершины больше не посещались.
И последнее наблюдение: на самом деле нам не нужен uDummy: его роль состоит в том, чтобы просто поместить все несовпадающие вершины U в очередь при запуске BFS. Что касается vDummy, то в приведенном выше псевдокоде он обозначен как NIL.
См. также
[ редактировать ]- Сопоставление максимальной мощности , задача, решаемая алгоритмом, и ее обобщение на недвудольные графы
- Проблема назначения , обобщение этой проблемы на взвешенных графах , решаемая, например, венгерским алгоритмом.
- Алгоритм Эдмондса-Карпа для поиска максимального потока, обобщение алгоритма Хопкрофта-Карпа.
Примечания
[ редактировать ]- ^ Старый (2017) ; Аннамалай (2018)
- ^ Баст и др. (2006) .
- ^ Диниц (2006) .
- ^ Петерсон и Луи (1988) .
- ^ Тарьян (1983) , стр. 102.
- ^ Ахуджа, Маньянти и Орлин (1993) , раздел 12.3, проблема сопоставления двудольной мощности, стр. 469–470.
- ^ Чанг и Маккормик (1990) ; Дарби-Доуман (1980) ; Сетубал (1993) ; Сетубал (1996) .
- ^ Старый и Тарьян (1991) .
- ^ Министр (2012)
Ссылки
[ редактировать ]- Ахуджа, Равиндра К .; Маньянти, Томас Л .; Орлин, Джеймс Б. (1993), Сетевые потоки: теория, алгоритмы и приложения , Прентис-Холл .
- Альт, Х.; Блюм, Н.; Мельхорн, К. ; Пол, М. (1991), «Вычисление соответствия максимальной мощности в двудольном графе во времени». ", Information Processing Letters , 37 (4): 237–240, doi : 10.1016/0020-0190(91)90195-N .
- Аннамалай, Чидамбарам (2018), «Нахождение идеальных паросочетаний в двудольных гиперграфах», Combinatorica , 38 (6): 1285–1307, arXiv : 1509.07007 , doi : 10.1007/s00493-017-3567-2 , MR 3910876 , S2CID 199 7334
- Баст, Хольгер; Мельхорн, Курт; Шефер, Гвидо; Тамаки, Хисао (2006), «Алгоритмы сопоставления быстры в разреженных случайных графах», Theory of Computing Systems , 39 (1): 3–14, CiteSeerX 10.1.1.395.6643 , doi : 10.1007/s00224-005-1254-y , МР 2189556 , S2CID 9321036
- Чанг, С. Франк; Маккормик, С. Томас (1990), Более быстрая реализация алгоритма двустороннего сопоставления мощности , Tech. Представитель 90-MSC-005, Факультет коммерции и делового администрирования, Univ. Британской Колумбии . Цитируется Сетубалом (1996) .
- Дарби-Доуман, Кеннет (1980), Использование разреженности в крупномасштабных задачах линейного программирования - Структуры данных и алгоритмы реструктуризации , доктор философии. диссертация, Университет Брюнеля . Цитируется Сетубалом (1996) .
- Диниц, Ефим (2006), «Алгоритм Диница: оригинальная версия и версия Эвена», в Goldreich, Oded ; Розенберг, Арнольд Л .; Селман, Алан Л. (ред.), Теоретическая информатика: очерки памяти Шимона Эвена (PDF) , Конспекты лекций по информатике, том. 3895, Берлин и Гейдельберг: Springer, стр. 218–240, doi : 10.1007/11685654_10 , ISBN. 978-3-540-32880-3 .
- Эдмондс, Джек (1965), «Пути, деревья и цветы», Canadian Journal of Mathematics , 17 : 449–467, doi : 10.4153/CJM-1965-045-4 , MR 0177907 , S2CID 18909734 .
- Габоу, Гарольд Н. (2017), «Подход к взвешенному сопоставлению для сопоставления максимальной мощности», Fundamenta Informaticae , 154 (1–4): 109–130, arXiv : 1703.03998 , doi : 10.3233/FI-2017-1555 , MR 3690573 , S2CID 386509
- Габоу, Гарольд Н .; Тарьян, Роберт Э. (1991), «Алгоритмы более быстрого масштабирования для общих задач сопоставления графов», Journal of the ACM , 38 (4): 815–853, doi : 10.1145/115234.115366 , S2CID 18350108 .
- Хопкрофт, Джон Э .; Карп, Ричард М. (1973), «Ан н 5/2 Алгоритм максимальных паросочетаний в двудольных графах», SIAM Journal on Computing , 2 (4): 225–231, doi : 10.1137/0202019 . Ранее было объявлено на 12-м ежегодном симпозиуме по теории коммутации и автоматов, 1971 г.
- Карзанов А.В. (1973), "Точная оценка алгоритма нахождения максимального потока применительно к задаче о представителях", Проблемы кибернетики , 5 : 66–70 . Ранее анонсировано на семинаре по комбинаторной математике (Москва, 1971 г.).
- Микали, С .; Вазирани, В.В. (1980), «Ан Алгоритм поиска максимального соответствия в общих графах», Proc. 21st IEEE Symp. Foundations of Computer Science , стр. 17–27, doi : 10.1109/SFCS.1980.12 , S2CID 27467816 .
- Петерсон, Пол А.; Луи, Майкл К. (ноябрь 1988 г.), «Общий алгоритм максимального соответствия Микали и ( 1–4 ) : 511–533 CiteSeerX , , » Algorithmica 3 Вазирани , -0541 , S2CID 16820 .
- Мотвани, Раджив (1994), «Анализ алгоритмов сопоставления и связанных с ними задач в среднем», Journal of the ACM , 41 (6): 1329–1356, doi : 10.1145/195613.195663 , S2CID 2968208 .
- Сетубал, Жоао К. (1993), «Новые экспериментальные результаты двустороннего соответствия», Proc. Netflow93 , отд. информатики, унив. Пизы, стр. 211–216 . Цитируется Сетубалом (1996) .
- Сетубал, Жоао К. (1996), Последовательные и параллельные экспериментальные результаты с алгоритмами двустороннего сопоставления , Tech. Реп. ИК-96-09, Инт. вычислительной техники, Univ. Кампинас, CiteSeerX 10.1.1.48.3539 .
- Тарьян, Роберт Эндре (1983). Структуры данных и сетевые алгоритмы . Серия региональных конференций CBMS-NSF по прикладной математике. Общество промышленной и прикладной математики. дои : 10.1137/1.9781611970265 . ISBN 978-0-89871-187-5 .
- Вазирани, Виджай (2012), Улучшенное определение цветков и более простое доказательство алгоритма сопоставления MV , CoRR abs/1210.4594, arXiv : 1210.4594 , Bibcode : 2012arXiv1210.4594V .