Алгоритм Штор-Вагнера нахождения минимального разреза — различия между версиями
(→Необходимые определения) |
м (rollbackEdits.php mass rollback) |
||
(не показано 8 промежуточных версий 4 участников) | |||
Строка 1: | Строка 1: | ||
== Необходимые определения == | == Необходимые определения == | ||
− | <tex>G</tex> - неориентированный взвешенный граф с <tex>n</tex> вершинами и <tex>m</tex> | + | <tex>G</tex> - неориентированный взвешенный граф с <tex>n</tex> вершинами и <tex>m</tex> рёбрами. |
{{Определение |definition= | {{Определение |definition= | ||
'''Разрезом''' называется такое разбиение множества <tex>V</tex> на два подмножества <tex>A</tex> и <tex>B</tex>, что: | '''Разрезом''' называется такое разбиение множества <tex>V</tex> на два подмножества <tex>A</tex> и <tex>B</tex>, что: | ||
Строка 15: | Строка 15: | ||
}} | }} | ||
− | Эту задачу называют "глобальным минимальным разрезом". Глобальный минимальный разрез равен минимуму среди разрезов минимальной стоимости по всевозможным парам исток-сток | + | Эту задачу называют "глобальным минимальным разрезом". Глобальный минимальный разрез равен минимуму среди разрезов минимальной стоимости по всевозможным парам исток-сток. Хотя эту задачу можно решить с помощью любого алгоритма нахождения максимального потока (запуская его <tex>O(n^2)</tex> раз для всевозможных пар истока и стока), однако ниже описан гораздо более простой и быстрый алгоритм, предложенный Матильдой Штор (Mechthild Stoer) и Франком Вагнером (Frank Wagner) в 1994 г. |
− | В общем случае допускаются петли и кратные рёбра, все кратные рёбра можно заменить одним ребром с их суммарным весом а петли не влияют на решение. Поэтому будем считать, что кратных | + | В общем случае допускаются петли и кратные рёбра, все кратные рёбра можно заменить одним ребром с их суммарным весом а петли не влияют на решение. Поэтому будем считать, что кратных рёбер и петель во входном графе нет. |
== Алгоритм == | == Алгоритм == | ||
Строка 27: | Строка 27: | ||
minCut(граф G): | minCut(граф G): | ||
− | v[i] - список вершин, которые были сжаты в i-тую(сначала заполняется i); | + | v[i] - список вершин, которые были сжаты в i-тую (сначала заполняется i); |
for i = 1..n-1 | for i = 1..n-1 | ||
− | + | A = Ø; | |
− | + | fill(w, 0); | |
for j = 1..n-1 | for j = 1..n-1 | ||
− | s = | + | s = {s <tex>\in</tex> V | s <tex>\notin</tex> A, w[s] - max}; |
if (j != n-1) | if (j != n-1) | ||
− | + | A += s; | |
пересчитываем связность w[i] для остальных вершин; | пересчитываем связность w[i] для остальных вершин; | ||
prev = s; | prev = s; | ||
Строка 41: | Строка 41: | ||
minCost = w[s]; | minCost = w[s]; | ||
minCut = v[s]; | minCut = v[s]; | ||
− | s | + | s' = s <tex>\cup</tex> prev; |
return minCut - список вершин в минимальном разрезе; | return minCut - список вершин в минимальном разрезе; | ||
Строка 51: | Строка 51: | ||
Рассмотрим произвольный <tex>s</tex>-<tex>t</tex> разрез <tex>C</tex> и покажем, что его вес не может быть меньше веса разреза, состоящего из единственной вершины <tex>t</tex>: | Рассмотрим произвольный <tex>s</tex>-<tex>t</tex> разрез <tex>C</tex> и покажем, что его вес не может быть меньше веса разреза, состоящего из единственной вершины <tex>t</tex>: | ||
− | : <tex dpi = '130'>w(\{t\}) \le w(C)</tex>. | + | : <tex dpi = '130'>w (\{t\}) \le w (C)</tex>. |
Пусть <tex>v</tex> - вершина, которую мы хотим добавить в <tex>A</tex>, тогда <tex>A_v</tex> - состояние множества <tex>A</tex> в этот момент. Пусть <tex>C_v</tex> - разрез множества <tex>A_v \cup v</tex>, индуцированный разрезом <tex>C</tex>. Вершина <tex>v</tex> - активная, если она и предыдущая добавленная вершина в <tex>A</tex> принадлежат разным частям разреза <tex>C</tex>, тогда для любой такой вершины: | Пусть <tex>v</tex> - вершина, которую мы хотим добавить в <tex>A</tex>, тогда <tex>A_v</tex> - состояние множества <tex>A</tex> в этот момент. Пусть <tex>C_v</tex> - разрез множества <tex>A_v \cup v</tex>, индуцированный разрезом <tex>C</tex>. Вершина <tex>v</tex> - активная, если она и предыдущая добавленная вершина в <tex>A</tex> принадлежат разным частям разреза <tex>C</tex>, тогда для любой такой вершины: | ||
− | : <tex dpi = '130'>w(v, A_v) \le w(C_v)</tex>. | + | : <tex dpi = '130'>w (v, A_v) \le w (C_v)</tex>. |
− | <tex>t</tex> - активная вершина, для | + | <tex>t</tex> - активная вершина, для неё выполняется: |
− | : <tex dpi = '130'>w(t,A_t) \le w(C_t)</tex> | + | : <tex dpi = '130'>w (t,A_t) \le w (C_t)</tex> |
− | : <tex dpi = '130'>w(t,A_t) = w(\{t\}), w(C_t) = w(C)</tex> | + | : <tex dpi = '130'>w (t,A_t) = w (\{t\}), w (C_t) = w (C)</tex> |
Получили утверждение теоремы. | Получили утверждение теоремы. | ||
Строка 66: | Строка 66: | ||
Для первой активной вершины <tex>v</tex> это неравенство верно, так как все вершины <tex>A_v</tex> принадлежат одной части разреза, а <tex>v</tex> - другой. Пусть неравенство выполнено для всех активных вершин до <tex>v</tex>, включая <tex>v</tex>, докажем его для следующей активной вершины <tex>u</tex>. | Для первой активной вершины <tex>v</tex> это неравенство верно, так как все вершины <tex>A_v</tex> принадлежат одной части разреза, а <tex>v</tex> - другой. Пусть неравенство выполнено для всех активных вершин до <tex>v</tex>, включая <tex>v</tex>, докажем его для следующей активной вершины <tex>u</tex>. | ||
− | : <tex dpi = '130'> w(u,A_u) \equiv w(u,A_v) + w(u,A_u \setminus A_v)</tex> (*) | + | : <tex dpi = '130'> w (u,A_u) \equiv w (u,A_v) + w (u,A_u \setminus A_v)</tex> (*) |
Заметим, что | Заметим, что | ||
− | : <tex dpi = '130'>w(u,A_v) \le w(v,A_v)</tex> (**) | + | : <tex dpi = '130'>w (u,A_v) \le w (v,A_v)</tex> (**) |
вершина <tex>v</tex> имела большее значение <tex>w</tex>, чем <tex>u</tex>, так как была добавлена в <tex>A</tex> раньше. | вершина <tex>v</tex> имела большее значение <tex>w</tex>, чем <tex>u</tex>, так как была добавлена в <tex>A</tex> раньше. | ||
По предположению индукции: | По предположению индукции: | ||
− | : <tex dpi = '130'>w(v,A_v) \le w(C_v)</tex> | + | : <tex dpi = '130'>w (v,A_v) \le w (C_v)</tex> |
Следовательно из (**): | Следовательно из (**): | ||
Строка 83: | Строка 83: | ||
А из (*) имеем: | А из (*) имеем: | ||
− | : <tex dpi = '130'>w(u,A_u) \le w(C_v) + w(u,A_u \setminus A_v)</tex> | + | : <tex dpi = '130'>w (u,A_u) \le w (C_v) + w (u,A_u \setminus A_v)</tex> |
− | Вершина <tex>u</tex> и <tex>A_u \setminus A_v</tex> находятся в разных частях разреза <tex>C</tex>, значит <tex>w(u,A_u \setminus A_v)</tex> равна сумме весов | + | Вершина <tex>u</tex> и <tex>A_u \setminus A_v</tex> находятся в разных частях разреза <tex>C</tex>, значит <tex>w (u,A_u \setminus A_v)</tex> равна сумме весов рёбер, которые не входят в <tex>C_v</tex>, но входят в <tex>C_u</tex>. |
− | : <tex dpi = '130'>w(u,A_u) \le w(C_v) + w(u,A_u \setminus A_v) \le w(C_u)</tex> | + | : <tex dpi = '130'>w (u,A_u) \le w (C_v) + w (u,A_u \setminus A_v) \le w (C_u)</tex> |
Что и требовалось доказать. | Что и требовалось доказать. | ||
Строка 93: | Строка 93: | ||
== Асимптотика == | == Асимптотика == | ||
− | #Нахождение вершины с наибольшей <tex>w</tex> за <tex>O(n)</tex>, <tex>n-1</tex> фаза по <tex>n-1</tex> итерации в каждой. В итоге имеем <tex>O(n^3)</tex> | + | #Нахождение вершины с наибольшей <tex>w</tex> за <tex>O (n)</tex>, <tex>n-1</tex> фаза по <tex>n-1</tex> итерации в каждой. В итоге имеем <tex>O (n^3)</tex> |
− | #Если использовать | + | #Если использовать фибоначчиевы кучи для нахождения вершины с наибольшей <tex>w</tex>, то асимптотика составит <tex>O (nm + n^2 \log n)</tex> |
− | #Если использовать | + | #Если использовать двоичные кучи, то асимптотика составит <tex>O (nm \log n + n^2)</tex> |
+ | |||
+ | == Применение == | ||
+ | Нахождение разреза минимальной стоимости является основой в одном из методов сегментации изображений (сегментацией изображения называется разбиение его на некоторые области, непохожие по некоторому признаку). | ||
+ | |||
+ | Изображение представляется в виде взвешенного графа, вершинами которого являются точки изображения (как правило, пиксели, но, возможно, и большие области, от этого зависит качество сегментации, а также скорость её построения). Вес ребра представляет отражает "разницу" между точками (расстояние в некоторой метрике). Разбиение изображения на однородные области сводится к задаче поиска минимального разреза в графе. Специально для такого рода задач был предложен метод нахождения разреза минимальной стоимости [https://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDQQFjAB&url=http%3A%2F%2Fwww.cs.berkeley.edu%2F~malik%2Fpapers%2FSM-ncut.pdf&ei=cP2-UuqhAuSJ4gTnhYCwAg&usg=AFQjCNFn9GZPlFjDUgDofCScu6Wm47qMWQ&sig2=Yufd8LreEQKHe3NGnFVm7A&bvm=bv.58187178,d.bGE&cad=rjt Normalized Cut (J. Shi, J. Malik (1997))] | ||
== Источники == | == Источники == | ||
* [http://e-maxx.ru/bookz/files/stoer_wagner_mincut.pdf Mechthild Stoer, Frank Wagner. A Simple Min-Cut Algorithm] | * [http://e-maxx.ru/bookz/files/stoer_wagner_mincut.pdf Mechthild Stoer, Frank Wagner. A Simple Min-Cut Algorithm] | ||
* [http://e-maxx.ru/algo/stoer_wagner_mincut Алгоритм Штор-Вагнера] | * [http://e-maxx.ru/algo/stoer_wagner_mincut Алгоритм Штор-Вагнера] | ||
+ | * [http://cgm.computergraphics.ru/content/view/147 Методы сегментации изображения] | ||
== Ссылки == | == Ссылки == | ||
− | *[ | + | *[[Алгоритм Каргера для нахождения минимального разреза]] |
+ | *[https://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDQQFjAB&url=http%3A%2F%2Fwww.cs.berkeley.edu%2F~malik%2Fpapers%2FSM-ncut.pdf&ei=cP2-UuqhAuSJ4gTnhYCwAg&usg=AFQjCNFn9GZPlFjDUgDofCScu6Wm47qMWQ&sig2=Yufd8LreEQKHe3NGnFVm7A&bvm=bv.58187178,d.bGE&cad=rjt Метод Normalized Cut] | ||
[[Категория: Алгоритмы и структуры данных]] | [[Категория: Алгоритмы и структуры данных]] | ||
[[Категория: Задача о максимальном потоке]] | [[Категория: Задача о максимальном потоке]] |
Текущая версия на 19:26, 4 сентября 2022
Необходимые определения
- неориентированный взвешенный граф с вершинами и рёбрами.
Определение: |
Разрезом называется такое разбиение множества
| на два подмножества и , что:
Определение: |
Весом разреза называется сумма весов рёбер, проходящих через разрез, т.е. таких рёбер, один конец которых принадлежит | , а второй конец - .
Эту задачу называют "глобальным минимальным разрезом". Глобальный минимальный разрез равен минимуму среди разрезов минимальной стоимости по всевозможным парам исток-сток. Хотя эту задачу можно решить с помощью любого алгоритма нахождения максимального потока (запуская его раз для всевозможных пар истока и стока), однако ниже описан гораздо более простой и быстрый алгоритм, предложенный Матильдой Штор (Mechthild Stoer) и Франком Вагнером (Frank Wagner) в 1994 г.
В общем случае допускаются петли и кратные рёбра, все кратные рёбра можно заменить одним ребром с их суммарным весом а петли не влияют на решение. Поэтому будем считать, что кратных рёбер и петель во входном графе нет.
Алгоритм
Идея алгоритма довольно проста. Будем
раз повторять следующий процесс: находить минимальный разрез между какой-нибудь парой вершин и , а затем объединять эти две вершины в одну (создавать новую вершину, список смежности которой равен объединению списков смежности и ). В конце концов, после итерации, останется одна вершина. После этого ответом будет являться минимальный среди всех найденных разрезов. Действительно, на каждой -ой стадии найденный минимальный разрез между вершинами и либо окажется искомым глобальным минимальным разрезом, либо же, напротив, вершины и невыгодно относить к разным множествам, поэтому мы ничего не ухудшаем, объединяя эти две вершины в одну.Следовательно нам необходимо для данного графа найти минимальный разрез между какой-нибудь парой вершин
и . Для этого вводим некоторое множество вершин , которое изначально содержит единственную произвольную вершину . На каждом шаге находится вершина, наиболее сильно связанная с множеством , т.е. вершина , для которой следующая величина максимальна (максимальна сумма весов рёбер, один конец которых , а другой принадлежит ). Этот процесс завершится, когда все вершины перейдут в множество .
minCut(граф G): v[i] - список вершин, которые были сжаты в i-тую (сначала заполняется i); for i = 1..n-1 A = Ø; fill(w, 0); for j = 1..n-1 s = {sV | s A, w[s] - max}; if (j != n-1) A += s; пересчитываем связность w[i] для остальных вершин; prev = s; else if (w[s] < minCost) minCost = w[s]; minCut = v[s]; s' = s prev; return minCut - список вершин в минимальном разрезе;
Корректность алгоритма
Теорема: |
Если добавить в множество по очереди все вершины, каждый раз добавляя вершину, наиболее сильно связанную с , то пусть предпоследняя добавленная вершина — , а последняя — . Тогда минимальный - разрез состоит из единственной вершины — |
Доказательство: |
Рассмотрим произвольный - разрез и покажем, что его вес не может быть меньше веса разреза, состоящего из единственной вершины :
Пусть - вершина, которую мы хотим добавить в , тогда - состояние множества в этот момент. Пусть - разрез множества , индуцированный разрезом . Вершина - активная, если она и предыдущая добавленная вершина в принадлежат разным частям разреза , тогда для любой такой вершины:
- активная вершина, для неё выполняется: Получили утверждение теоремы. Для доказательства воспользуемся методом математической индукции. Для первой активной вершины это неравенство верно, так как все вершины принадлежат одной части разреза, а - другой. Пусть неравенство выполнено для всех активных вершин до , включая , докажем его для следующей активной вершины .
Заметим, что
вершина имела большее значение , чем , так как была добавлена в раньше. По предположению индукции:Следовательно из (**): А из (*) имеем: Вершина и находятся в разных частях разреза , значит равна сумме весов рёбер, которые не входят в , но входят в . |
Асимптотика
- Нахождение вершины с наибольшей за , фаза по итерации в каждой. В итоге имеем
- Если использовать фибоначчиевы кучи для нахождения вершины с наибольшей , то асимптотика составит
- Если использовать двоичные кучи, то асимптотика составит
Применение
Нахождение разреза минимальной стоимости является основой в одном из методов сегментации изображений (сегментацией изображения называется разбиение его на некоторые области, непохожие по некоторому признаку).
Изображение представляется в виде взвешенного графа, вершинами которого являются точки изображения (как правило, пиксели, но, возможно, и большие области, от этого зависит качество сегментации, а также скорость её построения). Вес ребра представляет отражает "разницу" между точками (расстояние в некоторой метрике). Разбиение изображения на однородные области сводится к задаче поиска минимального разреза в графе. Специально для такого рода задач был предложен метод нахождения разреза минимальной стоимости Normalized Cut (J. Shi, J. Malik (1997))