Connected Components in a Graph

overzicht

in deze tutorial bespreken we het concept van connected components in een niet-gerichte grafiek.

We gaan door enkele eenvoudige voorbeelden om een basiskennis te krijgen, en dan zullen we een lijst maken van de eigenschappen van verbonden componenten.

Connected Component Definition

een connected component of gewoon component van een niet-gerichte grafiek is een subgraph waarin elk paar knopen met elkaar verbonden is via een pad.

laten we proberen het verder te vereenvoudigen. Een verzameling knooppunten vormt een verbonden component in een niet-gerichte grafiek als een knooppunt uit de verzameling knooppunten een ander knooppunt kan bereiken door randen te doorkruisen. Het belangrijkste punt hier is bereikbaarheid.

In verbonden componenten zijn alle knooppunten altijd bereikbaar vanaf elkaar.

enkele voorbeelden

In deze sectie zullen we een paar eenvoudige voorbeelden bespreken. We zullen proberen om de voorbeelden te relateren aan de definitie hierboven gegeven.

3.1. Eén verbonden Component

in dit voorbeeld heeft de gegeven niet-gerichte grafiek één verbonden component:

laten we deze grafiek een naam geven G1(V, E). Hier geeft V = \{V1, V2, V3, V4, V5, V6\} de vertexverzameling aan en E = \{E1, E2, E3, E4, E5, E6, E7\} de edgeverzameling van G1. De grafiek G1 heeft één verbonden component, laten we het C1, die alle hoekpunten van G1bevat. Laten we nu controleren of de set C1 aan de definitie voldoet of niet.

volgens de definitie moeten de hoekpunten in de verzameling C1 elkaar bereiken via een pad. We kiezen voor twee willekeurige hoekpunten V1 en V6:

  • V6 bereikbaar te V1 via: E4 \rightarrow E7 \ of\ E3 \rightarrow E5 \rightarrow E7 \ of\ E1 \rightarrow E2 \rightarrow E6 \rightarrow E7
  • V1 bereikbaar te V6 via: E7 \rightarrow E4 \ or\ E7 \rightarrow E5 \rightarrow E3 \ or\ E7 \rightarrow E6\rightarrow E2 \rightarrow E1

de hoekpunten V1 en V6 voldeed aan de definitie, en we konden hetzelfde doen met andere vertex paren in C1 ook.

3.2. Meer dan één verbonden Component

in dit voorbeeld heeft de niet-gerichte grafiek drie verbonden componenten:

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\}.

nu, laten we eens kijken of aangesloten componenten C1C2, en C3 voldoen aan de definitie of niet. We zullen willekeurig een paar kiezen uit elke C1C2, en C3 set.

uit de set C1, kiezen we de hoekpunten V4 en V6.

  • V6 is bereikbaar met v4 via: E2 \rightarrow E6 \rightarrow E7 \ of\ E1 \rightarrow E4 \rightarrow E7 \ of\ E1 \rightarrow E3 \rightarrow E5 \rightarrow E7
  • V4 bereikbaar te V6 via: E7 \rightarrow E6 \rightarrow E2 \ of\ E7 \rightarrow E4 \rightarrow E1 \ of\ E7 \rightarrow E5 \rightarrow E3 \rightarrow E1

laten we Nu kiezen de hoekpunten V8 en V9 uit de set 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 bereikbaar te V11E10 \rightarrow E11

Dus vanaf deze eenvoudige demonstraties, het is duidelijk dat C1C2, en C3 volg de aangesloten component definitie.

Properties

omdat we de definitie al hebben besproken en een paar voorbeelden van de verbonden componenten hebben gedemonstreerd, is het een goed moment om een lijst te maken van enkele belangrijke eigenschappen die verbonden component altijd bevat.

ten eerste is de set verbonden componenten altijd niet leeg.

bovendien, als er meer dan één verbonden component voor een gegeven grafiek is dan zal de Vereniging van verbonden componenten de verzameling van alle hoekpunten van de gegeven grafiek geven.

bijvoorbeeld G2:

\

ten slotte worden verbonden componentensets paarsgewijs disjunct. Dat betekent dat als we het snijpunt nemen tussen twee verschillende verbonden componentensets dan zal het snijpunt gelijk zijn aan een lege verzameling of een nul verzameling.

laten we eens kijken naar de verbonden componenten van graph G2. In G2, laten we deze eigenschap controleren:

\

Connected Components vinden

gegeven een niet – gerichte grafiek is het belangrijk om het aantal connected components te achterhalen om de structuur van de grafiek te analyseren-het heeft veel real-life applicaties. We kunnen DFS of BFS gebruiken voor deze taak.

in deze sectie zullen we een DFS-gebaseerd algoritme bespreken dat ons het aantal verbonden componenten geeft voor een gegeven niet-gerichte grafiek:

weergegeven door QuickLaTeX.com

De variabele Component_Count geeft het aantal verbonden componenten in de gegeven grafiek terug.

we beginnen met het initialiseren van alle hoekpunten van de vlag die niet is bezocht. We kiezen vervolgens een willekeurig hoekpunt om te starten en controleren of we het hoekpunt hebben bezocht of niet. Als we dat niet deden, noemen we de DFS-functie.

zodra alle hoekpunten gemarkeerd zijn als bezocht, beëindigt en drukt het algoritme het aantal verbonden componenten af.

in de DFS-functie zijn de argumenten die we doorgeven een vertexverzameling die alle hoekpunten van de gegeven grafiek bevat en een bepaald vertex dat bij de vertexverzameling moet behoren.

eerst markeren we het specifieke invoerpunt als bezocht. Dan berekenen we de aangrenzende hoekpunten van de gegeven specifieke input vertex. Voor elke aangrenzende hoekpunt controleren we of we ze al dan niet hebben bezocht. Zo niet, dan roepen we de DFS-functie recursief aan totdat we alle aangrenzende hoekpunten als bezocht markeren.

het belangrijkste punt om te observeren in het algoritme is dat het aantal verbonden componenten gelijk is aan het aantal onafhankelijke DFS-functieaanroepen. De Component_Count variabele telt het aantal gesprekken. Dit omvat natuurlijk niet de calls die recursief worden gemaakt onder de DFS() functie.

Test Run

laten we het algoritme op een voorbeeldgrafiek uitvoeren:

gegeven een niet-gerichte grafiek G3(V, E), waarbij V = \{V1, V2, V3, V4, V5, V6, V7, V8\}, en E = \{E1, E2, E3, E4, E5\}.

de eerste stap van het algoritme is om alle hoekpunten te initialiseren en te markeren als niet bezocht.

Het Rode punt geeft aan dat het niet wordt bezocht. Het groene hoekpunt geeft aan dat het wordt bezocht door het algoritme:

We kunnen elk hoekpunt uit de hoekpuntlijst kiezen om het algoritme te starten. Laten we V1kiezen.

het algoritme controleert of het al dan niet wordt bezocht. In dit geval wordt V1 niet bezocht. Het roept dus DFS (V, V1)aan.

binnen DFS () labelt het eerst de vertex V1 Als bezocht en zoekt naar de aangrenzende hoekpunten van V1. Alle aangrenzende hoekpunten zijn ook gemarkeerd als bezocht. Als DFS klaar is met het bezoeken van alle aangrenzende hoekpunten van V1, wordt de Component_Count 1, en wordt de status van hoekpunten bijgewerkt:

opnieuw kiest het algoritme een willekeurig hoekpunt. Laten we deze keer V4 kiezen.

Het controleert of V4 al is bezocht of niet. Omdat het niet wordt bezocht, roept het algoritme DFS(V, V4)aan. Opnieuw markeert het algoritme de vertex V4 markeren als bezocht, en DFS zoekt naar de aangrenzende hoekpunten en markeert ze als bezocht. Nu wordt de Component_Count 2 en wordt de status van de vertex-lijst opnieuw bijgewerkt:

het algoritme gaat verder en kiest V6, controleert de status en roept DFS(V, V6)aan. De vertex V6 en de aangrenzende hoekpunten worden aangeduid als bezocht en de Component_Count neemt toe tot 3. Het algoritme werkt de status van de vertexlijst bij:

ten slotte kiest het algoritme V8, roept DFS(V, V8) aan en maakt V8 zoals bezocht. De vertex V8 heeft geen aangrenzende hoekpunten, dus DFS geeft terug en Component_Count stijgt naar 4. Ten slotte werkt het algoritme de status van de vertexlijst bij:

naarmate het algoritme klaar is met het doorlopen van alle hoekpunten van de grafiek G3, eindigt en retourneert het de waarde van Component_Count die gelijk is aan het aantal verbonden componenten in G3. In dit geval vinden de algoritmen vier verbonden componenten in G3:

gebruikten We vier verschillende kleuren ter illustratie van de aangesloten componenten in G3, namelijk: C1 = \{V1, V2, V3\}C2 = \{V4, V5\}C3 = \{V6, V7\}C4 = \{V8\}.

time Complexity Analysis

het algoritme dat we net zagen voor het vinden van verbonden componenten in een bepaalde Niet-gerichte grafiek gebruikt de DFS-zoekfunctie en telt het aantal aanroepen naar de DFS-functie. Als de grafiek wordt weergegeven door de adjacency-lijst, dan bezoekt de DFS-zoekopdracht alle hoekpunten één keer en elke rand twee keer in het geval van een niet-gerichte grafiek. De controle van de vertex-status neemt o(1) tijd in beslag. Dus in totaal neemt ons algoritme \mathbf{O(V+E)} tijd.

in het geval dat de grafiek wordt weergegeven door de adjacency matrix, neemt de DFS-zoekopdracht o(v^2) tijd als het nodig is om de hele rij te doorlopen om de aangrenzende hoekpunten te evalueren. De controle van de vertex-status neemt opnieuw o(1) tijd in beslag. Dit geeft ons een totaal van \ mathbf{O (v^2)} tijd.

conclusie

In dit artikel hebben we een eenvoudige definitie van verbonden component besproken, gevolgd door een paar eenvoudige en gemakkelijk te begrijpen voorbeelden. Ook hebben we een aantal gemeenschappelijke maar belangrijke eigenschappen van aangesloten componenten opgesomd.

vervolgens bespraken we een DFS-zoekalgoritme om het aantal verbonden componenten in een gegeven grafiek te vinden. We demonstreerden het algoritme met behulp van een steekproefgrafiek. Tot slot analyseerden we de tijdscomplexiteit van het algoritme.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.