29.12.2013 Aufrufe

Datenstrukturen und Algorithmen -

Datenstrukturen und Algorithmen -

Datenstrukturen und Algorithmen -

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Minimale Spannbäume<br />

Minimale Spannbäume<br />

Drei Prioritätswarteschlangenimplementierungen<br />

T (n, m) ∈ O (n·T (insert)+n·T (getMin)+n·T (delMin)+m·T (decrKey))<br />

Implementierung<br />

Operation unsortiertes Array sortiertes Array Heap<br />

isEmpty(pq) Θ(1) Θ(1) Θ(1)<br />

insert(pq,e,k) Θ(1) Θ(n) Θ(log n)<br />

getMin(pq) Θ(n) Θ(1) Θ(1)<br />

delMin(pq) Θ(n) Θ(1) Θ(log n)<br />

getElt(pq,k) Θ(n) Θ(log n) Θ(n)<br />

decrKey(pq,e,k) Θ(n) Θ(1) Θ(log n) Θ(log n)<br />

Prim<br />

O(n 2 + m·n)<br />

O(n 2 + m)<br />

O(n 2<br />

+ m log n)<br />

O(n log n<br />

+ m log n)<br />

◮ Leider kann m ∈ Θ(n 2 ) sein, wodurch Prim schlechter als O(n 2 ) wird.<br />

◮ Können wir vielleicht decrKey schneller machen? – Ja.<br />

Joost-Pieter Katoen <strong>Datenstrukturen</strong> <strong>und</strong> <strong>Algorithmen</strong> 25/21<br />

Minimale Spannbäume<br />

Minimale Spannbäume<br />

Prioritätswarteschlange, die Vierte (I)<br />

Wie erhalten wir Θ(1) für decrKey?<br />

⇒ Indem wir die Priorität direkt bei den Knoten speichern.<br />

◮ Wir kennen das bereits von color bei DFS <strong>und</strong> BFS.<br />

◮ Gleichzeitig können wir so direkt die verwendete Kante (→ Ergebnis)<br />

speichern (als Vorgängerbaum, vgl. Kritische-Pfad-Analyse):<br />

1 struct VertexState {<br />

2 int color;<br />

3 int parent;<br />

4 float curWeight;<br />

5 }<br />

7 VertexState state[n]; // enthält color[n]<br />

◮ Das entspricht der Prioritätswarteschlangenimplementierung auf<br />

unsortierten Arrays, allerdings mit „Löchern“.<br />

◮ Nur die Einträge mit color == GRAY (Randknoten) sind in der<br />

Warteschlange gesetzt <strong>und</strong> zwar mit Priorität curWeight.<br />

Joost-Pieter Katoen <strong>Datenstrukturen</strong> <strong>und</strong> <strong>Algorithmen</strong> 26/21<br />

Minimale Spannbäume<br />

Minimale Spannbäume<br />

Prioritätswarteschlange, die Vierte (II)<br />

◮ Die Implementierung operiert direkt auf state.<br />

1 // man könnte das etwa so schreiben:<br />

2 VertexState state[n];<br />

3 PriorityQueue pq = VS_PriorityQueue(&state);<br />

◮ In pq.decrKey(int elem, VertexState &newkey) muss nur<br />

state[elem] mit newkey überschrieben werden (außer color).<br />

⇒ Θ(1)<br />

◮ Zum Einfügen (pq.insert(int elem, VertexState &key)) wird<br />

color = GRAY gesetzt <strong>und</strong> der Rest von key übernommen.<br />

◮ Löschen (pq.delMin()) setzt einen Knoten auf color = BLACK.<br />

◮ Als Elemente halten wir also die Nummer des entsprechenden<br />

Randknotens (int); als Schlüssel sozusagen VertexState, wobei<br />

curWeight daraus als Priorität verwendet wird.<br />

◮ Wir ergänzen außerdem noch zwei Operationen:<br />

Θ(1)<br />

Minimale Spannbäume<br />

Minimale Spannbäume<br />

Prioritätswarteschlange, die Vierte (III)<br />

Prioritätswarteschlange<br />

◮ bool pq.isEmpty()<br />

◮ void pq.insert(int elem, VertexState &key)<br />

◮ float pq.getMin()<br />

◮ void pq.delMin()<br />

Θ(n)<br />

Θ(1)<br />

Θ(n)<br />

Θ(n)<br />

◮ void pq.decrKey(int elem, VertexState &newkey) setzt den<br />

Schlüssel von elem auf newkey; newkey.curWeight muss kleiner als<br />

beim bisherigen Schlüssel von elem sein.<br />

Θ(1)<br />

◮ int pq.getColor(int elem) gibt color von elem zurück.<br />

elem muss dazu nicht in der Warteschlange sein.<br />

Θ(1)<br />

◮ float pq.getWeight(int elem) gibt curWeight von elem zurück.<br />

elem muss dazu nicht in der Warteschlange sein.<br />

Θ(1)<br />

Joost-Pieter Katoen <strong>Datenstrukturen</strong> <strong>und</strong> <strong>Algorithmen</strong> 27/21<br />

Joost-Pieter Katoen <strong>Datenstrukturen</strong> <strong>und</strong> <strong>Algorithmen</strong> 28/21

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!