Datenstrukturen und Algorithmen -
Datenstrukturen und Algorithmen -
Datenstrukturen und Algorithmen -
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Minimale Spannbäume<br />
Minimale Spannbäume<br />
Korrektheit von Prim’s Algorithmus – Beweis<br />
Minimale Spannbäume<br />
Korrektheit<br />
Minimale Spannbäume<br />
Beweis. (Forts.)<br />
Induktionsschritt:<br />
2. (x, y) ∈ {(u 2 , v), . . . , (u m , v)} mit m > 2. Betrachte den Pfad von<br />
v nach u i (1 < i m) in T k : v w<br />
}{{} 1 w 2 . . . w l . Nimm an, daß<br />
}{{}<br />
=u 1 =u i<br />
(w j , w j+1 ) die erste Kante auf diesem Pfad ist mit<br />
W (w i , w i+1 ) > W (u i , v). Sei (w p−1 , w p ) die letzte Kante auf dem<br />
Pfad mit W (w p−1 , w p ) > W (u i , v). (Möglicherweise gilt<br />
p = j+1.) Wir zeigen, dass w j <strong>und</strong> w p nicht in T k−1 existieren<br />
können. (Siehe Vorlesung.) Damit hat keine Kante auf dem Pfad<br />
w 1 . . . w l ein größeres Gewicht als W (u i , v), <strong>und</strong> damit auch nicht<br />
größer als W (u 1 , v). Also, hat T k die MST-Eigenschaft.<br />
Korrektheit<br />
Der Algorithmus von Prim bestimmt einen minimalen Spannbaum.<br />
Beweis.<br />
Sei G = (V , E) <strong>und</strong> |V | = n Anzahl der Knoten.<br />
◮ Sei T n der durch Prim berechnete Baum. Dann ist G n = G, <strong>und</strong> es<br />
folgt – siehe letztes Theorem – dass T n die MST-Eigenschaft hat.<br />
◮ Da T n die MST-Eigenschaft hat gdw. es ein MST ist, folgt: T n ist ein<br />
MST.<br />
Joost-Pieter Katoen <strong>Datenstrukturen</strong> <strong>und</strong> <strong>Algorithmen</strong> 21/21<br />
Joost-Pieter Katoen <strong>Datenstrukturen</strong> <strong>und</strong> <strong>Algorithmen</strong> 22/21<br />
Minimale Spannbäume<br />
Minimale Spannbäume<br />
ADT zum Vorhalten der Randknoten (I)<br />
Die benötigten Operationen für den Algorithmus von Prim sind:<br />
◮ Wähle eine billigste Kante zu einem Randknoten (Kantenkandidat).<br />
◮ Reklassifiziere einen Randknoten als Baumknoten (füge den<br />
Kantenkandidat zum Baum hinzu).<br />
◮ Ändere die Kosten (Randgewicht) eines Randknotens, wenn ein<br />
günstigerer Kantenkandidat gef<strong>und</strong>en wird.<br />
Idee: Ordne die Randknoten nach ihrer Priorität (= Randgewicht).<br />
Prioritätswarteschlange (priority queue)<br />
◮ PriorityQueue pq;<br />
◮ pq.insert(int e, int k), int pq.getMin(), pq.delMin()<br />
◮ void pq.decrKey(int e, int k) setzt den Schlüssel von Element e<br />
auf k; k muss kleiner als der bisherige Schlüssel von e sein.<br />
⇒ Wir entscheiden uns für die Prioritätswarteschlange als Datenstruktur<br />
für die Randknoten.<br />
Joost-Pieter Katoen <strong>Datenstrukturen</strong> <strong>und</strong> <strong>Algorithmen</strong> 23/21<br />
Minimale Spannbäume<br />
Vorläufige Komplexitätsanalyse<br />
Im Worst-Case:<br />
Minimale Spannbäume<br />
◮ Jeder Knoten muss zur Prioritätswarteschlange hinzugefügt werden.<br />
◮ Auf jeden Knoten muss auch wieder zugegriffen werden <strong>und</strong> er muss<br />
gelöscht werden.<br />
◮ Die Priorität eines Randknotens muss nach jeder gef<strong>und</strong>enen Kante<br />
angepasst werden.<br />
Bei einem Graph mit n Knoten <strong>und</strong> m Kanten ergibt sich:<br />
T (n, m) ∈ O (n·T (insert)+n·T (getMin)+n·T (delMin)+m·T (decrKey))<br />
◮ Welche Implementierung der Prioritätswarteschlange ist dafür gut<br />
geeignet?<br />
Joost-Pieter Katoen <strong>Datenstrukturen</strong> <strong>und</strong> <strong>Algorithmen</strong> 24/21