anslutna komponenter i en graf

översikt

i denna handledning diskuterar vi begreppet anslutna komponenter i en oriktad graf.

Vi går igenom några enkla exempel för att få en grundläggande förståelse, och sedan listar vi egenskaperna hos anslutna komponenter.

ansluten Komponentdefinition

en ansluten komponent eller helt enkelt komponent i en oriktad graf är en undergraf där varje par noder är anslutna till varandra via en bana.

låt oss försöka förenkla det ytterligare. En uppsättning noder bildar en ansluten komponent i en oriktad graf om någon nod från uppsättningen noder kan nå någon annan nod genom att korsa kanter. Huvudpunkten här är nåbarhet.

I anslutna komponenter kan alla noder alltid nås från varandra.

några exempel

i det här avsnittet diskuterar vi några enkla exempel. Vi ska försöka relatera exemplen med definitionen ovan.

3.1. En ansluten komponent

i det här exemplet har den givna oriktade grafen en ansluten komponent:

låt oss namnge denna graf G1(V, E). Här V = \{V1, V2, V3, V4, V5, V6\} betecknar vertexuppsättningen och E = \{E1, E2, E3, E4, E5, E6, E7\} betecknar kantuppsättningen av G1. Grafen G1 har en ansluten komponent, låt oss namnge den C1, som innehåller alla hörn av G1. Låt oss nu kontrollera om uppsättningen C1 håller till definitionen eller inte.

enligt definitionen ska topparna i uppsättningen C1 nå varandra via en sökväg. Vi väljer två slumpmässiga hörn V1 och V6:

  • V6 kan nås till V1 via: E4 \rightarrow E7 \ eller\ E3 \rightarrow e5 \rightarrow E7 \ eller\ E1 \rightarrow E2 \Rightarrow E6 \rightarrow E7
  • v1 kan nås till v6 via: E7 \rightarrow E4 \ eller\ E7 \rightarrow E5 \rightarrow E3 \ eller\ E7 \rightarrow E6\rightarrow E2 \rightarrow E1

topparna V1 och V6 uppfyllde definitionen, och vi kunde göra detsamma med andra vertexpar i C1 också.

3.2. Mer än en ansluten komponent

i det här exemplet har den oriktade grafen tre anslutna komponenter:

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

låt oss nu se om anslutna komponenterC1C2 ochC3 uppfyller definitionen eller inte. Vi väljer slumpmässigt ett par från varjeC1C2 ochC3 set.

från uppsättningen C1, låt oss välja topparna V4 och V6.

  • V6 kan nås till V4 via: E2 \rightarrow E6 \rightarrow E7 \ eller\ E1 \rightarrow E4 \rightarrow E7 \ eller\ E1 \rightarrow E3 \rightarrow E5 \rightarrow E7
  • V4 kan nås till V6 via: E7 \Rightarrow E6 \Rightarrow E2 \ eller\ E7 \Rightarrow E4 \Rightarrow E1 \ eller\ E7 \rightarrow e5 \rightarrow E3 \rightarrow e1

låt oss nu välja topparna V8 och V9 från uppsättningen 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 kan nås till V11E10 \rightarrow E11

så från dessa enkla demonstrationer är det uppenbart att C1C2 och C3 följer den anslutna komponentdefinitionen.

egenskaper

som vi redan har diskuterat definitionen och visat ett par exempel på de anslutna komponenterna är det en bra tid att lista ut några av de viktiga egenskaperna som ansluten komponent alltid har.

först och främst är den anslutna komponentuppsättningen alltid tom.

dessutom, om det finns mer än en ansluten komponent för en given graf, kommer föreningen av anslutna komponenter att ge uppsättningen av alla hörn av den givna grafen.

till exempel G2:

\

slutligen är anslutna komponentuppsättningar parvis åtskilda. Det betyder att om vi tar korsningen mellan två olika anslutna komponentuppsättningar kommer korsningen att vara lika med en tom uppsättning eller en nolluppsättning.

låt oss överväga de anslutna komponenterna i grafen G2 igen. I G2, låt oss kolla den här egenskapen:

\

hitta anslutna komponenter

med en oriktad graf är det viktigt att ta reda på antalet anslutna komponenter för att analysera grafens struktur – det har många verkliga applikationer. Vi kan använda antingen DFS eller BFS för denna uppgift.

i det här avsnittet diskuterar vi en DFS-baserad algoritm som ger oss antalet anslutna komponenter för en given oriktad graf:

gjord av QuickLaTeX.com

variabeln Component_Count returnerar antalet anslutna komponenter i den givna grafen.

vi börjar med att initiera alla hörn till flaggan som inte besökts. Vi väljer sedan ett slumpmässigt toppunkt för att starta och kontrollera om vi har besökt toppunktet eller inte. Om vi inte gjorde det kallar vi DFS-funktionen.

När alla hörn markerade som besökta, avslutar algoritmen och skriver ut numret på de anslutna komponenterna.

i DFS-funktionen är argumenten som vi skickar en vertexuppsättning som innehåller alla hörn i den givna grafen och ett visst vertex som måste tillhöra vertexuppsättningen.

först markerar vi det specifika ingångsvertexet som besökt. Sedan beräknar vi de intilliggande hörnen av det givna specifika ingångsvertexet. För varje intilliggande toppunkt kontrollerar vi om vi besökte dem eller inte. Om inte, kallar vi DFS-funktionen rekursivt tills vi markerar alla intilliggande hörn som besökta.

nyckelpunkten att observera i algoritmen är att antalet anslutna komponenter är lika med antalet oberoende DFS-funktionsanrop. Variabeln Component_Count räknar antalet samtal. Naturligtvis inkluderar detta inte de samtal som görs under DFS () – funktionen rekursivt.

testkörning

Låt oss köra algoritmen på ett exempeldiagram:

ges en oriktad graf G3(V, e), där V = \{V1, V2, V3, V4, V5, V6, V7, V8\} och E = \{E1, E2, E3, E4, E5\}.

det första steget i algoritmen är att initiera alla hörn och markera dem som inte besökta.

det röda vertexet anger att det inte besöks. Den gröna vertex betecknar det besöks av algoritmen:

Vi kan välja någon vertex från vertex listan för att starta algoritmen. Låt oss välja V1.

algoritmen kontrollerar om den besöks eller inte. I detta fall besöks inte V1. Så det kallar DFS(V, V1).

inom DFS () märker den först vertexen V1 som besökt och söker efter intilliggande hörn av V1. Alla intilliggande hörn är också markerade som besökta. När DFS är klar med att besöka alla intilliggande hörn av V1 blir Component_Count 1 och statusen för hörn uppdateras:

återigen väljer algoritmen något slumpmässigt toppunkt. Låt oss välja V4 den här gången.

den kontrollerar om V4 redan är besökt eller inte. Eftersom det inte besöks så anropar algoritmen DFS(V, V4). Återigen markerar algoritmen vertexen V4 markera som besökt, och DFS söker efter dess intilliggande hörn och markerar dem som besökta. Nu blir Component_Count 2, och statusen för vertexlistan uppdateras igen:

algoritmen fortsätter och väljerV6, kontrollerar statusen och anroparDFS(V, V6). Vertexen V6 och dess intilliggande hörn är märkta som besökta och Component_Count ökar till 3. Algoritmen uppdaterar topplistan status:

slutligen väljer algoritmen V8, kallar DFS(V, V8) och gör V8 som besökt. Vertexen V8 har inga intilliggande hörn så DFS returnerar och Component_Count ökar till 4. Slutligen uppdaterar algoritmen statusen för vertexlistan:

När algoritmen är klar genom att korsa alla hörn i grafen G3 avslutas den och returnerar värdet på Component_Count vilket motsvarar antalet anslutna komponenter i G3div>. I det här fallet hittar algoritmerna fyra anslutna komponenter i G3:

Vi använde fyra olika färger för att illustrera de anslutna komponenterna i G3, nämligen: C1 = \{V1, V2, V3\}C2 = \{v4, v5\}C3 = \{V6, V7\}C4 = \{V8\}.

Tidskomplexitetsanalys

algoritmen vi just såg för att hitta anslutna komponenter i en given oriktad graf använder DFS-sökningen och räknar antalet samtal till DFS-funktionen. Om grafen representeras av adjacency-listan besöker DFS-sökningen alla hörn en gång och varje kant två gånger i händelse av en oriktad graf. Kontrollen av vertexstatusen tar o(1) tid. Således totalt kommer vår algoritm att ta\mathbf{O(V+E)} tid.

om grafen representeras av adjacency-matrisen tar DFS-sökningen O(V^2) tid eftersom den behöver korsa hela raden för att utvärdera grannens hörn. Kontrollen av vertexstatusen tar igen o(1) tid. Således ger oss totalt \mathbf{O(V^2)} tid.

slutsats

i den här artikeln diskuterade vi en enkel definition av ansluten komponent följt av ett par enkla och lättförståeliga exempel. Vi listade också ut några vanliga men viktiga egenskaper hos anslutna komponenter.

sedan diskuterade vi en DFS-sökbaserad algoritm för att hitta antalet anslutna komponenter i en given graf. Vi demonstrerade algoritmen med hjälp av ett provdiagram. Slutligen analyserade vi algoritmens tidskomplexitet.

Lämna ett svar

Din e-postadress kommer inte publiceras.