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