Задача присваивания: различия между версиями

Перейти к навигации Перейти к поиску
Строка 50: Строка 50:




Между S и <math>\bar{T}</math> не имеется ребер, поскольку в противном случае не было бы возможности полностью вырастить венгерские деревья. Поскольку венгерские деревья выращиваются в G^, альтернативные вершины в поиске помещаются в S и T. Для обновления меток следует взять метки из S и начать равномерно уменьшать их (скажем, на значение A), в то же время увеличивая метки в T на то же значение A. Этот подход гарантирует, что ребра, ведущие из S в T, не исчезнут из подграфа равенства (рис. 1).
Между S и <math>\bar{T}</math> не имеется ребер, поскольку в противном случае не было бы возможности полностью вырастить венгерские деревья. Поскольку венгерские деревья выращиваются в <math>G_{ \ell}\;</math>, альтернативные вершины в поиске помещаются в S и T. Для обновления меток следует взять метки из S и начать равномерно уменьшать их (скажем, на значение <math>\lambda \;</math>), в то же время увеличивая метки в T на то же значение <math>\lambda \;</math>. Этот подход гарантирует, что ребра, ведущие из S в T, не исчезнут из подграфа равенства (рис. 1).




Поскольку метки в S уменьшаются, ребра (в графе G), ведущие из S в <math>\bar{T}</math>, потенциально могут попасть в подграф равенства Gi. По мере увеличения значения A в какой-то момент ребро окажется в подграфе равенства. В этот момент процесс следует остановить и обновить венгерское дерево. Если вершина из <math>\bar{T}</math>, добавленная к T, сопоставлена с вершиной из <math>\bar{S}</math>, обе эти вершины перемещаются в S и T, что увеличивает размер венгерского дерева. Если вершина из <math>\bar{T}</math> свободна, то дополняющий путь найден и данный этап завершен. Этап состоит из таких шагов, выполненных между приращениями размера паросочетания. Поскольку в G всего n вершин, у алгоритма будет не более n этапов, поскольку на каждом этапе размер паросочетания увеличивается на 1. В рамках каждого этапа размер венгерского дерева увеличивается не более n раз. Очевидно, что за время <math>O(n^2) \;</math> можно обнаружить, какое ребро, ведущее из S в <math>\bar{T}</math>, первым войдет в подграф равенства (для этого нужно просто просмотреть все ребра). Общее время выполнения в таком случае составит <math>O(n^4) \;</math>. Теперь покажем, как реализовать это подход за время <math>O(n^3) \;</math>.
Поскольку метки в S уменьшаются, ребра (в графе G), ведущие из S в <math>\bar{T}</math>, потенциально могут попасть в подграф равенства <math>G_{ \ell}\;</math>. По мере увеличения значения <math>\lambda \;</math> в какой-то момент ребро окажется в подграфе равенства. В этот момент процесс следует остановить и обновить венгерское дерево. Если вершина из <math>\bar{T}</math>, добавленная к T, сопоставлена с вершиной из <math>\bar{S}</math>, обе эти вершины перемещаются в S и T, что увеличивает размер венгерского дерева. Если вершина из <math>\bar{T}</math> свободна, то дополняющий путь найден и данный этап завершен. Этап состоит из таких шагов, выполненных между приращениями размера паросочетания. Поскольку в G всего n вершин, у алгоритма будет не более n этапов, поскольку на каждом этапе размер паросочетания увеличивается на 1. В рамках каждого этапа размер венгерского дерева увеличивается не более n раз. Очевидно, что за время <math>O(n^2) \;</math> можно обнаружить, какое ребро, ведущее из S в <math>\bar{T}</math>, первым войдет в подграф равенства (для этого нужно просто просмотреть все ребра). Общее время выполнения в таком случае составит <math>O(n^4) \;</math>. Теперь покажем, как реализовать это подход за время <math>O(n^3) \;</math>.




[[Файл:Assgn.png]]
[[Файл:Assgn.png]]


Задача присваивания, рис. 1
Рис. 1. Множества S и T, поддерживаемые алгоритмом


Множества S и T, поддерживаемые алгоритмом


'''Более эффективная реализация'''


Более эффективная реализация
Определим ''провис ребра'' следующим образом:


Определим провис ребра следующим образом:
<math>slack(x, y) = \ell(x) + \ell(y) - w(x, y)</math>.
slack(x; y) = l(x) + l(y) - w(x; y) : Тогда
Я =    min  slack(x; y):
x2S;y2T


Тогда


Интуитивно кажется, что вычисление Я требует O(n2) времени. Для каждой вершины <math>y \in \bar{T} \;</math> отметим ребро с минимальным провисом, т.е.
<math>\lambda = min_{x \in S, y \in \bar{T}} \; slack(x, y)</math>.
slack[y] = min slack(x; y):
 
x2S
 
Интуитивно кажется, что вычисление <math>\lambda \;</math> требует <math>O(n^2) \;</math> времени. Для каждой вершины <math>y \in \bar{T} \;</math> отметим ребро с минимальным провисом, т.е.
 
<math>slack[y] = min_{x \in S} \; slack(x, y)</math>.




Строка 79: Строка 80:




Таким образом, каждый этап может быть реализован за время O(n2). Поскольку имеется n этапов, общее время выполнения составляет O(n3). Для разреженных графов есть способ реализации алгоритма с временем выполнения O(n(m + n log n)) с использованием min потоков минимальной стоимости [ ], где m – количество ребер.
Таким образом, каждый этап может быть реализован за время <math>O(n^2) \;</math>. Поскольку имеется n этапов, общее время выполнения составиет <math>O(n^3) \;</math>. Для разреженных графов есть способ реализации алгоритма с временем выполнения O(n(m + n log n)) с использованием потоков минимальной стоимости [1], где m – количество ребер.


== Применение ==
== Применение ==
4551

правка

Навигация