29.12.2013 Aufrufe

Datenstrukturen und Algorithmen -

Datenstrukturen und Algorithmen -

Datenstrukturen und Algorithmen -

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!