Connected Components in a Graph

Übersicht

In diesem Tutorial werden wir das Konzept der verbundenen Komponenten in einem ungerichteten Graphen diskutieren.

Wir werden einige einfache Beispiele durchgehen, um ein grundlegendes Verständnis zu erhalten, und dann werden wir die Eigenschaften verbundener Komponenten auflisten.

Verbundene Komponente Definition

Eine verbundene Komponente oder einfach Komponente eines ungerichteten Graphen ist ein Subgraph, in dem jedes Knotenpaar über einen Pfad miteinander verbunden ist.

Lassen Sie uns versuchen, es weiter zu vereinfachen. Ein Satz von Knoten bildet eine verbundene Komponente in einem ungerichteten Graphen, wenn ein Knoten aus dem Satz von Knoten durch Durchlaufen von Kanten einen anderen Knoten erreichen kann. Der Hauptpunkt hier ist die Erreichbarkeit.

In verbundenen Komponenten sind alle Knoten immer voneinander erreichbar.

Einige Beispiele

In diesem Abschnitt werden wir ein paar einfache Beispiele diskutieren. Wir werden versuchen, die Beispiele mit der oben angegebenen Definition in Beziehung zu setzen.

3.1. Eine verbundene Komponente

In diesem Beispiel hat der gegebene ungerichtete Graph eine verbundene Komponente:

Nennen wir diesen Graphen G1(V, E). Hier V = \{V1, V2, V3, V4, V5, V6\} bezeichnet die Scheitelpunktmenge und E = \{E1, E2, E3, E4, E5, E6, E7\} bezeichnet die Kantenmenge von G1. Der Graph G1 hat eine verbundene Komponente, nennen wir sie C1, die alle Eckpunkte von G1 enthält. Überprüfen wir nun, ob die Menge C1 an der Definition festhält oder nicht.

Laut Definition sollten die Vertices in der Menge C1 über einen Pfad zueinander gelangen. Wir wählen zwei zufällige Eckpunkte V1 und V6:

  • V6 ist erreichbar mit V1 über: E4 \rightarrow E7 \ oder\ E3 \rightarrow E5 \rightarrow E7 \ oder\ E1 \rightarrow E2 \rightarrow E6 \rightarrow E7
  • V1 ist mit V6E7 \rightarrow E4 \ oder\ E7 \rightarrow E5 \rightarrow E3 \ oder\ E7 \rightarrow E6\rightarrow E2 \rightarrow E1

Die Eckpunkte V1 und V6 erfüllte die Definition, und wir könnten dasselbe auch mit anderen Scheitelpunktpaaren in C1 tun.

3.2. Mehr als eine verbundene Komponente

In diesem Beispiel hat der ungerichtete Graph drei verbundene Komponenten:

Let’s name this graph as G2(V, E), where V = \{V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12\}, and E = \{E1, E2, E3, E4, E5, E6, E7, E8, E9, E10, E11\}. The graph G2 has 3 connected components: C1 = \{V1, V2, V3, V4, V5, V6\}C2 = \{V7, V8, V9\} and C3 = \{V10, V11, V12\}.

Nun wollen wir sehen, ob die verbundenen Komponenten C1C2 und C3 die Definition erfüllen oder nicht. Wir wählen zufällig ein Paar aus jedem C1C2 und C3 Set.

Wählen wir aus der Menge C1die Eckpunkte V4 und V6.

  • V6 ist erreichbar zu V4 über: E2 \rightarrow E6 \rightarrow E7 \ oder\ E1 \rightarrow E4 \rightarrow E7 \ oder\ E1 \rightarrow E3 \rightarrow E5 \rightarrow E7
  • V4 ist erreichbar zu V6 über: E7 \rightarrow E6 \rightarrow E2 \ oder\ E7 \rightarrow E4 \rightarrow E1 \ oder\ E7 \rightarrow E5 \rightarrow E3 \rightarrow E1

Nun wählen wir die Eckpunkte V8 undV9V9 aus der Menge C2.

  • V9 is reachable to V8E9 \rightarrow E8
  • V8 is reachable to V9E8 \rightarrow E9

Finally, let’s pick the vertices V11 and V12 from the set C3.

  • V11 is reachable to V12E11 \rightarrow E10
  • V12 ist erreichbar mit V11E10 \rightarrow E11

Aus diesen einfachen Demonstrationen geht hervor, dass C1C2 und C3 der Definition der verbundenen Komponente folgen.

Eigenschaften

Da wir die Definition bereits besprochen und einige Beispiele der verbundenen Komponenten gezeigt haben, ist es an der Zeit, einige der wichtigen Eigenschaften aufzulisten, die die verbundene Komponente immer besitzt.

Zunächst einmal ist der verbundene Komponentensatz immer nicht leer.

Wenn für einen gegebenen Graphen mehr als eine verbundene Komponente vorhanden ist, ergibt die Vereinigung der verbundenen Komponenten die Menge aller Eckpunkte des gegebenen Graphen.

Zum Beispiel G2:

\

Schließlich sind verbundene Komponentensätze paarweise disjunkt. Das heißt, wenn wir den Schnittpunkt zwischen zwei verschiedenen verbundenen Komponentensätzen nehmen, ist der Schnittpunkt gleich einer leeren Menge oder einer Nullmenge.

Betrachten wir noch einmal die verbundenen Komponenten von graph G2. Überprüfen Sie in G2 diese Eigenschaft:

\

Finden verbundener Komponenten

Bei einem ungerichteten Graphen ist es wichtig, die Anzahl der verbundenen Komponenten zu ermitteln, um die Struktur des Graphen zu analysieren – er hat viele reale Anwendungen. Wir können entweder DFS oder BFS für diese Aufgabe verwenden.

In diesem Abschnitt werden wir einen DFS-basierten Algorithmus diskutieren, der uns die Anzahl der verbundenen Komponenten für einen gegebenen ungerichteten Graphen gibt:

Gerendert von QuickLaTeX.com

Die Variable Component_Count gibt die Anzahl der verbundenen Komponenten im angegebenen Diagramm zurück.

Wir beginnen mit der Initialisierung aller Eckpunkte für das Flag not visited. Wir wählen dann einen beliebigen zufälligen Scheitelpunkt aus und prüfen, ob wir den Scheitelpunkt besucht haben oder nicht. Wenn nicht, rufen wir die DFS-Funktion auf.

Sobald alle Eckpunkte als besucht markiert sind, wird der Algorithmus beendet und die Anzahl der verbundenen Komponenten ausgegeben.

In der DFS-Funktion sind die Argumente, die wir übergeben, eine Scheitelpunktmenge, die alle Scheitelpunkte des angegebenen Graphen enthält, und ein bestimmter Scheitelpunkt, der zur Scheitelpunktmenge gehören muss.

Zuerst markieren wir den jeweiligen Eingabescheitelpunkt als besucht. Dann berechnen wir die benachbarten Eckpunkte des gegebenen bestimmten Eingangsscheitelpunkts. Für jeden benachbarten Scheitelpunkt prüfen wir, ob wir sie besucht haben oder nicht. Wenn nicht, rufen wir die DFS-Funktion rekursiv auf, bis wir alle benachbarten Scheitelpunkte als besucht markieren.

Der wichtigste Punkt im Algorithmus ist, dass die Anzahl der verbundenen Komponenten gleich der Anzahl der unabhängigen DFS-Funktionsaufrufe ist. Die Variable Component_Count zählt die Anzahl der Aufrufe. Dies schließt natürlich nicht die Aufrufe ein, die rekursiv unter der Funktion DFS () ausgeführt werden.

Testlauf

Lassen Sie uns den Algorithmus in einem Beispieldiagramm ausführen:

Bei einem ungerichteten Graphen G3(V, E), wobei V = \{V1, V2, V3, V4, V5, V6, V7, V8\} und E = \{E1, E2, E3, E4, E5\}.

Der erste Schritt des Algorithmus besteht darin, alle Eckpunkte zu initialisieren und sie als nicht besucht zu markieren.

Der rote Scheitelpunkt zeigt an, dass er nicht besucht wird. Der grüne Scheitelpunkt zeigt an, dass er vom Algorithmus besucht wird:

Wir können einen beliebigen Scheitelpunkt aus der Scheitelpunktliste auswählen, um den Algorithmus zu starten. Wählen wir V1.

Der Algorithmus prüft, ob er besucht wird oder nicht. In diesem Fall wird V1 nicht besucht. Es ruft also DFS(V, V1) .

Innerhalb von DFS() wird zunächst der Scheitelpunkt V1 als besucht gekennzeichnet und nach den benachbarten Scheitelpunkten von V1 gesucht. Alle angrenzenden Eckpunkte werden ebenfalls als besucht markiert. Wenn DFS den Besuch aller benachbarten Scheitelpunkte von V1 abgeschlossen hat, wird Component_Count zu 1 und der Status der Scheitelpunkte wird aktualisiert:

Auch hier wählt der Algorithmus einen beliebigen zufälligen Scheitelpunkt aus. Lassen Sie uns dieses Mal V4 auswählen.

Es wird geprüft, ob V4 bereits besucht ist oder nicht. Da es nicht besucht wird, ruft der Algorithmus DFS(V, V4) . Wiederum markiert der Algorithmus den Scheitelpunkt V4 als besucht, und DFS sucht nach seinen benachbarten Scheitelpunkten und markiert sie als besucht. Jetzt wird Component_Count zu 2 und der Status der Vertex-Liste wird erneut aktualisiert:

Der Algorithmus fährt fort und wählt V6, überprüft den Status und ruft DFS(V, V6) auf. Der Scheitelpunkt V6 und seine benachbarten Scheitelpunkte werden als besucht gekennzeichnet und der Component_Count erhöht sich auf 3. Der Algorithmus aktualisiert den Status der Vertex-Liste:

Schließlich wählt der Algorithmus V8, ruft DFS(V, V8) auf und macht V8 als besucht. Der Scheitelpunkt V8 hat keine benachbarten Scheitelpunkte, daher gibt DFS zurück und Component_Count erhöht sich auf 4. Schließlich aktualisiert der Algorithmus den Status der Scheitelpunktliste:

Nachdem der Algorithmus alle Scheitelpunkte des Diagramms G3 durchlaufen hat, wird er beendet und gibt den Wert von Component_Count zurück, der der Anzahl der verbundenen Komponenten in G3 entspricht. In diesem Fall finden die Algorithmen vier verbundene Komponenten in G3:

Wir haben vier verschiedene Farben verwendet, um die verbundenen Komponenten in G3 darzustellen, nämlich: C1 = \{V1, V2, V3\}C2 = \{V4, V5\}C3 = \{V6, V7\}C4 = \{V8\}.

Zeitkomplexitätsanalyse

Der Algorithmus, den wir gerade gesehen haben, um verbundene Komponenten in einem bestimmten ungerichteten Graphen zu finden, verwendet die DFS-Suche und zählt die Anzahl der Aufrufe der DFS-Funktion. Wenn der Graph durch die Adjazenzliste dargestellt wird, besucht die DFS-Suche alle Scheitelpunkte einmal und jede Kante zweimal im Falle eines ungerichteten Graphen. Die Überprüfung des Vertexstatus dauert O(1) Zeit. Insgesamt benötigt unser Algorithmus also \mathbf{O(V+E)} Zeit.

Falls der Graph durch die Adjazenzmatrix dargestellt wird, benötigt die DFS-Suche O(V^2) Zeit, da sie die gesamte Zeile durchlaufen muss, um die Nachbarscheitelpunkte auszuwerten. Die Überprüfung des Vertexstatus nimmt wieder O(1) Zeit in Anspruch. Somit erhalten wir insgesamt \mathbf{O(V^2)} Zeit.

Fazit

In diesem Artikel haben wir eine einfache Definition der verbundenen Komponente diskutiert, gefolgt von ein paar einfachen und leicht verständlichen Beispielen. Außerdem haben wir einige allgemeine, aber wichtige Eigenschaften verbundener Komponenten aufgelistet.

Dann diskutierten wir einen DFS-Suchalgorithmus, um die Anzahl der verbundenen Komponenten in einem gegebenen Graphen zu finden. Wir haben den Algorithmus anhand eines Beispielgraphen demonstriert. Schließlich analysierten wir die zeitliche Komplexität des Algorithmus.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.