Алгоритм Каргера

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис
Алгоритм Каргера
Граф и два его разреза. Красный разрез пересекает три ребра, а зеленый два. Последний является одним из минимальных разрезов данного графа.Граф и два его разреза. Красный разрез пересекает три ребра, а зеленый два. Последний является одним из минимальных разрезов данного графа.
Предназначение поиск наименьшего разреза графа
Структура данных граф
Среднее время [math]\displaystyle{ O(Tm) = O(n^2 m \log n) }[/math]
Затраты памяти -

Алгори́тм Ка́ргера (англ. Karger's algorithm) — в информатике и теории графов является вероятностным алгоритмом, позволяющим найти минимальный разрез связного графа. Алгоритм изобретен Девидом Каргером[англ.] и опубликован в 1993 году[1].

Идея алгоритма основана на стягивании ребра в неориентированном графе. Во время стягивания ребра происходит объединение двух вершин в одну, что уменьшает количество вершин графа на единицу. Все рёбра стягиваемых вершин соединяются со вновь образованной вершиной, порождая мультиграф. Алгоритм Каргера итеративно выбирает случайные рёбра и выполняет операцию до тех пор, пока не останется две вершины, которые и представляют собой разрез изначального графа. Если повторять алгоритм достаточное количество раз, то с высокой вероятностью может быть найден минимальный разрез.

Описание

Примеры

Основной задачей является поиск узких мест в различных сетях. Примеры:

Алгоритм

Операция стягивания ребра алгоритма Каргера.

Основной операцией алгоритма Каргера является одна из форм стягивания ребра. Для выполнения этой операции на произвольном ребре [math]\displaystyle{ e=\{u,v\} }[/math] происходит объединение вершин графа [math]\displaystyle{ u }[/math] и [math]\displaystyle{ v }[/math] в одну [math]\displaystyle{ uv }[/math]. Если удаляется вершина [math]\displaystyle{ v }[/math], то каждое ребро вида [math]\displaystyle{ \{v,x\} }[/math] заменяется на ребро вида [math]\displaystyle{ \{u,x\} }[/math]. Петли удаляются, и после этой операции граф не содержит петель. Функция стоимости переопределяется следующим образом: [math]\displaystyle{ c'(e) = \begin{cases} c(e), & u, v \notin e \\ c(e), & e = (x, u) \land (x, v) \notin E \\ c((x, v)), & e \neq (x, u) \land (x, v) \in E \\ c(e) + c((x, v)), & e = (x, u) \land (x, v) \in E \end{cases} }[/math].

Алгоритм представляет собой равновероятный выбор случайного имеющегося ребра и объединение вершин согласно описанной операции. Результатом работы алгоритма является пара вершин, множество рёбер между которыми является разрезом графа. Этот разрез может быть не минимальным, но вероятность того, что этот разрез минимальный существенно больше, чем для случайно выбранного разреза.

Пример успешной работы алгоритма для графа с 10 вершинами. Минимальный разрез равен трём.

Псевдокод

Алгоритм Каргера
повторить n − 2 раза
  выбрать случайно ребро e
  стянуть ребро e
результат число рёбер между двумя последними вершинами

Доказательства

Лемма 1. [math]\displaystyle{ \mathbb{Pr}[e_i \notin K \mid \bigcap_{1 \leqslant j \lt i} e_j \notin K] \geqslant 1 - \frac{2}{n-i+1} }[/math].

Доказательство. Заметим, что каждый разрез в [math]\displaystyle{ H_j }[/math] соответсвует разрезу в [math]\displaystyle{ G }[/math]. Пусть [math]\displaystyle{ k = |K| }[/math], [math]\displaystyle{ n_j = |V(H_j)| }[/math] и [math]\displaystyle{ m_j = |E(H_j)| }[/math]. Тогда справедливы следующие развенства: [math]\displaystyle{ n_{i-1} = n - i + 1 }[/math], [math]\displaystyle{ m_{i-1} \geqslant k \cdot n_{i-1}/2 }[/math] (при условии что [math]\displaystyle{ k \leqslant \delta(H_{i-1}) }[/math]) и [math]\displaystyle{ \mathbb{Pr}[e_i \in K] = \frac{k}{m_{i-1}} }[/math]. Таким образом [math]\displaystyle{ \mathbb{Pr}[e_i \notin K \mid \bigcap_{1 \leqslant j \lt i} e_j \notin K] = \frac{k}{m_{i-1}} \geqslant \frac{2}{n_{i-1}} = 1 - \frac{2}{n-i+1} }[/math].

Лемма 2. Вероятность того, что результат работы алгоритма - наименьший разрез, больше или равен [math]\displaystyle{ \tbinom{n}{2}^{-1} }[/math].

Доказательство. Пусть [math]\displaystyle{ e_i }[/math] - [math]\displaystyle{ i }[/math]-тое стянутое ребро при условии, что [math]\displaystyle{ 1 \leqslant i \leqslant n-2 }[/math]. Далее пусть [math]\displaystyle{ H_0 = G }[/math] и [math]\displaystyle{ H_i }[/math] графы после [math]\displaystyle{ i }[/math]-того стягивания, а [math]\displaystyle{ K }[/math] - любой наименьший разрез графа [math]\displaystyle{ G }[/math]. Тогда справедливо следующее:

[math]\displaystyle{ \begin{align} \mathbb{Pr}[C \text{ is a min. Cut}] & \geqslant \mathbb{Pr}[C = K] \\ & = \mathbb{Pr}[\bigcap_{1 \leqslant i \leqslant n-2} e_i \notin K] \\ & = \prod_{1 \leqslant i \leqslant n-2} \mathbb{Pr}[e_i \notin K \mid \bigcap_{1 \leqslant j \lt i} e_j \notin K] \\ & \geqslant \prod_{1 \leqslant i \leqslant n-2} (1 - \frac{2}{n - i + 1}) \\ & = \prod_{1 \leqslant i \leqslant n-2} \frac{n - i - 1}{n - i + 1} \\ & = \frac{n-2}{n} \cdot \frac{n-3}{n-1} \cdot \dots \cdot \frac{2}{4} \cdot \frac{1}{3} \\ & = \frac{2}{n(n-1)} = \tbinom{n}{2}^{-1} \\ \end{align} }[/math]

Алгоритм Каргера-Штайна

Заметим, что вероятность не найти наименьший разрез при [math]\displaystyle{ t \cdot \tbinom{n}{2} }[/math] повторов равна [math]\displaystyle{ (1 - \tbinom{n}{2}^{-1})^{t \cdot \tbinom{n}{2}} \leqslant (1/e)^t }[/math]. Таким образом можно произвольно уменьшать вероятность ошибки, но при этом будет увеличиваться время выполнения алгоритма. Для константой вероятности ошибки достаточно запустить алгоритм [math]\displaystyle{ \tbinom{n}{2} }[/math] раз и время выполнения при этом увеличится до [math]\displaystyle{ O(n^4) }[/math]. Как только константная вероятность ошибки будет достигнута, она будет экспоненциально уменьшаться в зависимости от [math]\displaystyle{ t }[/math]. До сих пор возможные наименьшие разрезы генерировались алгоритмом независимо при каждом вызове, однако результаты первых слияний рёбер можно использовать для многих запусков. Идея алгоритма Каргера-Штайна заключается в том, чтобы определять два кандидата на стягивание каждую итерацию и продолжать работу алгоритма Каргера рекурсивно для каждой из них:

  1. Даны [math]\displaystyle{ G = (V, E) }[/math] и [math]\displaystyle{ c \colon E \to \mathbb{N}^+ }[/math].
  2. Если [math]\displaystyle{ |V| \leqslant 6 }[/math], найди наименьший разрез [math]\displaystyle{ C_U }[/math] и выведи его, заверши работу.
  3. Установи [math]\displaystyle{ t = \lceil 1 + \frac{n}{\sqrt{2}} \rceil }[/math].
  4. Установи [math]\displaystyle{ H = H' = G }[/math].
  5. Стяни [math]\displaystyle{ n-t }[/math] рёбер в [math]\displaystyle{ H }[/math].
  6. Стяни [math]\displaystyle{ n - t }[/math] рёбер в [math]\displaystyle{ H' }[/math].
  7. Вычисли рекусивно наименьшие разрезы [math]\displaystyle{ C_H }[/math] и [math]\displaystyle{ C_{H'} }[/math].
  8. Выведи наименьший разрез [math]\displaystyle{ C_H }[/math] или [math]\displaystyle{ C_{H'} }[/math].

Теорема. Алгоритм Каргера-Штайна имеет временную сложность [math]\displaystyle{ O(n^2 \cdot \log n) }[/math].

Доказательство. Следующее упрощенное рекурсивное уравнение описывает время работы алгоритма: [math]\displaystyle{ T(n) = 2 \cdot T(\lceil 1 + \frac{n}{\sqrt{2}} \rceil) + O(n^2) }[/math] для [math]\displaystyle{ n \gt 6 }[/math] и [math]\displaystyle{ T(n) = O(1) }[/math] для [math]\displaystyle{ n \leqslant 6 }[/math]. Глубина рекурсии равна [math]\displaystyle{ D = O(\log n) }[/math], так как размер входных данных уменьшается в константное количество раз. Пусть [math]\displaystyle{ n_l = |V(H)| }[/math] на уровне рекурсии [math]\displaystyle{ l \geqslant 0 }[/math]. Заметим, что на уровне рекурсии [math]\displaystyle{ l }[/math] необходимо запустить алгоритм [math]\displaystyle{ 2^l }[/math] раз и размер входного графа для каждого рекурсивного вызова равен [math]\displaystyle{ n_l \equiv \frac{n}{(\sqrt{2})^l} }[/math]. Таким образом время выполнения каждого рекурсивного вызова [math]\displaystyle{ O(n_l^2) = O(\frac{n^2}{2^l}) }[/math], а время выполнения, необходимое в пределах глубины рекурсии равно [math]\displaystyle{ 2^l \cdot O(\frac{n^2}{2^l}) = O(n^2) }[/math]. Общее же время выполнение равно [math]\displaystyle{ O(n^2 \cdot \log n) }[/math].

Лемма. [math]\displaystyle{ p(t) \geqslant \frac{1}{t + 1} }[/math].

Доказательство.

[math]\displaystyle{ \begin{align} p(t) & \geqslant 1 - (1 - p(t-1)/2)^2 \\ & \geqslant 1 - (1 - \frac{1}{2t})^2 \\ & = \frac{1}{t} - \frac{1}{4t^2} \\ & = \frac{4t-1}{4t^2} \\ & = \frac{(4t-1)(t+1)}{4t^2} \cdot \frac{1}{t+1} \\ & = \frac{4t^2 + 4t - t - 1}{4t^2} \cdot \frac{1}{t + 1} \\ & \geqslant \frac{1}{t+1} \end{align} }[/math]

Теорема. Алгоритм вычисляет наименьший разрез с вероятностью [math]\displaystyle{ \Omega(1 / \log n) }[/math].

Доказательство. Пусть [math]\displaystyle{ K }[/math] - наименьший разрез в графе и [math]\displaystyle{ k = |K| }[/math]. Тогда вероятность того, что [math]\displaystyle{ K }[/math] сохранится после [math]\displaystyle{ n-t }[/math] стягиваний равна минимум:

[math]\displaystyle{ \begin{align} \prod_{1 \leqslant i \leqslant n-t} (1 - \frac{2}{n - i + 1}) & = \prod_{1 \leqslant i \leqslant n-t} (\frac{n - i - 1}{n - i + 1}) \\ & = \frac{n-2}{n} \cdot \frac{n-3}{n-1} \cdot \dots \cdot \frac{t}{t+2} \cdot \frac{t-1}{t+1} \\ & = \frac{t(t-1)}{n(n-1)} \\ & = \frac{\lceil 1 + n/\sqrt{2} \rceil \cdot \lceil n/\sqrt{2} \rceil}{n(n-1)} \\ & \geqslant \frac{1}{2} \\ \end{align} }[/math]

Вероятность того, что [math]\displaystyle{ H }[/math] или [math]\displaystyle{ H' }[/math] имеют тот же наименьший разрез, что и [math]\displaystyle{ G }[/math] равна минимум [math]\displaystyle{ \frac{1}{2} }[/math]. Алгоритм Каргера-Штайна завершится успешно только в двух случаях: если [math]\displaystyle{ H }[/math] или [math]\displaystyle{ H' }[/math] содержат минимальный разрез размером [math]\displaystyle{ k }[/math] и рекусивный вызов алгоритма успешен. ПУсть [math]\displaystyle{ P(G') }[/math] вероятноть того, что алгоритм успешен для графа [math]\displaystyle{ G' }[/math]. Тогда вероятность того, что алгоритм завершится успешно [math]\displaystyle{ P(G) \geqslant 1 - (1 - P(H)/2) \cdot (1 - P(H')/2) }[/math]. Пусть [math]\displaystyle{ p(t) }[/math] - вероятность того, что алгоритм успешен на уровне рекурсии [math]\displaystyle{ t }[/math]. Тогда действительно [math]\displaystyle{ p(t) \geqslant 1 - (1 - p(t - 1)/2)^2 }[/math] если [math]\displaystyle{ t \geqslant 1 }[/math] и [math]\displaystyle{ p(0) = 1 }[/math]. Из [math]\displaystyle{ p(t) \geqslant \frac{1}{t+1} }[/math] следует, что [math]\displaystyle{ P(G) = p(D) \geqslant \frac{1}{D+1} = \Omega(\frac{1}{\log n}) }[/math], где [math]\displaystyle{ D = O(\log n) }[/math]- глубина рекурсии.

После перезапуска алгоритма [math]\displaystyle{ O(\log n) }[/math] раз, получим время выполнения [math]\displaystyle{ O(n^2 \log^2 n) }[/math] и вероятность ошибки [math]\displaystyle{ \Omega(1) }[/math].

См. также

Примечания

  1. Karger, David R. Global Min-cuts in RNC, and Other Ramifications of a Simple Min-Cut Algorithm (англ.) // SODA : journal. — 1993. — Vol. 93. — P. 21—30. — ISBN 0-89871-313-7.
  2. Terminal-Set-Enhanced Community Detection in Social Networks. Дата обращения: 24 августа 2016. Архивировано 9 июля 2016 года.
  3. Minimum Cut Problem. Дата обращения: 24 августа 2016. Архивировано 28 августа 2016 года.
  4. Randomized Algorithms Part Three. Дата обращения: 24 августа 2016. Архивировано 28 мая 2016 года.

Ссылки