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 . Hier geeft de vertexverzameling aan en de edgeverzameling van . De grafiek heeft één verbonden component, laten we het , die alle hoekpunten van bevat. Laten we nu controleren of de set aan de definitie voldoet of niet.
volgens de definitie moeten de hoekpunten in de verzameling elkaar bereiken via een pad. We kiezen voor twee willekeurige hoekpunten en :
- bereikbaar te via:
- bereikbaar te via:
de hoekpunten en voldeed aan de definitie, en we konden hetzelfde doen met andere vertex paren in 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 , where , and . The graph has 3 connected components: and .
nu, laten we eens kijken of aangesloten componenten , en voldoen aan de definitie of niet. We zullen willekeurig een paar kiezen uit elke , en set.
uit de set , kiezen we de hoekpunten en .
- is bereikbaar met via:
- bereikbaar te via:
laten we Nu kiezen de hoekpunten en uit de set .
- is reachable to
- is reachable to
Finally, let’s pick the vertices and from the set .
- is reachable to
- bereikbaar te
Dus vanaf deze eenvoudige demonstraties, het is duidelijk dat , en 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 :
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 . In , 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:
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 , waarbij , en .
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 kiezen.
het algoritme controleert of het al dan niet wordt bezocht. In dit geval wordt niet bezocht. Het roept dus aan.
binnen DFS () labelt het eerst de vertex Als bezocht en zoekt naar de aangrenzende hoekpunten van . Alle aangrenzende hoekpunten zijn ook gemarkeerd als bezocht. Als DFS klaar is met het bezoeken van alle aangrenzende hoekpunten van , wordt de Component_Count 1, en wordt de status van hoekpunten bijgewerkt:
opnieuw kiest het algoritme een willekeurig hoekpunt. Laten we deze keer kiezen.
Het controleert of al is bezocht of niet. Omdat het niet wordt bezocht, roept het algoritme aan. Opnieuw markeert het algoritme de vertex 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 , controleert de status en roept aan. De vertex 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 , roept aan en maakt zoals bezocht. De vertex 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 , eindigt en retourneert het de waarde van Component_Count die gelijk is aan het aantal verbonden componenten in . In dit geval vinden de algoritmen vier verbonden componenten in :
gebruikten We vier verschillende kleuren ter illustratie van de aangesloten componenten in , namelijk: .
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 tijd in beslag. Dus in totaal neemt ons algoritme tijd.
in het geval dat de grafiek wordt weergegeven door de adjacency matrix, neemt de DFS-zoekopdracht 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 tijd in beslag. Dit geeft ons een totaal van 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.