Обсуждение:Дискретная математика и алгоритмы — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Алгоритм Штор-Вагнера нахождения минимального разреза: Новая тема)
Строка 66: Строка 66:
 
#* Пробел после запятой, разделяющей аргументы функции
 
#* Пробел после запятой, разделяющей аргументы функции
 
#* Используем какой-то определённый стиль именования переменных(я бы рекомендовал lowerCamelCase для переменных и функций и UpperCamelCase для классов)
 
#* Используем какой-то определённый стиль именования переменных(я бы рекомендовал lowerCamelCase для переменных и функций и UpperCamelCase для классов)
 +
 +
== Алгоритм Штор-Вагнера нахождения минимального разреза ==
 +
 +
== Необходимые определения ==
 +
<tex>G</tex> - неориентированный взвешенный граф с <tex>n</tex> вершинами и <tex>m</tex> ребрами.
 +
{{Определение |definition=
 +
'''Разрезом''' называется такое разбиение множества <tex>V</tex> на два подмножества <tex>A</tex> и <tex>B</tex>, что:
 +
* <tex>A, B \subset V</tex>;
 +
* <tex>A, B \neq  \emptyset</tex>;
 +
* <tex>A \cap B = \emptyset</tex>;
 +
* <tex>A \cup B = V</tex>.
 +
}}
 +
 +
{{Определение |definition=
 +
'''Весом разреза''' называется сумма весов рёбер, проходящих через разрез, т.е. таких рёбер, один конец которых принадлежит <tex>A</tex>, а второй конец - <tex>B</tex>.
 +
* <tex>w(A, B) =</tex> <tex dpi = "140">\sum\limits_{uv \in E, u \in A, v \in B} w(u, v)</tex>
 +
}}
 +
 +
Эту задачу называют "глобальным минимальным разрезом". Глобальный минимальный разрез равен минимуму среди разрезов минимальной стоимости по всевозможным парам исток-сток. Хотя эту задачу можно решить с помощью любого алгоритма нахождения максимального потока (запуская его O(n^2) раз для всевозможных пар истока и стока), однако ниже описан гораздо более простой и быстрый алгоритм, предложенный Матильдой Штор (Mechthild Stoer) и Франком Вагнером (Frank Wagner) в 1994 г.
 +
 +
В общем случае допускаются петли и кратные рёбра, все кратные рёбра можно заменить одним ребром с их суммарным весом а петли не влияют на решение. Поэтому будем считать, что кратных ребер и петель во входном графе нет.
 +
 +
== Алгоритм ==
 +
Идея алгоритма довольно проста. Будем <tex>n-1</tex> раз повторять следующий процесс: находить минимальный разрез между какой-нибудь парой вершин <tex>s</tex> и <tex>t</tex>, а затем объединять эти две вершины в одну (создавать новую вершину, список смежности которой равен объединению списков смежности <tex>s</tex> и <tex>t</tex>). В конце концов, после <tex>n-1</tex> итерации, останется одна вершина. После этого ответом будет являться минимальный среди всех <tex>n-1</tex> найденных разрезов. Действительно, на каждой <tex>i</tex>-ой стадии найденный минимальный разрез <tex>\langle A,B \rangle</tex> между вершинами <tex>s_i</tex> и <tex>t_i</tex> либо окажется искомым глобальным минимальным разрезом, либо же, напротив, вершины <tex>s_i</tex> и <tex>t_i</tex> невыгодно относить к разным множествам, поэтому мы ничего не ухудшаем, объединяя эти две вершины в одну.
 +
 +
Следовательно нам необходимо для данного графа найти минимальный разрез между какой-нибудь парой вершин <tex>s</tex> и <tex>t</tex>. Для этого вводим некоторое множество вершин <tex>A</tex>, которое изначально содержит единственную произвольную вершину <tex>s</tex>. На каждом шаге находится вершина, наиболее сильно связанная с множеством <tex>A</tex>, т.е. вершина <tex>v \not\in A</tex>, для которой следующая величина  <tex dpi = "140">w(v,A) = \sum\limits_{(v,u) \in E, \atop u \in A} w(v,u)</tex> максимальна (максимальна сумма весов рёбер, один конец которых <tex>v</tex>, а другой принадлежит <tex>A</tex>).

Версия 13:50, 9 декабря 2013

Требования к написанию вики-конспектов

Главное

  1. Внимательно читайте свои конспекты перед тем, как совершать попытку их сдачи. Еще лучше читать конспекты друг друга перед отправкой на проверку, так как это позволит значительно уменьшить количество итераций сдачи конспекта.
  2. Перед отправкой на проверку перечитайте эти требования.
  3. В конспекте не должно быть недочетов, связанных с требованиями.
  4. Не забудьте после того как конспект примут, или когда он будет в состоянии, близком к готовому, добавить его в список конспектов по соответствующей теме, иначе он потеряется, и его никто никогда не прочитает.

Общение с редакторами

  1. Желательно зарегистрироваться на сайте вики-конспектов и написать в информации о себе имя, фамилию и группу.
  2. Не забывайте сообщать редакторам о том, что конспект нужно проверить.
  3. При общении с редактором, представляйтесь и давайте ссылку на конспект, который вы пишете (в каждой итерации общения, чтобы не приходилось искать в истории переписки ссылку). При использовании электронной почты в теме письма указывайте “Вики-конспекты: Название вики-конспекта”. Отсутствие словосочетания "Вики-конспекты" может сказаться на времени проверки конспекта.
  4. Ставить замечания к конспекту может не только ваш куратор конспекта, в том числе и после принятия конспекта. Их тоже надо учитывать.
  5. Не помечайте замечания, эти метки — для кураторов конспектов.

Викификация

  1. Смотрите в качестве примера на конспекты, которые отмечены как хорошие.
  2. В конспекте не должно быть орфографических, пунктуационных, речевых, фактических, логических и других ошибок. Используйте spell checker.
  3. Используйте вики-шаблоны Шаблон: Определение, Шаблон: Теорема, Шаблон: Лемма, Шаблон: Утверждение (Справка по шаблонам).
  4. Если ваш конспект написан про какое-то конкретное понятие или теорему, не надо делать отдельный пункт "Формулировка":
плохо
хорошо
  1. Приводите английские названия терминов, теорем, имен алгоритмов и т.д. Их лучше писать в скобках курсивом после их русских названий.
  2. Вместо черточки “-” используйте тире “—”. Для этого можно использовать Шаблон:---. Про правила использования читать здесь
  3. Редактировать можно не только свои конспекты — используйте “концепцию вики”
  4. Не используйте тег <br> . Для перевода строки в вики надо вставлять пустую строку. Видимо, единственное место, где можно использовать его — внутри шаблонов — там переводы строки почему-то не работают.
  5. Ставьте категорию [[Категория: Дискретная математика и алгоритмы]] и подкатегорию с названием подтемы (например, [[Категория: Динамическое программирование]]). Список подкатегорий тут.
  6. Оформляйте ссылки на источники правильно. Пример хорошего оформления — конспекты Алгоритм Хаффмана и Сокращенная и минимальная ДНФ.
  7. Не используйте сокращения.

Картинки

  1. Картинки, где только возможно, надо делать в векторе. Для этого можно пользоваться Microsoft Visio, Inkscape, Graphwiz, Metapost и им подобными.

Источники

  1. Используйте ссылки на другие конспекты.
  2. В конспекте должны быть указаны источники или литература. Причем указывать ссылки не просто на википедию, а на конкретную статью (как Википедия — Экспоненциальная запись, на английскую — как Wikipedia — Scientific notation). Для книг достаточно указать автора, название, издание и номер страницы.
  3. Нарушения авторского права недопустимы.

TeX

  1. Использование тега <tex> вместо <math> обязательно. Везде.
  2. По согласованию с куратором: если лень постоянно писать <tex> </tex> , можно обернуть всю статью в <wikitex> </wikitex> , а потом обособлять формулы в $ $(например, <wikitex> Для любого $ \alpha $ верно $\sin^2 \alpha + \cos^2 \alpha = 1 $ </wikitex> ), но лучше так не делать. В частности, проблемы возникают если внутри тега wikitex находится несколько заголовков — ломается их редактирование по отдельности.
  3. Формулы с дробями можно увеличивать для повышения читаемости, если кажется, что они рендерятся слишком мелко, но не надо злоупотреблять. Для этого используйте параметр dpi в теге tex. Пример: <tex dpi = "180">\frac {\omega_n(x)} {(x - x_j) \cdot \omega_n'(x_j)}</tex>
  4. В качестве знака умножения нужно использовать \times или \cdot, а не звездочку. Сравните: [math]2 * 2 = 2 \times 2 = 2 \cdot 2 = 4[/math].
  5. Не опускайте знаки умножения, конъюнкции, скобки и т.п., если это может привести к неоднозначности.

Псевдокод

(правила, в основном, отсюда Участник: Kirelagin/Оформление#Псевдокод)

  1. Используйте максимально компактный и читаемый псевдокод.
  2. Не ставьте фигурные скобки. Угадайте, для чего они нужны? Чтобы парсер языка было легче писать. Человеку они только мешают. Используйте отступы для группировки. (Python-style)
  3. Не ставьте круглые скобки вокруг внешнего условия if'а, while'а и т.п.
  4. Обозначайте присвоение нормально, с помощью знака «=», а сравнение как «==» (всё равно придётся слезать с паскаля).
  5. Не вводите какие-то левые операторы. Например, если кладёте что-то в очередь, так и напишите: q.push(a).
  6. TeX в псевдокоде можно использовать только в случае какого-то нестандартного оператора(а перед этим хорошо подумать и посмотреть предыдущий пункт)
  7. Не надо описывать ввод данных и вывод данных. Оформляйте псевдокод как функцию, принимающую входные данные и возвращающую результат.
  8. Обычные правила хорошего кода:
    • Ставим пробелы между операндами и бинарными операторами(«1 + 2», а не «1+2»). После унарных операторов перед операндом пробел ставить не нужно.
    • Не ставим пробел перед скобкой - вызовом функции(«f(x)», а не «f (x)»)
    • Пробел после запятой, разделяющей аргументы функции
    • Используем какой-то определённый стиль именования переменных(я бы рекомендовал lowerCamelCase для переменных и функций и UpperCamelCase для классов)

Алгоритм Штор-Вагнера нахождения минимального разреза

Необходимые определения

[math]G[/math] - неориентированный взвешенный граф с [math]n[/math] вершинами и [math]m[/math] ребрами.

Определение:
Разрезом называется такое разбиение множества [math]V[/math] на два подмножества [math]A[/math] и [math]B[/math], что:
  • [math]A, B \subset V[/math];
  • [math]A, B \neq \emptyset[/math];
  • [math]A \cap B = \emptyset[/math];
  • [math]A \cup B = V[/math].


Определение:
Весом разреза называется сумма весов рёбер, проходящих через разрез, т.е. таких рёбер, один конец которых принадлежит [math]A[/math], а второй конец - [math]B[/math].
  • [math]w(A, B) =[/math] [math]\sum\limits_{uv \in E, u \in A, v \in B} w(u, v)[/math]


Эту задачу называют "глобальным минимальным разрезом". Глобальный минимальный разрез равен минимуму среди разрезов минимальной стоимости по всевозможным парам исток-сток. Хотя эту задачу можно решить с помощью любого алгоритма нахождения максимального потока (запуская его O(n^2) раз для всевозможных пар истока и стока), однако ниже описан гораздо более простой и быстрый алгоритм, предложенный Матильдой Штор (Mechthild Stoer) и Франком Вагнером (Frank Wagner) в 1994 г.

В общем случае допускаются петли и кратные рёбра, все кратные рёбра можно заменить одним ребром с их суммарным весом а петли не влияют на решение. Поэтому будем считать, что кратных ребер и петель во входном графе нет.

Алгоритм

Идея алгоритма довольно проста. Будем [math]n-1[/math] раз повторять следующий процесс: находить минимальный разрез между какой-нибудь парой вершин [math]s[/math] и [math]t[/math], а затем объединять эти две вершины в одну (создавать новую вершину, список смежности которой равен объединению списков смежности [math]s[/math] и [math]t[/math]). В конце концов, после [math]n-1[/math] итерации, останется одна вершина. После этого ответом будет являться минимальный среди всех [math]n-1[/math] найденных разрезов. Действительно, на каждой [math]i[/math]-ой стадии найденный минимальный разрез [math]\langle A,B \rangle[/math] между вершинами [math]s_i[/math] и [math]t_i[/math] либо окажется искомым глобальным минимальным разрезом, либо же, напротив, вершины [math]s_i[/math] и [math]t_i[/math] невыгодно относить к разным множествам, поэтому мы ничего не ухудшаем, объединяя эти две вершины в одну.

Следовательно нам необходимо для данного графа найти минимальный разрез между какой-нибудь парой вершин [math]s[/math] и [math]t[/math]. Для этого вводим некоторое множество вершин [math]A[/math], которое изначально содержит единственную произвольную вершину [math]s[/math]. На каждом шаге находится вершина, наиболее сильно связанная с множеством [math]A[/math], т.е. вершина [math]v \not\in A[/math], для которой следующая величина [math]w(v,A) = \sum\limits_{(v,u) \in E, \atop u \in A} w(v,u)[/math] максимальна (максимальна сумма весов рёбер, один конец которых [math]v[/math], а другой принадлежит [math]A[/math]).