đ Graphen: Grundlagen¶
Ein Graph ist eine mathematische Struktur, die aus:
- Knoten (Vertices) besteht, die Objekte reprÀsentieren,
- und Kanten (Edges), die Verbindungen zwischen diesen Knoten darstellen.
Graphen werden verwendet, um Beziehungen zwischen Objekten zu modellieren, z.B. in Netzwerken, Routenplanung, Datenbanken oder Sozialen Netzwerken.
Arten von Graphen¶
1.1. Gerichtet (Directed) vs. Ungerichtet (Undirected)¶
-
Gerichteter Graph (Digraph):
- Die Kanten haben eine Richtung (Pfeile).
- Eine Kante von A nach B ist nicht dasselbe wie von B nach A.
- Beispiel: Verkehrsnetz (EinbahnstraĂen).
-
Ungerichteter Graph:
-
Kanten haben keine Richtung.
- Eine Kante verbindet Knoten symmetrisch: A â B.
- Beispiel: Freundschaften in sozialen Netzwerken.
1.2. Gewichteter (Weighted) vs. Ungewichteter (Unweighted)¶
-
Gewichteter Graph:
- Jede Kante hat ein Gewicht (z.B. Kosten, Entfernung, Zeit).
- Wird bei kĂŒrzesten Wegen oder Netzwerkoptimierungen verwendet.
-
Ungewichteter Graph:
-
Kanten sind einfach Verbindungen ohne zusÀtzliche Werte.
- Gut fĂŒr einfache Struktur-Analysen (z.B. Erreichbarkeit).
1.3. Zyklisch (Cyclic) vs. Azyklisch (Acyclic)¶
-
Zyklischer Graph:
- EnthÀlt mindestens einen Zyklus (geschlossener Pfad).
- Beispiel: Stromnetz, StraĂennetze.
-
Azyklischer Graph (DAG â Directed Acyclic Graph):
-
EnthÀlt keinen Zyklus.
- Wichtig fĂŒr: Task-Planung, Versionskontrolle, Kompilierung von AbhĂ€ngigkeiten.
-
Spezialfall:
-
Ein Baum ist ein ungerichteter, azyklischer, zusammenhÀngender Graph.
1.4. Adjazenzmatrix¶
-
Eine Matrix AAA, die angibt, ob zwei Knoten direkt verbunden sind.
-
FĂŒr ungewichtete Graphen:
- \(A[i][j]=1A[i][j] = 1A[i][j]=1\), wenn eine Kante von Knoten i nach j existiert.
- \(A[i][j]=0A[i][j] = 0A[i][j]=0\), wenn keine Verbindung besteht.
-
FĂŒr gewichtete Graphen:
- Die Matrix speichert das Gewicht der Kante anstelle von 1.
- Kein Pfad = Unendlich (â) oder 0 (je nach Definition).
-
Speicherbedarf:
- \(O(V2)O(V^2)O(V2)\) â Nicht effizient bei groĂen, spĂ€rlichen Graphen.
- Vorteil: Schneller Zugriff auf Kanten: \(O(1)O(1)O(1)\).
-
Beispiel:
FĂŒr Knoten {A, B, C} mit Kanten AâB, BâC:
Adjazenzmatrix (ungewichtet)¶
A | B | C | |
---|---|---|---|
A | 0 | 1 | 0 |
B | 1 | 0 | 1 |
C | 0 | 1 | 0 |
Adjazenzmatrix (gewichteter, gerichteter Graph)¶
- Gerichteter Graph: Die Matrix ist nicht symmetrisch.
- Gewichtete Kanten: Zahlen reprÀsentieren die Kosten/Entfernungen.
- Unverbundene Knoten: Markiert mit â.
A | B | C | |
---|---|---|---|
A | 0 | 4 | 2 |
B | â | 0 | 5 |
C | 3 | â | 0 |
1.5. Adjazenzliste¶
-
Jeder Knoten speichert eine Liste seiner Nachbarn.
-
Effizient fĂŒr spĂ€rliche Graphen (wenige Kanten im Vergleich zu Knoten).
-
Speicherbedarf:
- \(O(V+E)O(V + E)O(V+E)\) â Spart Speicher bei groĂen Netzwerken.
-
Vorteil:
-
Effizient fĂŒr Iteration ĂŒber Nachbarn.
- Nachteil: PrĂŒfen, ob eine bestimmte Kante existiert, dauert \(O(Grad)\).
- Beispiel:
FĂŒr Knoten {A, B, C} mit Kanten AâB, BâC:
đ Adjazenzliste¶
Knoten | Knoten | Gewicht |
---|---|---|
A â | B | (5) |
B â | A,C | (4) |
C â | B | (3) |
2.0 Graph-Traversierung¶
2.1. BFS (Breadth-First Search)¶
BFS erkundet den Graphen Schicht fĂŒr Schicht (Level fĂŒr Level).
Stell dir BFS wie eine Welle vor, die sich gleichmĂ€Ăig ausbreitet.
- DurchlĂ€uft den Graphen Level fĂŒr Level (Breite zuerst).
- Verwendet eine Warteschlange (Queue).
- Gut fĂŒr das Finden von kĂŒrzesten Wegen in ungewichteten Graphen.
đ BFS-Anwendungen:¶
- KĂŒrzeste Wege (in ungewichteten Graphen):
- BFS findet den kĂŒrzesten Weg von der Startposition zu allen anderen Knoten.
- Zyklus-Erkennung (ungerichtete Graphen):
- Wenn ein besuchter Nachbar erneut erreicht wird â Zyklus existiert.
- Bipartite Graphen prĂŒfen:
- BFS hilft festzustellen, ob der Graph zweifach fÀrbbar ist.
- BFS hilft festzustellen, ob der Graph zweifach fÀrbbar ist.
2.2. DFS (Depth-First Search)¶
DFS erkundet den Graphen so tief wie möglich, bevor es zu einem anderen Pfad zurĂŒckkehrt.
Stell dir DFS wie ein Labyrinth vor: Du gehst immer so tief wie möglich in einen Gang hinein, bis du nicht mehr weiterkommst, und gehst dann zurĂŒck.
- Geht so tief wie möglich in den Graphen, bevor es zurĂŒcktrackt.
- Verwendet einen Stack (oft rekursiv implementiert).
- NĂŒtzlich fĂŒr Zyklus-Erkennung, Topologische Sortierung, Connected Components.
đ DFS-Anwendungen:¶
-
TiefensuchbÀume (DFS-Trees):
- Zeigt den Ablauf der Traversierung.
- RĂŒckwĂ€rtskanten (Back Edges) â helfen, Zyklen zu erkennen.
-
Zyklus-Erkennung:
-
Falls ein besuchter Knoten erneut erreicht wird, existiert ein Zyklus.
-
Artikulationspunkte (Critical Points):
-
Knoten, deren Entfernung den Graphen in zwei Teile trennt.
- Wichtig bei Netzwerken zur Erkennung von Schwachstellen.
Bipartite Graphen: Erkennung mit BFS & DFS¶
Was ist ein bipartiter Graph?¶
Ein bipartiter Graph ist ein Graph, dessen Knoten in zwei disjunkte Mengen AAA und BBB aufgeteilt werden können, sodass keine Kante zwei Knoten derselben Menge verbindet.
- Formell: Ein Graph ist bipartit, wenn er 2-fÀrbbar ist, d.h. man kann ihn mit zwei Farben so fÀrben, dass keine zwei benachbarten Knoten dieselbe Farbe haben.
Erkennung eines bipartiten Graphen¶
Strategie: 2-FĂ€rbigkeit¶
- FĂ€rbe den Startknoten mit Farbe 0.
- FĂ€rbe alle Nachbarn mit der anderen Farbe (z.B. Farbe 1).
- FĂ€rbe deren Nachbarn wieder mit der ursprĂŒnglichen Farbe (Farbe 0).
- Widerspruch:
- Falls zwei benachbarte Knoten dieselbe Farbe haben â nicht bipartit.
- Falls die FĂ€rbung ohne Konflikte abgeschlossen werden kann â bipartit.
đStarke Zusammenhangskomponenten (Strongly Connected Components, SCCs)¶
Definition:¶
In einem gerichteten Graphen ist eine starke Zusammenhangskomponente (SCC) eine Teilmenge von Knoten, bei denen jeder Knoten von jedem anderen erreichbar ist.
Kosarajuâs Algorithmus (DFS-basiert):¶
- FĂŒhre DFS aus und speichere die Abschlusszeiten der Knoten.
- Spiegle den Graphen (drehe alle Kanten um).
- FĂŒhre DFS erneut aus, diesmal in der Reihenfolge der abnehmenden Abschlusszeiten.
- Jeder DFS-Durchlauf ergibt eine SCC.
⥠Anwendung:¶
- Netzwerk-Analyse
- AbhÀngigkeits-Graphen (z.B. bei Software-Paketen)