<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://nerc.itmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=94.25.196.19&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="https://nerc.itmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=94.25.196.19&amp;*"/>
		<link rel="alternate" type="text/html" href="https://nerc.itmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/94.25.196.19"/>
		<updated>2026-11-05T06:57:52Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://nerc.itmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9F%D1%80%D0%B8%D0%BC%D0%B0&amp;diff=18441</id>
		<title>Алгоритм Прима</title>
		<link rel="alternate" type="text/html" href="https://nerc.itmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9F%D1%80%D0%B8%D0%BC%D0%B0&amp;diff=18441"/>
				<updated>2012-02-27T19:17:46Z</updated>
		
		<summary type="html">&lt;p&gt;94.25.196.19: /* Оценка производительности */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Алгоритм Прима''' — алгоритм поиска [[Лемма о безопасном ребре#Минимальное остовное дерево|минимального остовного дерева]] (minimum spanning tree, MST) во взвешенном неориентированном связном графе.&lt;br /&gt;
&lt;br /&gt;
== Идея ==&lt;br /&gt;
Данный алгоритм очень похож на [[алгоритм Дейкстры]]. Будем последовательно строить поддерево &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; ответа в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, поддерживая приоритетную очередь &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; из вершин &amp;lt;tex&amp;gt;G \setminus F&amp;lt;/tex&amp;gt;, имеющую ключом для вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; величину &amp;lt;tex&amp;gt;\min\limits_{u \in VF, uv \in EG}w(uv)&amp;lt;/tex&amp;gt; (вес минимального ребра из вершин &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; в вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;). Также для каждой вершины очереди будем хранить &amp;lt;tex&amp;gt;p(v)&amp;lt;/tex&amp;gt; — вершину &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt;, на которой достигается минимум в определении ключа. Дерево &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; поддерживается неявно, и его ребра — это пары &amp;lt;tex&amp;gt;\left(v,p(v)\right)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;v \in G \setminus \{r\} \setminus Q&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; — корень &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Изначально &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; пусто, в очереди все вершины с ключами &amp;lt;tex&amp;gt;+\infty&amp;lt;/tex&amp;gt;. Выберём произвольную вершину &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; и присвоим её ключу &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. На каждом шаге будем извлекать минимальную вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; из приоритетной очереди и релаксировать все ребра &amp;lt;tex&amp;gt;vu&amp;lt;/tex&amp;gt;, такие что &amp;lt;tex&amp;gt;u \in Q&amp;lt;/tex&amp;gt;, выполняя при этом операцию &amp;lt;tex&amp;gt;\text{decrease-key}&amp;lt;/tex&amp;gt; над очередью и обновление &amp;lt;tex&amp;gt;p(v)&amp;lt;/tex&amp;gt;. Ребро &amp;lt;tex&amp;gt;\left(v,p(v)\right)&amp;lt;/tex&amp;gt; при этом добавляется к ответу.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
 '''&amp;lt;tex&amp;gt;\text{Prim}(G, w)&amp;lt;/tex&amp;gt;'''&lt;br /&gt;
    &amp;lt;tex&amp;gt;for&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;v \in V[G]&amp;lt;/tex&amp;gt;&lt;br /&gt;
        &amp;lt;tex&amp;gt; key[v] \leftarrow \infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
        &amp;lt;tex&amp;gt;p[v] \leftarrow \text{NIL}&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;r \leftarrow &amp;lt;/tex&amp;gt; произвольная вершина в &amp;lt;tex&amp;gt;V[G]&amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;key[r] \leftarrow 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;Q \leftarrow V[G] &amp;lt;/tex&amp;gt;&lt;br /&gt;
    &amp;lt;tex&amp;gt;while&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; Q \neq \emptyset &amp;lt;/tex&amp;gt;&lt;br /&gt;
        &amp;lt;tex&amp;gt;v \leftarrow \text{extract-min}(Q) &amp;lt;/tex&amp;gt;&lt;br /&gt;
        &amp;lt;tex&amp;gt;for&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt; u \in Adj[v] &amp;lt;/tex&amp;gt;&lt;br /&gt;
            &amp;lt;tex&amp;gt;if&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;u \in Q&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;key[u] &amp;gt; w(v, u) &amp;lt;/tex&amp;gt;&lt;br /&gt;
                &amp;lt;tex&amp;gt; p[u] \leftarrow v &amp;lt;/tex&amp;gt;&lt;br /&gt;
                &amp;lt;tex&amp;gt;key[u] \leftarrow w(v, u)&amp;lt;/tex&amp;gt;&lt;br /&gt;
                &amp;lt;tex&amp;gt;\text{decrease-key}(Q, u, key[u]) &amp;lt;/tex&amp;gt;&lt;br /&gt;
Ребра дерева восстанавливаются из его неявного вида после выполнения алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Корректность ==&lt;br /&gt;
По поддерживаемым инвариантам после извлечения вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;v \neq r&amp;lt;/tex&amp;gt;) из &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt; ребро &amp;lt;tex&amp;gt;\left(v,p(v)\right)&amp;lt;/tex&amp;gt; является ребром минимального веса, пересекающим разрез &amp;lt;tex&amp;gt;\left(F,Q\right)&amp;lt;/tex&amp;gt;. Значит, по [[Лемма о безопасном ребре|лемме о безопасном ребре]], оно безопасно. Алгоритм построения MST, добавляющий безопасные ребра, причём делающий это ровно &amp;lt;tex&amp;gt;|V|-1&amp;lt;/tex&amp;gt; раз, корректен.&lt;br /&gt;
&lt;br /&gt;
== Оценка производительности ==&lt;br /&gt;
Производительность алгоритма Прима зависит от выбранной реализации приоритетной очереди, как и в [[алгоритм Дейкстры|алгоритме Дейкстры]]. Извлечение минимума выполняется &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; раз, релаксация — &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt; раз.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;text-align:center&amp;quot; width=30%&lt;br /&gt;
!style=&amp;quot;background:#f2f2f2&amp;quot;|Структура данных для приоритетной очереди&lt;br /&gt;
!style=&amp;quot;background:#f2f2f2&amp;quot;|Асимптотика времени работы&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#f9f9f9&amp;quot;|Наивная реализация&lt;br /&gt;
|style=&amp;quot;background:#f9f9f9&amp;quot;|&amp;lt;tex&amp;gt;O(V^2+E)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#f9f9f9&amp;quot;|[[Двоичная куча]]&lt;br /&gt;
|style=&amp;quot;background:#f9f9f9&amp;quot;|&amp;lt;tex&amp;gt;O(E\log{V})&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background:#f9f9f9&amp;quot;|[[Фибоначчиевы кучи]]&lt;br /&gt;
|style=&amp;quot;background:#f9f9f9&amp;quot;|&amp;lt;tex&amp;gt;O(V\log{V}+E)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Алгоритм Краскала]]&lt;br /&gt;
* [http://www.mincel.com/java/prim.html Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* ''Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд'' '''Алгоритмы: построение и анализ''', 2-е издание. Пер. с англ. — М.:Издательский дом &amp;quot;Вильямс&amp;quot;, 2010. — с.653 — 656.— ISBN 978-5-8459-0857-5 (рус.)&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Остовные деревья ]]&lt;/div&gt;</summary>
		<author><name>94.25.196.19</name></author>	</entry>

	</feed>