11.07.2015 Aufrufe

Effiziente Algorithmen

Effiziente Algorithmen

Effiziente 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.

<strong>Effiziente</strong><strong>Algorithmen</strong>Hartmut KlauckUniversität FrankfurtSS 0623.5.


Minimale Spannbäume Definition• In einem ungerichteten,zusammenhängenden Graphen G heisseeine Teilmenge von Kanten ein spannenderBaum, wenn• Die Kanten einen Baum bilden• Jeder Knoten von G in dem Baum liegt• Wenn die Kanten von G mit nichtnegativenGewichten belegt sind ist ein minimalerSpannbaum ein spannender Baum mitminimaler Summe der Kantengewichte


Minimale Spannbäume Motivation: Maß für Verbindungskosten inNetzwerken• Verlege Kabel etc. an den Kanten desminimalen Spannbaums Problem wurde zuerst von Boruvka 1926untersucht Weitere <strong>Algorithmen</strong>: Kruskal, Prim Eingabeformat: Adjazenzliste mit Gewichten


Minimale Spannbäume Generischer Algorithmus:• Fange an mit leerer Menge von Kanten• Füge Kanten ein, wobei die aktuelleKantenmenge immer eine Teilmenge einesminimalen Spannbaums ist• Eine Kante, die so eingefügt werden kann,nennen wir sicher


Sichere KantenSchwierigkeit besteht darin, sichere Kanten zu findenDefinition:• Ein Schnitt S, V-S ist eine Partition derKnotenmenge V• Eine Kantenmenge respektiert den Schnitt, wennkeine der Kante den Schnitt kreuzt• Eine Kante heisst leicht für einen Schnitt, wenn siedie Kante mit kleinstem Gewicht ist, welche denSchnitt kreuzt• Eine Kante heisst leicht, wenn sie leicht für eineMenge von Schnitten ist (z.B. alle Schnitte, die Arespektiert)


Sichere Kanten Theorem 11.1:Sei G ungerichtet, zusammenhängend, mitKantengewichten. Sei A eine Teilmenge einesminimalen Spannbaums in G. Sei (S, V-S) irgendeinSchnitt, den A respektiert. Dann ist eine leichteKante e für (S, V-S) auch sicher.Beweis:• Sei T ein minimaler Spannbaum, der A enthält• T enthalte e nicht (sonst sind wir fertig)• Wir konstruieren einen anderen Spannbaum, der Aund e enthält, und ebenfalls minimal ist.


Sichere Kanten Die Kante e={u,v} , in T eingefügt ergibt einen Kreis pin T∪{e}. u und v liegen auf verschiedenen Seiten des Schnitts Es gibt also noch eine Kante e‘ in T, die den Schnittkreuzt. e‘ liegt nicht in A, da A den Schnitt respektiert Entferne e‘, dadurch bricht T in zwei Teile Zufügen von e verbindet T wieder, zu einem Baum T‘ W(e)=W(e‘) für die Gewichtsfunktion W, daher ist T‘minimal Somit ist A∪ {e} eine Teilmenge von T ‘ D.h. e ist sicher für A


Welche Kanten liegen nichtin min. Spannbäumen? Theorem 11.2:• G sei ein Graph mit Gewichten W.Seien alle Kantengewichte unterschiedlich.Sei C ein Kreis in G und e={u,v} die teuerste Kante in C.Dann liegt C in keinem minimalen Spannbaum in G.Beweis:• Angenommen e liegt auf einem minimalen Spannbaum T• Entferne e aus T• Wir erhalten zwei Bäume• Die Knoten der Bäume bilden einen Schnitt in G• Folge C-{e} von u nach v• Dieser Weg kreuzt irgendwann den Schnitt mit einerKante e‘• T-{e}∪{e‘} ist ein Spannbaum mit geringerem Gewicht alsT, Widerspruch


<strong>Algorithmen</strong> Wir füllen zunächst das Skelett desgenerischen Algorithmus‘ auf zwei Arten• Prim: A ist immer ein Baum• Kruskal: A ist ein Wald (Menge vonBäumen), der „zusammenwächst“


Datenstruktur Union-Find Wir verwenden eine Datenstruktur fürMengen mit den folgenden Operationen:• Make-Set(v):erzeugt eine Menge {v}, indiziert durch v• Find-Set(v):zu einem Element v finde den Index derMenge, die es enthält• Union(u,v):Als Ergebnis ist die Vereinigung derMengen, die durch u und v indiziert sindjetzt mit u oder mit v indiziert


Kruskal1. Eingabe: Graph G, Gewichte W2. A=∅3. Für jeden Knoten va) Make-Set(v)4. Sortiere die Kanten in E aufsteigend nach Gewicht5. Für jede Kante (u,v), aufsteigend nach Gewichta) Wenn Find-Set(u)≠ Find-Set(v), dannA:=A∪ {(u,v)}b) Union (u,v)6. Ausgabe A


Implementierung UnionFindEinfache Implementierung der DatenstrukturUniversum mit n Elementen• Array M mit n Einträgen• Mengen sind durch Bäume repräsentiert, alsPointer zur Wurzel im Array gespeichert.• MakeSet(v) für alle v: M(v)=v für alle v• Union(u,v): Setze M(v)=u, wenn die Menge von ugrösser als die Menge von v ist.• Find(v): Folge den Pointern ab M(v), bis M(u)=uerreicht, gebe u aus• Zusätzlich speichern wie für jeden Knoten, dereine Wurzel ist die Grösse seiner Menge in einemArray G(v), bei Union entsprechend update


Laufzeiten Union FindMakeSet: O(n) insgesamtUnion: O(1)Find: entspricht maximaler Tiefe der BäumeTiefe ist O(log n):Behauptung:Bei Grösse g ist die Tiefe · log g:Beweis: Zu Beginn klar.Wenn Menge von u und Menge von v mit Grössen a und b undTiefen q· log a und r· log b zusammenkommen:Neuer Baum hat Grösse a+b• Gelte O.B.d.A. a · b. 3 Fälle:• r < q, dann neue Tiefe q · log a · log (a+b)• r = q, dann neue Tiefe q+1, aber a≥ 2 q , b≥ 2 q , a+b≥2 r +2 q =2 q+1 , also neue Tiefe · log (a+b)• r>q, es gilt a≥ b≥ 2 r , neue Tiefe ist r+1, a+b≥ 2 r+1 , also neueTiefe · log (a+b)


Kruskal1. Eingabe: Graph G, Gewichte W2. A=∅3. Für jeden Knoten va) Make-Set(v)4. Sortiere die Kanten in E aufsteigend nach Gewicht5. Für jede Kante (u,v), aufsteigend nach Gewichta) Wenn Find-Set(u)≠ Find-Set(v), dannA:=A∪ {(u,v)}b) Union (u,v)6. Ausgabe A


Laufzeit Kruskal Wir erhalten so:• bis 3: O(n)• 4: O(m log n)• 5: O(m log n)• Insgesamt O(n+m log n)


Korrektheit Wir müssen nur zeigen, dass die Kanten, dieeingefügt werden immer sicher sind.• Wähle einen Schnitt, der A respektiert,und den die neue Kante kreuzt• Neue Kante ist Kante mit minimalenGewicht unter allen Kanten, die nochkeinen Kreis bilden• Also ist neue Kante sicher.


PrimIn Prim‘s Algorithmus bilden Kanten in A immer einenBaumWir verwenden eine Prioritätswarteschlange wie inDijkstra:• Operationen:• Init: initialisiert Datenstruktur• ExtractMin: Entfernt minimalen Schlüssel• DecreaseKey(v,k): Verringere einen Schlüssel• Einfache Implementierung mit Heap:• Init: O(n)• Extract Min: O(log n)• DecreaseKey: O(log n)


Prim Eingabe: Graph G, Gewichte W, Wurzel r Ausgabe: minimaler Spannbaum als ArrayA={(v, π(v)): v=1,…,n} von Vorgängern1. Für alle v∈ V setze key(v)=∞und π(v)=NIL2. key(r)=03. Init: Bilde Priority Queue Q4. Während Q nichtleer:a) u=ExtractMinb) Für alle Nachbarn v von u:i. Wenn v in Q liegt, und key(v) > W(u,v) dannπ(v)=u und key(v):=W(u,v)


Laufzeit Prim Einmal Init, n mal ExtractMin und m malDecreaseKey Insgesamt O( (n+m) log n) bei HeapImplementierung Prioritätswarteschlange kann auch soimplementiert werden, dass m DecreaseKeyOperationen O(m) Zeit brauchen[amortisierte Analyse] Dann Laufzeit O(n log n +m) Insbesondere, wenn m≥ n log n, dannLinearzeit


KorrektheitEs gilt:• A bildet immer einen Baum• Für Knoten v in Q entspricht key(v) dem Gewicht einerleichten Kante, die in den Baum A führt (wenn key(v)

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!