Algorithmen I - Tutorium 28 Nr. 11 13.07.2017: Spaß mit Schnitten, Kreisen und minimalen Spannbäumen Marc Leinweber marc.leinweber@student.kit.edu INSTITUT FÜR THEORETISCHE INFORMATIK (ITI), PROF. DR. JÖRN MÜLLER-QUADE KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu
Agenda 1 Minimale Spannbäume 2 Schnitt- und Kreiseigenschaft 3 Jarnik-Prim 4 Kruskal 5 Union-Find 6 Kreativaufgabe zu Spannbäumen 7 Ende Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 2/17
Minimale Spannbäume (MST) gegeben ungerichteter Graph G = (V, E) mit Knoten V, n = V, Kanten e = (u, v) E, u, v V, m = E, Kantengewichte c(e) R + gesucht Baum (V, T ) mit minmaler Summe der Kantengewichte Σ e T c(e), der alle Knoten verbindet Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 3/17
Minimale Spannbäume (MST) MST? Welche Kanten dieses Graphen sind in T des MST? Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 4/17
Minimale Spannbäume (MST) MST! MST?! Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 5/17
Schnitteigenschaft (cut property) Satz Für S V beliebig definierte Menge C := {e = (u, v) E : u S, v V\S} Es gilt: Die leichteste Kante in C e min = min e C {c(e)} kann in einem MST verwendet werden. Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 6/17
Kreiseigenschaft (cycle property) Satz Für C E beliebiger Kreis gilt: Die schwerste Kante c max = max e C {c(e)} des Kreises wird für einen MST nicht benötigt. Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 7/17
Jarnik-Prim-Algorithmus Function jpmst : Set of Edge wähle s V parent[] = null : Array of Node, d[] = : Array of N d[s] = 0; parent[s] = s; PQ.insert(s) while( PQ.isEmpty()) u = PQ.deleteMin(); d[u] = 0 foreach e = (u, v) E do if (c(e) < d[v])) then d[v] = c(e); parent[v] = u ifv PQ then PQ.decreaseKey(v) else PQ.insert(v) return {(v, parent[v]) : v V\{s}} Wo ist der Unterschied zu Dijkstras Algorithmus? Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 8/17
Jarnik-Prim: Fakten Laufzeit: O((m + n) log n) braucht irgendwie geartete Graphrepräsentation modifizierte Breitensuche Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 9/17
Kruskals Algorithmus Function kruskalmst (V, E, c) : Set of Edge T = foreach (u, v) E aufsteigend sortiert nach c((u, v)) do if u, v Element versch. Teilbäume then T = T {(u, v)} return T Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 10/17
Kruskal: Fakten Laufzeit: hm? Sortierung? Teilbaum-Unterscheidung? Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 11/17
Die Union-Find-Datenstruktur Class UnionFind(n : N) parent : Array[1..n] of 1,..., n Function find(i : 1,..., n) : 1,..., n if parent[i] == i then return i else return find(parent[i]) Procedure union(i, j : 1,..., n) if find(i) find(j) then link(find(i), find(j)) Procedure link(i, j : 1,..., n) parent[i] = j Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 12/17
Union-Find: Fakten Laufzeit: O(mα T (m, n)) für alle praktischen n ist α T (m, n) 5 wir können n Elemnte gruppieren; jedes Element ist zunächst sein eigener Herr Bedeutung für Kruskal: für dünn besetzte Graphen (m = O(n)) eine bessere Laufzeit als JP, Sortierung in O(m log m) + O(m 1) für Union-Find Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 13/17
Aufgabenstellung Wir betrachten beliebige zusammenhängende ungerichtete Graphen G = (V, E) mit V = {1,..., n}, n N, und Kantengewichten aus {1, 3}. Sei G in Form eines Adjazenzfeldes gegeben. a) Geben Sie einen Algorithmus an, der in Zeit O( E ) einen MST von G berechnet. b) Argumentieren Sie kurz, warum Ihr Algorithmus aus Teilaufgabe a) das gewünschte Laufzeitverhalten aufweist. Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 14/17
Lösung a) Sei c : E {1, 3} die Gewichtsfunktion von G. Man modifiziere den Jarník-Prim-Algorithmus nun wie folgt: Ersetze die PQs durch zwei FIFO-Queues Q 1 und Q 3 (doppelt verkettete Listen). Man lässt Q.insert(u) weg, stattdessen durchläuft man alle Kanten (u, v) E. Für c(u, v) = 1 führe Q 1.pushBack(v) aus, ansonsten führe Q 3.pushBack(v) aus. Statt Q.deleteMin führt man Q 1.popFront aus, sofern Q 1 nicht leer ist. Ansonsten führt man Q 3.popFront aus. Wenn aber auch dieses leer ist, wird der Algorithmus beendet. Beim Relaxieren einer Kante (u, v) E werden Knoten v mit v Q 1 und v Q 3 in Q c(u,v) eingefügt, beim Verringern eines Gewichtes (nur von 3 nach 1 möglich) entfernt man v aus Q 3 und führt Q 1.pushBack(v) aus. Allerdings benötigt man hierzu auch ein Array A[1..n], das zu jedem v V, welches sich in Q 3 befindet, an der Stelle A[v] einen Handle auf das zugehörige Listenelement speichert. Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 15/17
Lösung (ctd.) b) Jede Kante in E wird genau einmal betrachtet. Dabei wird jeweils höchstens ein pushback ausgeführt und höchstens ein remove auf einer doppelt verketteten Liste. Außerdem wird für jeden Knoten höchstens einmal popfront ausgeführt und es gilt V = O( E ). All die Operationen pushback, popfront und remove benötigen jeweils O(1) Zeit. Initialisieren von A benötigt O( V ) = O( E ) Zeit. Insgesamt braucht man also O( E ) Zeit. Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 16/17
Was haben wir heute gemacht? Schnitt- und Kreiseigenschaft Minimale Spannbäume Jarnik-Prim und Kruskal Viel Erfolg und ein schönes Wochenende! Marc Leinweber Algorithmen I - Tutorium 28 Nr. 11 13.07.2017 17/17