Алгоритм Прима — различия между версиями
Shersh (обсуждение | вклад) м (→Пример) |
Shersh (обсуждение | вклад) (→Реализация: псевдокод в \mathtt) |
||
Строка 7: | Строка 7: | ||
<font color=green>// <tex>G</tex> {{---}} исходный граф</font> | <font color=green>// <tex>G</tex> {{---}} исходный граф</font> | ||
<font color=green>// <tex>w</tex> {{---}} весовая функция</font> | <font color=green>// <tex>w</tex> {{---}} весовая функция</font> | ||
− | '''function''' primFindMST(): | + | '''function''' <tex>\mathtt{primFindMST}():</tex> |
− | '''for''' v | + | '''for''' <tex>v \in V(G)</tex> |
− | key[v] = | + | <tex>\mathtt{key}[v]\ =\ \infty</tex> |
− | p[v] = ''null'' | + | <tex>\mathtt{p}[v]\ =</tex> ''null'' |
− | r = произвольная вершина графа G | + | <tex>r\ =</tex> произвольная вершина графа <tex>G</tex> |
− | key[r] = 0 | + | <tex>\mathtt{key}[r]\ =\ \mathtt{0}</tex> |
− | Q.push(V) | + | <tex>Q.\mathrm{push}(V(G))</tex> |
− | '''while not''' Q.isEmpty() | + | '''while not''' <tex>Q.\mathtt{isEmpty}()</tex> |
− | v = Q.extractMin() | + | <tex>v\ =\ Q.\mathtt{extractMin}()</tex> |
− | '''for''' vu | + | '''for''' <tex>vu \in E(G)</tex> |
− | '''if''' u | + | '''if''' <tex>u \in Q</tex> '''and''' <tex>\mathtt{key}[u] > w(v, u)</tex> |
− | p[u] = v | + | <tex>\mathtt{p}[u]\ =\ v</tex> |
− | key[u] = w(v, u) | + | <tex>\mathtt{key}[u]\ =\ w(v, u)</tex> |
− | Q.decreaseKey(u, key[u]) | + | <tex>Q.\mathrm{decreaseKey}(u, \mathtt{key}[u])</tex> |
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма.<br> | Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма.<br> |
Версия 12:40, 14 октября 2014
Алгоритм Прима (англ. Prim's algorithm) — алгоритм поиска минимального остовного дерева (англ. minimum spanning tree, MST) во взвешенном неориентированном связном графе.
Содержание
Идея
Данный алгоритм очень похож на алгоритм Дейкстры. Будем последовательно строить поддерево ответа в графе , поддерживая приоритетную очередь из вершин , в которой ключом для вершины является — вес минимального ребра из вершин в вершины . Также для каждой вершины в очереди будем хранить — вершину , на которой достигается минимум в определении ключа. Дерево поддерживается неявно, и его ребра — это пары , где , а — корень . Изначально пусто и значения ключей у всех вершин равны . Выберём произвольную вершину и присвоим её ключу значение . На каждом шаге будем извлекать минимальную вершину из приоритетной очереди и релаксировать все ребра , такие что , выполняя при этом операцию над очередью и обновление . Ребро при этом добавляется к ответу.
Реализация
//— исходный граф // — весовая функция function for null произвольная вершина графа while not for if and
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма.
Чтобы упростить операцию можно написать кучу на основе сбалансированного бинарного дерева поиска. Тогда просто удалим вершину и добавим ее обратно уже с новым ключом. Асимптотика таких преобразований . Если же делать с бинарной кучей, то вместо операции , будем всегда просто добавлять вершину с новым ключом, если из кучи достали вершину с ключом, значение которого больше чем у нее уже стоит, просто игнорировать. Вершин в куче будет не больше , следовательно, операция будет выполняться за , что равно . Максимальное количество вершин, которое мы сможем достать, равняется количеству ребер, то есть , поэтому общая асимптотика составит , что хорошо только на разреженных графах.
Пример
Рассмотрим работу алгоритма на примере графа. Пусть произвольно выбранная вершина — это вершина a.
Корректность
По поддерживаемым инвариантам после извлечения вершины лемме о безопасном ребре, оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно раз, корректен.
из ребро является ребром минимального веса, пересекающим разрез . Значит, поОценка производительности
Производительность алгоритма Прима зависит от выбранной реализации приоритетной очереди, как и в алгоритме Дейкстры. Извлечение минимума выполняется
раз, релаксация — раз.Структура данных для приоритетной очереди | Асимптотика времени работы |
---|---|
Наивная реализация | |
Двоичная куча | |
Фибоначчиева куча |
См. также
Источники информации
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн — Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.)
- Википедия — Алгоритм Прима
- Wikipedia — Prim's algorithm
- MAXimal :: algo :: Минимальное остовное дерево. Алгоритм Прима