Алгоритм Прима — различия между версиями
(→Идея) |
|||
| Строка 21: | Строка 21: | ||
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма. | Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма. | ||
| + | |||
| + | == Корректность == | ||
| + | По поддерживаемым инвариантам после извлечения вершины <tex>v</tex> (<tex>v \neq r</tex>) из <tex>Q</tex> ребро <tex>\left(v,p(v)\right)</tex> является ребром минимального веса, пересекающим разрез <tex>\left(F,Q\right)</tex>. Значит, по [[Лемма о безопасном ребре|лемме о безопасном ребре]], оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно <tex>|V|-1</tex> раз, корректен. | ||
| + | |||
| + | == Оценка производительности == | ||
| + | Производительность алгоритма Прима зависит от выбранной реализации приоритетной очереди, как и в [[алгоритм Дейкстры|алгоритме Дейкстры]]. Извлечение минимума выполняется <tex>V</tex> раз, релаксация — <tex>O(E)</tex> раз. | ||
| + | |||
| + | {| border="1" cellpadding="5" cellspacing="0" style="text-align:center" width=30% | ||
| + | !style="background:#f2f2f2"|Структура данных для приоритетной очереди | ||
| + | !style="background:#f2f2f2"|Асимптотика времени работы | ||
| + | |- | ||
| + | |style="background:#f9f9f9"|Наивная реализация | ||
| + | |style="background:#f9f9f9"|<tex>O(V^2+E)</tex> | ||
| + | |- | ||
| + | |style="background:#f9f9f9"|Двоичная куча | ||
| + | |style="background:#f9f9f9"|<tex>O(E\log{V})</tex> | ||
| + | |- | ||
| + | |style="background:#f9f9f9"|Куча Фибоначчи | ||
| + | |style="background:#f9f9f9"|<tex>O(V\log{V}+E)</tex> | ||
| + | |} | ||
==Пример работы алгоритма== | ==Пример работы алгоритма== | ||
[[Файл:Prim1.jpg|right|400px|thumb|Граф "звезда" с расставленными весами ребер ]] | [[Файл:Prim1.jpg|right|400px|thumb|Граф "звезда" с расставленными весами ребер ]] | ||
| Строка 98: | Строка 118: | ||
|style="background:#FF0000"|71 | |style="background:#FF0000"|71 | ||
|style="background:#f9f9f9"|5 2 4 1 3 | |style="background:#f9f9f9"|5 2 4 1 3 | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
|} | |} | ||
Версия 19:24, 13 декабря 2011
Алгоритм Прима — алгоритм поиска минимального остовного дерева (minimum spanning tree, MST) во взвешенном неориентированном связном графе.
Содержание
Идея
Данный алгоритм очень похож на алгоритм Дейкстры. Будем последовательно строить поддерево ответа в графе , поддерживая приоритетную очередь из вершин , имеющую ключом для вершины вес минимального ребра из вершин в вершину . Также для каждой вершины очереди будем хранить — вершину , на которой достигается минимум в определении ключа. Дерево поддерживается неявно, а множество его ребер равно , где — корень . Изначально пусто, в очереди все вершины с ключами . Выберём произвольную вершину и присвоим её ключу . На каждом шаге будем извлекать минимальную вершину из приоритетной очереди и релаксировать все ребра , такие что , выполняя при этом и обновление . Ребро при этом добавляется к ответу.
Реализация
произвольная вершина в и
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма.
Корректность
По поддерживаемым инвариантам после извлечения вершины () из ребро является ребром минимального веса, пересекающим разрез . Значит, по лемме о безопасном ребре, оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно раз, корректен.
Оценка производительности
Производительность алгоритма Прима зависит от выбранной реализации приоритетной очереди, как и в алгоритме Дейкстры. Извлечение минимума выполняется раз, релаксация — раз.
| Структура данных для приоритетной очереди | Асимптотика времени работы |
|---|---|
| Наивная реализация | |
| Двоичная куча | |
| Куча Фибоначчи |
Пример работы алгоритма
Таблица соответствует работе алгоритма на графе с картинки.
| № шага | key[] | p[] | ||||
| 1 | 2 | 3 | 4 | 5 | ||
| 1) | ||||||
| 2) | 0 | 1 | ||||
| 3) | 0 | 7 | 14 | 1 3 | ||
| 4) | 0 | 7 | 14 | 71 | 4 1 3 | |
| 5) | 0 | 2 | 7 | 14 | 71 | 2 4 1 3 |
| 6) | 0 | 2 | 7 | 14 | 71 | 5 2 4 1 3 |
См. также
Литература
- Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.)
