Skip to content

Union Find¶

📚 1ïžâƒŁ Begriffe & Grundlagen¶

  1. Menge (Set):
    Eine Gruppe von Elementen, die zusammengehören.
    Beispiel: {1, 2, 3} ist eine Menge.

  2. Disjunkte Mengen:
    Mengen, die keine gemeinsamen Elemente haben.
    Beispiel: {1, 2} und {3, 4} sind disjunkt.

  3. ReprÀsentant (Root/Wurzel):
    Ein "Leader" der Menge.
    Jeder Knoten zeigt (direkt oder indirekt) auf diesen ReprÀsentanten.

  4. 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).

📝 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¶

  1. find(x) - Finde den ReprÀsentanten der Menge von x.

    • Gibt den "Root" der Menge zurĂŒck, zu der x gehört.
    • Beispiel: In {1 → 2 → 3}, ist 3 der ReprĂ€sentant von 1.
    • union(x, y) - Vereine die Mengen von x und y.

    • Falls x und y in verschiedenen Mengen sind → Vereine sie.

    • Nach union(x, y) haben beide Elemente denselben ReprĂ€sentanten.
  2. 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 fĂŒr jedes x

FUNKTION find(x):
    WENN parent[x] == x:
        GIB x zurĂŒck
    ANDERNFALLS:
        GIB find(parent[x]) zurĂŒck

FUNKTION union(x, y):
    rootX = find(x)
    rootY = find(y)
    WENN rootX != rootY:
        parent[rootY] = rootX  // Mache rootY zum Kind von rootX
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

union_find.svg

🚀 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 find und union.

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:¶

  1. Sortiere alle Kanten nach ihrem Gewicht (aufsteigend).
  2. FĂŒge die leichteste Kante zum MST hinzu, sofern kein Zyklus entsteht.
  3. 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). kruskal_algorithmus.svg

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)¶

  1. (A, C) = 1
  2. (B, D) = 2
  3. (A, D) = 3
  4. (A, B) = 4
  5. (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.