Union Find¶
đ 1ïžâŁ Begriffe & Grundlagen¶
-
Menge (Set):
Eine Gruppe von Elementen, die zusammengehören.
Beispiel:{1, 2, 3}ist eine Menge. -
Disjunkte Mengen:
Mengen, die keine gemeinsamen Elemente haben.
Beispiel:{1, 2}und{3, 4}sind disjunkt. -
ReprÀsentant (Root/Wurzel):
Ein "Leader" der Menge.
Jeder Knoten zeigt (direkt oder indirekt) auf diesen ReprÀsentanten. -
Union-Find (Disjoint-Set Union, DSU):
Eine Datenstruktur, die hilft:- Zu prĂŒfen, ob zwei Elemente in derselben Menge sind (
find). - Zwei Mengen zu einer Menge zu vereinigen (
union).
- Zu prĂŒfen, ob zwei Elemente in derselben Menge sind (
đ Zusammenfassung der wichtigsten Punkte¶
| Begriff | Beschreibung |
|---|---|
| Union | Verbindet zwei Mengen (macht einen gemeinsamen ReprÀsentanten). |
| Find | Findet den ReprÀsentanten (Wurzel) einer Menge. |
| Rank | SchÀtzung der "Tiefe" des Baumes (hilft, die Struktur beim union flach zu halten). |
| Path Compression | Optimiert die find-Methode, indem alle Knoten direkt mit der Wurzel verbunden werden. |
đ 2ïžâŁ Operationen in Union-Find¶
-
find(x)- Finde den ReprĂ€sentanten der Menge vonx.- Gibt den "Root" der Menge zurĂŒck, zu der
xgehört. - Beispiel: In
{1 â 2 â 3}, ist3der ReprĂ€sentant von1. -
union(x, y)- Vereine die Mengen vonxundy. -
Falls
xundyin verschiedenen Mengen sind â Vereine sie. - Nach
union(x, y)haben beide Elemente denselben ReprÀsentanten.
- Gibt den "Root" der Menge zurĂŒck, zu der
-
union(mit Rank):- Bestimmt, wie Mengen zusammengefĂŒhrt werden, um die Struktur flach zu halten.
- Flache BĂ€ume â schnellere
find-Operationen. -
find(mit Path Compression): -
Optimiert die Struktur nachtrÀglich, wenn wir nach einem ReprÀsentanten suchen.
- Macht den Baum noch flacher, indem alle Knoten direkt mit der Wurzel verbunden werden.
INITIALISIERE parent[x] = x, rank[x] = 0 fĂŒr jedes x
FUNKTION find(x):
WENN parent[x] != x:
parent[x] = find(parent[x]) // Path Compression
GIB parent[x] zurĂŒck
FUNKTION union(x, y):
rootX = find(x)
rootY = find(y)
WENN rootX == rootY:
GIB // Schon in derselben Menge
WENN rank[rootX] < rank[rootY]:
parent[rootX] = rootY // rootY bleibt Wurzel
ANDERNFALLS WENN rank[rootX] > rank[rootY]:
parent[rootY] = rootX // rootX bleibt Wurzel
ANDERNFALLS:
parent[rootY] = rootX // Einer wird Wurzel
rank[rootX] += 1 // Rank erhöhen
đ Fazit¶
- â Union verbindet zwei Mengen.
- â Find findet den ReprĂ€sentanten (Root) einer Menge.
- â Rank sorgt dafĂŒr, dass die BĂ€ume flach bleiben.
- â Path Compression macht die BĂ€ume nachtrĂ€glich noch flacher.
- â
Optimierte Union-Find ist extrem effizient: \(O(\log n)\) bis \(O(1)\) fĂŒr
findundunion.
Kruskalâs Algorithmus - Schritt-fĂŒr-Schritt¶
đ Was ist das Ziel von Kruskalâs Algorithmus?¶
Ziel:
- Finde den Minimalen Spannbaum (MST) eines gewichteten, ungerichteten Graphen.
- Alle Knoten so gĂŒnstig wie möglich miteinander verbinden.
Ein Minimaler Spannbaum (MST):
- Verbindet alle Knoten des Graphen.
- Minimiert die Gesamtkosten der Kanten (Summe der Kantengewichte).
- Keine Zyklen â der MST ist ein baumartiges Netzwerk.
đ WofĂŒr ist das nĂŒtzlich?¶
- â Optimale Netzwerke: Minimierung der LĂ€nge von StraĂen, Kabeln, Netzwerken.
- â Kosteneinsparung: Verbindungen herstellen, ohne unnötige "teure" Kanten zu verwenden.
- â Effiziente Ressourcenverteilung: Z.B. in Computernetzwerken, ElektrizitĂ€tsnetzen, Transportnetzen.
Grundidee - Wie funktioniert:¶
- Sortiere alle Kanten nach ihrem Gewicht (aufsteigend).
- FĂŒge die leichteste Kante zum MST hinzu, sofern kein Zyklus entsteht.
- Wiederhole, bis der MST alle Knoten verbindet.
đ© Wichtig:¶
- Um Zyklen zu vermeiden, verwenden wir den Union-Find-Algorithmus.
- Wenn zwei Knoten bereits im selben Set sind â Kante nicht hinzufĂŒgen (wĂŒrde einen Zyklus bilden).
đ 3ïžâŁ Beispiel zur Veranschaulichung¶
Stell dir vor, wir wollen StÀdte (A, B, C, D) mit Stromnetze verbinden. Jedes Stromnetz hat Kosten (Gewicht).
4ïžâŁ Kruskalâs Algorithmus - Schritt-fĂŒr-Schritt¶
Die zentrale Regel:¶
- Elemente dĂŒrfen nicht doppelt in dieselbe Menge aufgenommen werden sonst entsteht ein Zyklus
â Schritt 1: Kantenliste aufstellen und sortieren (nach Gewicht)¶
- (A, C) = 1
- (B, D) = 2
- (A, D) = 3
- (A, B) = 4
- (C, D) = 5
â Schritt 2: Kanten auswĂ€hlen (kein Zyklus bilden)¶
1ïžâŁ Kante (A, C) = 1
- Verbinden â Kein Zyklus â HinzufĂŒgen
2ïžâŁ Kante (B, D) = 2
- Verbinden â Kein Zyklus â HinzufĂŒgen
3ïžâŁ Kante (A, D) = 3
- Verbinden â Kein Zyklus â HinzufĂŒgen
4ïžâŁ Kante (A, B) = 4
- WĂŒrde einen Zyklus bilden (A-D-B) â Nicht hinzufĂŒgen
5ïžâŁ Kante (C, D) = 5
- WĂŒrde einen Zyklus bilden (C-A-D) â Nicht hinzufĂŒgen
đ Ergebnis:¶
- Minimaler Spannbaum (MST):
- Kanten: (A, C), (B, D), (A, D)
- Gesamtkosten: 1 + 2 + 3 = 6
đ 6ïžâŁ Vergleich: Mit und ohne Kruskal¶
| Ohne Kruskal (beliebige Verbindungen) | Mit Kruskal (MST) |
|---|---|
| A-B = 4 | A-C = 1 |
| A-C = 1 | B-D = 2 |
| B-D = 2 | A-D = 3 |
| A-D = 3 | Gesamtkosten = 6 |
| C-D = 5 | |
| Gesamtkosten = 15 |
- Ohne Kruskal: Wir könnten unnötig teure Kanten verwenden.
- Mit Kruskal: Wir verwenden nur die gĂŒnstigsten Kanten, um alle zu verbinden.