next up previous contents
Next: Kürzeste Pfade Up: Grundlagen Previous: Prim's Algorithmus, erste Variante

Prim's Algorithmus, zweite Variante

Idee: Lasse die Priority Queues nicht zu groß werden.
Sei $G=(V,E),\ \vert V\vert=n,\ \vert E\vert=m$, w Gewichtsfunktion, k Parameter, der unten festgelegt wird.
Der Algorithmus wird in den folgenden Phasen abgearbeitet:
1.
Initialisiere eine Schlange von Bäumen, jeder Baum anfangs (Super-) Knoten. Zu jedem Baum: Priority Queue (Fibonacci-Heap) mit den Nachbarn der Knoten im Baum, die selbst nicht im Baum sind. Schlüssel: Gewicht einer leichtesten Kante zu einem Knoten im Baum.
2.
Markiere jeden Baum in der Schlange mit der Nummer der laufenden Phase
3.

while vorderster Baum in der Schlange hat laufende Phasennummer do lasse ihn wachsen, solange seine Priority Queue weniger als k Elemente enthält (und noch was zu tun ist) if Priority Queue zu groß then füge Baum mit Phasennummer + 1 am Ende der Schlange ein fi od

4.
Falls ,,Phasensprung``: Schrumpfe alle Bäume zu Superknoten, reduziere Kantenmenge (Behalte zwischen zwei Knoten, jeweils nur die leichteste Kante).
5.
nächste Phase!
\includegraphics {eps/3_21.eps}
Betrachte Schlange von Bäumen:


\begin{picture}
(85,25)
 
\color [rgb]{0,0.4,0}
 
 \put(10,10){\circle{10}}
 \be...
 ...1){5}}
 \put(35,0){\circle*{1}}
 \put(32.5,21){\makebox(5,5)[b]{v}}\end{picture}

(Arbeit pro Phase $\sim$ # Knoten, außer Vereinigung zweier Superknoten T1 und T2.)
Für jeden (Super-)Knoten v in T2's Priority Queue:
1.
$v \in T_1$: $\surd$ (nichts zu tun)
2.
v in Priority Queue von T1, einfügen bzw. conditional DecreaseKey . Hilfsdatenstruktur: für alle Knoten in den Priority Queues ein Zeiger auf den Superknoten, in dessen Priority Queue der Knoten letztmals am Anfang der Schlange stand.
3.
sonst: Einfügen
Betrachte Knoten mit ,,Halbkanten``: jede Halbkante kommt nur 1x in den Bäumen vor. Mit m Kanten ergeben sich 2m Halbkanten, d.h. Anzahl proportional zu m.


\begin{picture}
(90,25)
 \put(0,0){\makebox(10,10){\shortstack{$m$\\ Kanten}}}
 ...
 ...12.5)(62.5,12.5)(62.5,10)
 \bezier{50}(67.5,20)(67.5,17.5)(70,17.5)\end{picture}

Zeitaufwand pro Phase: (+ Superknoten zu Beginn) Da die Priority Queues höchstens k Elemente enthalten, wenn darauf eine Priority Queue-Operation durchgeführt wird, sind die Kosten pro Phase

\begin{displaymath}
\mathcal{O}(t \log k + m)\end{displaymath}

Setze $k=2^{\frac{2m}{t}}$ (damit $t \log k = m$). Damit sind die Kosten pro Phase $\mathcal{O}(m)$.

Wieviele Phasen? Sei t die Anzahl der Superknoten am Anfang einer Phase, t' diese Zahl zu Beginn der nächsten Phase. Sei a die durchschnittliche Anzahl ursprünglicher Knoten in den t Priority Queues zu Anfang der Phase, a' entsprechend zu Beginn der nächsten Phase.

Wir haben:
1.
$a = \frac{2m}{t}$
2.
$t' \leq \frac{2m}{k}$ (mit Ausnahme ev. der letzten Phase)
Also:

\begin{displaymath}
a' = \frac{2m}{t'} \geq k = 2^{\frac{2m}{t}} = 2^a\end{displaymath}

Für die erste Phase ist $a=\frac{2m}{n}$, a ist für jede Phase $\leq n-1$. Also ist die Anzahl der Phasen

\begin{displaymath}
\leq 1 + \min \left\{ i; \log_2^{(i)}(n-1) \leq \frac{2m}{n} \right\}\end{displaymath}

Setzen wir $\beta(m,n) := \min \left\{ i; \log_2^{(i)}n \leq \frac{m}{n}
\right\}$, dann gilt

\begin{displaymath}
\beta(m,n) \leq \log^* n \text{ f\uml {u}r } n \leq m \leq \binom{n}{2}\end{displaymath}




\fbox {\parbox[c]{12.45cm}{\textbf{Satz:}
F\uml {u}r gewichtete, zusammenh\uml {...
 ...\mathcal{O}(\min\{m \cdot
\beta(m,n),m+n \log n \} )$\space bestimmt werden.
}}


Euklidische minimale Spannbäume stellen ein Problem dar, für das es speziellere Algorithmen gibt. Literatur hierzu:
A.C.-C. Yao: Constructing Minimum Spanning Trees in k-dimensional spaces and related problems. SIAM Journal on Computing $\underline{11}$(4) p. 721-736 (1982).


next up previous contents
Next: Kürzeste Pfade Up: Grundlagen Previous: Prim's Algorithmus, erste Variante
Abbas-Bardia Kabiri-Jarghouyeh
3/3/1999