Идея алгоритма основана на
стягивании ребра
в неориентированном графе. Во время стягивания ребра происходит объединение двух вершин в одну, что уменьшает количество вершин графа на единицу. Все рёбра стягиваемых вершин соединяются со вновь образованной вершиной, порождая
мультиграф
. Алгоритм Каргера итеративно выбирает случайные рёбра и выполняет операцию до тех пор, пока не останется две вершины, которые и представляют собой разрез изначального графа. Если повторять алгоритм достаточное количество раз, то с высокой вероятностью может быть найден минимальный разрез.
Содержание
Описание
Примеры
Основной задачей является поиск
узких мест
в различных сетях. Примеры:
Основной операцией алгоритма Каргера является одна из форм
стягивания ребра
. Для выполнения этой операции на произвольном ребре
происходит объединение вершин графа
и
в одну
. Если удаляется вершина
, то каждое ребро вида
заменяется на ребро вида
.
Петли
удаляются, и после этой операции граф не содержит петель. Функция стоимости переопределяется следующим образом:
.
Алгоритм представляет собой равновероятный выбор случайного имеющегося ребра и объединение вершин согласно описанной операции. Результатом работы алгоритма является пара вершин, множество рёбер между которыми является разрезом графа.
Этот разрез может быть не минимальным, но вероятность того, что этот разрез минимальный существенно больше, чем для случайно выбранного разреза.
Псевдокод
Алгоритм Каргераповторить n − 2 разавыбрать случайно ребро e
стянуть ребро e
результат число рёбер между двумя последними вершинами
Доказательства
Лемма 1.
.
Доказательство. Заметим, что каждый разрез в
соответствует разрезу в
. Пусть
,
и
. Тогда справедливы следующие развенства:
,
(при условии что
) и
. Таким образом
.
Лемма 2. Вероятность того, что результат работы алгоритма - наименьший разрез, больше или равен
.
Доказательство. Пусть
-
-тое стянутое ребро при условии, что
. Далее пусть
и
графы после
-того стягивания, а
- любой наименьший разрез графа
. Тогда справедливо следующее:
Алгоритм Каргера-Штайна
Заметим, что вероятность не найти наименьший разрез при
повторов равна
. Таким образом можно произвольно уменьшать вероятность ошибки, но при этом будет увеличиваться время выполнения алгоритма. Для константой вероятности ошибки достаточно запустить алгоритм
раз и время выполнения при этом увеличится до
. Как только константная вероятность ошибки будет достигнута, она будет экспоненциально уменьшаться в зависимости от
. До сих пор возможные наименьшие разрезы генерировались алгоритмом независимо при каждом вызове, однако результаты первых слияний рёбер можно использовать для многих запусков. Идея алгоритма Каргера-Штайна заключается в том, чтобы определять два кандидата на стягивание каждую итерацию и продолжать работу алгоритма Каргера рекурсивно для каждой из них:
Даны
и
.
Если
, найди наименьший разрез
и выведи его, заверши работу.
Установи
.
Установи
.
Стяни
рёбер в
.
Стяни
рёбер в
.
Вычисли рекусивно наименьшие разрезы
и
.
Выведи наименьший разрез
или
.
Теорема. Алгоритм Каргера-Штайна имеет временную сложность
.
Доказательство. Следующее упрощенное рекурсивное уравнение описывает время работы алгоритма:
для
и
для
. Глубина рекурсии равна
, так как размер входных данных уменьшается в константное количество раз. Пусть
на уровне рекурсии
. Заметим, что на уровне рекурсии
необходимо запустить алгоритм
раз и размер входного графа для каждого рекурсивного вызова равен
. Таким образом время выполнения каждого рекурсивного вызова
, а время выполнения, необходимое в пределах глубины рекурсии равно
. Общее же время выполнение равно
.
Лемма.
.
Доказательство.
Теорема. Алгоритм вычисляет наименьший разрез с вероятностью
.
Доказательство. Пусть
- наименьший разрез в графе и
. Тогда вероятность того, что
сохранится после
стягиваний равна минимум:
Вероятность того, что
или
имеют тот же наименьший разрез, что и
равна минимум
. Алгоритм Каргера-Штайна завершится успешно только в двух случаях: если
или
содержат минимальный разрез размером
и рекусивный вызов алгоритма успешен. ПУсть
вероятноть того, что алгоритм успешен для графа
. Тогда вероятность того, что алгоритм завершится успешно
. Пусть
- вероятность того, что алгоритм успешен на уровне рекурсии
. Тогда действительно
если
и
. Из
следует, что
, где
- глубина рекурсии.
После перезапуска алгоритма
раз, получим время выполнения
и вероятность ошибки
.