Datenstrukturen und Algorithmen Union-Find Problem VO 708.031 D&A: Union-Find Problem [email protected] 1 Union-Find Problem: Motivation • Beispielproblem: Konstruktion minimaler Netzwerke (Minimaler Spannbaum) • Gegeben: gewichteter Graph G (Gewicht=Kantenlänge) • Gesucht: Graph mit min. Gewichtssumme der alle Knoten verbindet. • Kruskal‘s Algorithmus: – Sortiere die Kanten aufsteigend nach Länge – Verwalte einen Subgraphen S (anfangs leer) – Für jede Kante e in sortierter Ordnung: • Wenn die Endknoten von e nicht verbunden in S sind: zu S hinzufügen. – Gib S aus. D&A: Union-Find Problem [email protected] 2 Union-Find Problem • Verwaltung von Daten ≙ Mengenoperationen (siehe auch Wörterbuchproblem, Warteschlange) • Union-Find-Problem: Wir suchen eine Datenstruktur zur Verwaltung von disjunkten Teilmengen M1 ,, M t M x1 ,, xn M i M j , mit den Operationen t M i M i 1 – UNION(Mi, Mj): vereinige Mi und Mj zu einer neuen Menge Mk – FIND(x): berichte i sodass x ∈ Mi Anfangszerlegung von M: M1={x1}, ..., Mn={xn} D&A: Union-Find Problem [email protected] 3 Union-Find Problem : Lösung 1 • Lösung 1 (favorisiert FINDS): Speichere jedes Mi als Baum der Höhe 1 xj • Blätter speichern die Elemente von Mi in beliebiger Reihenfolge • Wurzel speichert den Mengenindex, i • Zeiger auf jedes xj verfügbar (kein Suchen, xj in O(1) Zeit erreichbar) – FIND: Zeiger zur Wurzel; O(1) Zeit – UNION: Umhängen der Blätter; O(k) Zeit, wenn k Blätter umgehängt D&A: Union-Find Problem [email protected] 4 Union-Find Problem: Lösung 1 • Lösung 1: – Worst case für UNION: – Modifikation: Hänge immer die kleinere Menge um (weighted-union heuristic) Satz: Eine Folge von n-1 UNIONs und f FINDs benötigt O(n log n + f) Zeit. D&A: Union-Find Problem [email protected] 5 Union-Find-Problem : Lösung 2 • Lösung 2 (favorisiert UNIONS): Speichere jedes Mi als Baum • Knoten speichern die Elemente von Mi in beliebiger Reihenfolge • Wurzel speichert zusätzlich den Mengenindex i, und die Größe |Mi| • Zeiger auf jedes xj verfügbar (kein Suchen, xj in O(1) Zeit erreichbar) – FIND(x): Laufe zur Wurzel, O(Tiefe(x)) Zeit – UNION: Hänge einen Baum an die Wurzel des anderen, O(1) Zeit D&A: Union-Find Problem [email protected] 6 Union-Find-Problem : Lösung 2 • Baum kann entarten: worst case für FIND: Θ(n) • 1. Modifikation (union by rank): – UNION: Wurzel des Baums der kleineren Menge wird zum Sohn der Wurzel des größeren Baums j,5 9 i,4 Satz: Eine Folge von n-1 UNIONs und f FINDs benötigt O(n + f log n) Zeit. D&A: Union-Find Problem [email protected] 7 Union-Find-Problem : Lösung 2 • 2. Modifikation (path compression) – Hänge die bei einer FIND-Operation durchlaufenen Knoten direkt an die Wurzel (spätere FINDs begünstigt) n-1 UNIONs und f ≥ n FINDs brauchen nur O(f log*n) Zeit (fast-lineare Lösung) log*n = min{ i ∈ ℕ | ld(i)n ≤ 1 } D&A: Union-Find Problem [email protected] 8