Gliederung 1. Motivation / Grundlagen 2. Sortierverfahren 3. Elementare Datenstrukturen / Anwendungen 4. äume / Graphen. Hashing 6. Algorithmische Geometrie 4/6, Folie 1 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u Motivation (Teil 1) gegeben: seien n Städte (/* hier A,,...,E */) und damit ein ungerichteter Graph G (/* in dem zwischen je zwei Städten eine Kante vorkommt */) C A D E gesucht: Teilgraph G von G, in dem es eine Verbindung von jeder Stadt zu jeder anderen Stadt gibt (/* Telefon- bzw. Stromleitungsnetz */) 4/6, Folie 2 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u Motivation (Teil 1, cont.)... mögliche Lösungen C A C A D E D E 4/6, Folie 3 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u Grundbegriffe es sei G = (V,E) ein ungerichteter Graph G ist zusammenhängend, falls es zu je zwei Knoten x,y V einen Weg w = (v 1,v 2,...,v n-1,v n ) von x nach y in G gibt (/* d.h. v 1 = v und v n = v und { v i,v i+1 } E für alle i mit 1 i n - 1 */) G hat einen Kreis, falls es einen Knoten x V und einen Weg w = (v 1,v 2,...,v n-1,v n ) mit n > 3 von x nach x gibt (/* d.h. v 1 = v n =x */), in dem jeder Knoten außer x nur einmal vorkommt es sei der Graph G = (V,E ) ein Teilgraph von G (/* d.h. es gilt E V V, V V, und E E */) G = (V,E ) ist ein aufspannender aum von G, falls gilt: V = V G ist kreisfrei G ist zusammenhängend. 4/6, Folie 4 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u Illustration C A C A D E D E C A D E 4/6, Folie 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u eine einfache eobachtung es sei G = (V,E) ein ungerichteter Graph mit n Knoten und G = (V,E ) ein aufspannender aum in G Dann hat G genau n - 1 viele Kanten.... falls G weniger Kanten hat, kann G nicht zusammenhängend sein... falls G mehr Kanten hat, kann G nicht kreisfrei sein 4/6, Folie 6 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u Aufgabenstellung Eingabe: Ausgabe: ein ungerichteter zusammenhängender Graph G = (V,E) ein aufspannender aum G = (V,E ) in G... später betrachten wir dieselbe Aufgabenstellung für kantenbewertete ungerichtete zusammenhängende Graphen und sind daran interessiert, einen aufspannenden aum mit minimalem Gewicht zu bestimmen 4/6, Folie 7 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u Motivation (Teil 2) gegeben: seien n Städte (/* hier A,,...,E */) und damit ein ungerichteter Graph G (/*... und die Kanten haben die Entfernungen zwischen den Städten als Gewichte */) 3 C A 3 D E gesucht: Teilgraph G von G, in dem es eine Verbindung von jeder Stadt zu jeder anderen Stadt gibt und die Gesamtlänge der Verbindungen minimal sein soll 4/6, Folie 8 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u Motivation (Teil 2, cont.)... eine Lösung (/* Gesamtlänge der Verbindungen = 20 */)... beste Lösung (/* Gesamtlänge der Verbindungen = 16 */) 3 3 C 3 A C 3 A D E D E 4/6, Folie 9 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u Datenstruktur eine Menge M von Kanten (/* dient zur Verwaltung der in G potentiell aufzunehmenden Kanten */) 4/6, Folie 10 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u erste algorithmische Idee (1) setze M = E und V = und E = (2) solange E < V - 1 a) wähle eine Kante e = { x,y } aus M und streiche e aus M b) setze V* = V { x,y } und E* = E { e } c) teste, ob der Graph G* = (V*,E*) kreisfrei ist falls ja, so setze V = E* und E = E* falls nein, so ändere V und E nicht... die Laufzeit hängt offenbar davon ab, wie effizient man in c) testen kann, ob G* = (V*,E*) kreisfrei ist... Verfeinerung: diesen Test möglichst einfach realisieren 4/6, Folie 11 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u Hintergrund für eine Verfeinerung der algorithmischen Idee es sei G = (V,E) ein ungerichteter Graph es seien die Graphen G 1 = (V 1,E 1 ) und G 2 = (V 2,E 2 ) kreisfreie zusammenhängende Teilgraphen von G mit V 1 V 2 = es sei e = { x,y } E mit x V 1 und y V 2 Dann ist G* = (V*,E*) mit V* = V 1 V 2 und E* = E 1 E 2 { e } ein kreisfreier zusammenhängender Teilgraph von G. G... es ist offenbar essentiell V 1 und V 2 zu kennen und die Menge E 1 E 2 4/6, Folie 12 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u Illustration G 1 = (V 1,E 1 ) G 2 = (V 2,E 2 ) C A C A D E D E C A G* = (V*,E*), wobei e = {,E } ist D E 4/6, Folie 13 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u Grundbegriff es sei O eine Menge von Objekten es sei K = { M 1,M 2,...,M k } (/* mit 1 k n */) eine Menge von nicht-leeren Teilmengen von O K ist eine Klasseneinteilung der Menge O, falls gilt: für alle alle i,j mit 1 i,j k gilt: M i M j = (/* die Mengen von K sind paarweise disjunkt */) O = M 1 M 2... M k (/* jedes Objekt aus O kommt in einer Menge von K vor */) 4/6, Folie 14 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen aufspannender äume u verfeinerte algorithmische Idee (1) setze M = E, E = und bilde die Klasseneinteilung K = { { x } x V } (2) solange E < V - 1 a) wähle eine Kante e = { x,y } aus M und streiche e aus M b) bestimme V 1,V 2 K mit x V 1 und y V 2 c) teste, ob V 1 V 2 gilt falls ja, so setze E = E { e }, streiche V 1 und V 2 aus der Klasseneinteilung K und füge die Menge V = V 1 V 2 zur Klasseneinteilung K hinzu (/* für alle V* K ist der durch V* induzierte Teilgraph G* = (V*,E(V*)) kreisfrei und zusammenhängend; V(E*) = { { x,y } E x,y V* } */) falls nein, so ändere E nicht... zur Verwaltung der Klasseneinteilung K verwendet man eine spezielle Datenstruktur (/* Union-Find-Struktur genannt */) 4/6, Folie 1 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen minimal aufspannender äume u Illustration M = { { A, },{ A,C },{,C },{ A,D },... } E = K = { { A },{ },{ C },{ D },{ E } } C A M = { { A,C },{,C },{ A,D },... } E = { { A, } } K = { { A, },{ C },{ D },{ E } } D E M = { {,C },{ A,D },... } E = { { A, },{ A,C } } K = { { A,,C },{ D },{ E } } M = { { A,D },... } E = { { A, },{ A,C } } K = { { A,,C },{ D },{ E } } 4/6, Folie 16 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
Union-Find-Strukturen u Grundidee es sei O = { o 1,...,o n } die Grundmenge der betrachteten Objekte (/* in unserem Fall sind das die Knoten von G */) wir interessieren uns für die Verwaltung von Klasseneinteilungen K von O (/* d.h. K = { M 1,...,M k } mit M 1... M k = O und die Mengen M 1,...,M k sind paarweise disjunkt */) die Anzahl der verwalteten Mengen ändert sich über die Zeit zentrale Operation: Vereinigung disjunkter Mengen... Zugriff auf die Mengen??? 4/6, Folie 17 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
Union-Find-Strukturen u Namensgebung von Mengen o 1,...,o n dienen als Namen für die Einermengen { o 1 },...,{ o n } allgemein dient ein ausgezeichnetes Element o M als Name für eine Teilmenge M O u relevante Operation union(o i,o k ) Menge der verwalteten Mengen ändern, indem die Mengen mit den Namen o i bzw. o k vereinigt werden find(o) den Namen der Menge bestimmen, die aktuell das Objekt o enthält 4/6, Folie 18 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
Union-Find-Strukturen u Realisierung von Union-Find-Strukturen (/* konzeptionell */) repräsentiere Mengen als äume beliebiger Ordnung jeder Knoten hat ein Objekt als Label jeder Knoten hat einen Zeiger auf seinen Vater die Wurzel hat einen Zeiger auf sich selbst das Label der Wurzel dient als Name für diese Menge 4/6, Folie 19 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
Union-Find-Strukturen u Illustration einelementige Mengen 2 { 2 } mehrelementige Mengen 1 { 1,3,,7 } 3 7 4/6, Folie 20 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
Union-Find-Strukturen u Realisierung von Union-Find-Strukturen (/* konzeptionell */) Find-Operation... gib das Label der Wurzel des aums zurück, in dem das Objekt o gespeichert ist 4... find(6) = find(2) = find(4) = 4 6 2 { 2,4,6 } Union-Operation... mache die Wurzel das aums für die Menge o 2 zum Sohn der Wurzel des aums für die Menge o 1 4 1 4 1 6 2 3 6 2 3 { 2,4,6 } { 1,3 } = { 1,2,3,4,6 } 4/6, Folie 21 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
Union-Find-Strukturen u Implementierung von Union-Find-Strukturen (/* Version 1 */)... verwenden ein eindimensionales Array zur Repräsentation aller äume Väter 1 2 3 4 6 7 1 2 4 1 7 Objekte zugehörige Mengen: { 1,3,4 } { 2 } {,6 } { 7 } 4/6, Folie 22 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
Union-Find-Strukturen u Implementierung von Union-Find-Strukturen (/* Version 1 */) Initialisierung for ( int o = 1; o <= n; ++o ) v[o] = o;... in Zeit O(n) Union-Operation void union ( int o1, int o2 ) { v[o2] = o1; }... in Zeit O(1) Find-Operation int find ( int o ) { while ( v[o]!= o ) { o = v[o]; } return(o); }... in Zeit O(n) 4/6, Folie 23 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
Union-Find-Strukturen u Implementierung von Union-Find-Strukturen (/* Version 2 */)... verwenden zwei eindimensionale Arrays zur Repräsentation aller äume Väter Mächtigkeit der Mengen 1 2 3 4 6 7 1 2 4 1 7 3 1 1 2 2 1 1 Objekte zugehörige Mengen: { 1,3,4 } { 2 } {,6 } { 7 } 4/6, Folie 24 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
Union-Find-Strukturen u Implementierung von Union-Find-Strukturen (/* Version 2 */) Initialisierung for ( int o = 1; o <= n; ++o ) { v[o] = o; m[o] = 1; }... in Zeit O(n) Union-Operation Find-Operation void union ( int o1, int o2 ) { if ( m[o1] > m[o2] ) { v[o2] = o1; m[o1] = m[o1] + m[o2]; } else { v[o1] = o2; m[o2] = m[o2] + m[o1]; } }... wie gehabt... in Zeit O(1)... aber, in Zeit O(log(n)) 4/6, Folie 2 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
Union-Find-Strukturen u egründung Laufzeit der Find-Operation (/* Version 2 */) für einelementige Mengen gilt: tiefe() log(n) es seien M 1, M 2 Mengen mit n 1 bzw. n 2 Elementen, wobei n 1 n 2 gilt (/* nach IV gilt für die zugehörigen äume 1 und 2 : tiefe( 1 ) log(n 1 ) und tiefe( 2 ) log(n 2 ) */) Fall 1: tiefe() = tiefe( 1 ) à log(n) = log(n 1 + n 2 ) log(n 1 ) tiefe( 1 ) 1 1 2 2 4/6, Folie 26 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
Union-Find-Strukturen u egründung Laufzeit der Find-Operation (/* Version 2 */) für einelementige Mengen gilt: tiefe() log(n) es seien M 1, M 2 Mengen mit n 1 bzw. n 2 Elementen, wobei n 1 n 2 gilt (/* nach IV gilt für die zugehörigen äume 1 und 2 : tiefe( 1 ) log(n 1 ) und tiefe( 2 ) log(n 2 ) */) Fall 2: tiefe() = tiefe( 2 ) + 1 à log(n) = log(n 1 + n 2 ) log(2n 2 ) log(2) + log(n 2 ) 1 + tiefe( 2 ) 1 1 2 2 4/6, Folie 27 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen minimal aufspannender äume u Datenstruktur eine Menge M von Kanten (/* dient zur Verwaltung der potentiell aufzunehmenden Kanten */) eine Union-Find-Struktur (/* Version 2 */) zur Verwaltung der Knotenmengen, der sukzessive erzeugten kreisfreien zusammenhängenden Teilgraphen 4/6, Folie 28 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen minimal aufspannender äume u verfeinerte algorithmische Idee (/* mit Union-Find-Struktur */) (1) setze M = E, setze E = und initialisiere eine Union-Find-Struktur für die Knotenmenge V (2) solange E < V - 1 a) wähle eine Kante e = { x,y } aus M und streiche e aus M b) bestimme a = find(x) und b = find(y) c) teste, ob a b gilt falls ja, so setze E = E { e } und führe die Operation union(a,b) aus falls nein, so ändere E nicht... geht in Zeit O(n) + m*o(1) + m*o(log(n)) (/* falls Variante 2 zur Implementierung von Union-Find-Strukturen verwendet wird */), wobei n die Anzahl der Knoten von G und m die Anzahl der Kanten von G ist 4/6, Folie 29 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen minimal aufspannender äume u Illustration A C D E A C D E 1 1 1 1 1 C A M = { { A, },{ A,C },{,C },{ A,D },... } E = D E A C D E A A C D E 2 1 1 1 1 M = { { A,C },{,C },{ A,D },... } E = { { A, } } 4/6, Folie 30 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen minimal aufspannender äume u Illustration A C D E A A C D E 2 1 1 1 1 C A M = { { A,C },{,C },{ A,D },... } E = { { A, } } D E A C D E A A A D E 3 1 1 1 1 M = { {,C },{ A,D },... } E = { { A, },{ A,C } } 4/6, Folie 31 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen minimal aufspannender äume u Illustration A C D E A A A D E 3 1 1 1 1 C A M = { {,C },{ A,D },... } E = { { A, },{ A,C } } D E A C D E A A A D E 3 1 1 1 1 M = { { A,D },... } E = { { A, },{ A,C } } 4/6, Folie 32 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen minimal aufspannender äume u Grundbegriffe es sei G = (V,E) ein ungerichteter Graph es sei g(.) eine Funktion, die jeder Kante in V eine reelle Zahl zuordnet... das Paar (G,g(.)) heißt ungerichteter kantengewichteter Graph das Gewicht g(g) von G ist die Summe der Gewichte der Kanten von G 4/6, Folie 33 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen minimal aufspannender äume u Aufgabenstellung Eingabe: Ausgabe: ein ungerichteter zusammenhängender Graph G = (V,E) und eine zugehörige Gewichtsfunktion g(.) ein aufspannender aum G = (V,E ) in G, der ein minimales Gewicht hat 4/6, Folie 34 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen minimal aufspannender äume u Datenstruktur eine Menge M von Kanten (/* dient zur Verwaltung der in G potentiell aufzunehmenden Kanten */) eine Union-Find-Struktur (/* Version 2 */) zur Verwaltung der Knotenmengen, der sukzessive erzeugten kreisfreien zusammenhängenden Teilgraphen 4/6, Folie 3 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmen minimal aufspannender äume u algorithmische Idee (1) setze M = E, setze E = und initialisiere eine Union-Find-Struktur für die Knotenmenge V (2) solange E < V - 1 a) wähle eine Kante e = { x,y } mit minimalem Gewicht aus M und streiche e aus M b) bestimme a = find(x) und b = find(y) c) teste, ob a b gilt falls ja, so setze E = E { e } und führe die Operation union(a,b) aus falls nein, so ändere E nicht... geht in Zeit O(n) + m*o(m)+ m*o(log(n)) (/* falls Variante 2 zur Implementierung von Union-Find-Strukturen verwendet wird */), wobei n die Anzahl der Knoten von G und m die Anzahl der Kanten von G ist 4/6, Folie 36 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen
estimmung minimal aufspannender äume u Anmerkung falls man die Menge M, der aufzunehmenden Kanten, mit Hilfe einer Prioritätswarteschlange realisiert (/* Heap, wobei statt ein zur Sicherstellung der Heap-Eigenschaft verwendet wird */), kann 2a) jeweils in Zeit O(log(m)) realisiert werden, wobei m die Anzahl der Kanten von G ist (/* die Initialisierung der Prioritätswarteschlange kostet einmalig Zeit O(m) */)... geht offenbar in Zeit O(n) + O(m) + m*o(log(m)) + m*o(log(n)), wobei n die Anzahl der Knoten von G und m die Anzahl der Kanten von G ist 4/6, Folie 37 2014 Prof. Steffen Lange - HDa/FbI - Datenstrukturen