Connected Components in a Graph

przegląd

w tym samouczku omówimy koncepcję connected components in an undirected graph .

przejrzymy kilka prostych przykładów, aby uzyskać podstawowe zrozumienie, a następnie wymienimy właściwości połączonych komponentów.

Connected Component definicja

połączony komponent lub po prostu Składnik wykresu nieskierowanego jest podgrafem, w którym każda para węzłów jest połączona ze sobą ścieżką.

spróbujmy to jeszcze bardziej uprościć. Zbiór węzłów tworzy połączony komponent w wykresie nie kierowanym, jeśli jakikolwiek węzeł ze zbioru węzłów może dotrzeć do dowolnego innego węzła przez przesuwanie krawędzi. Głównym punktem jest tutaj osiągalność.

w połączonych komponentach wszystkie węzły są zawsze dostępne od siebie.

kilka przykładów

w tej sekcji omówimy kilka prostych przykładów. Spróbujemy powiązać przykłady z powyższą definicją.

3.1. Jeden połączony komponent

w tym przykładzie dany niezdirected Wykres ma jeden połączony komponent:

nazwijmy ten wykresG1(V, E). Tutaj V = \{V1, V2, V3, V4, V5, V6\} oznacza zestaw wierzchołków i E = \{E1, E2, E3, E4, E5, E6, E7\} oznacza zestaw krawędzi G1. Wykres G1 ma jeden połączony komponent, nazwijmy go C1, który zawiera wszystkie wierzchołki G1. Teraz sprawdźmy, czy zestaw C1 trzyma się definicji, czy nie.

zgodnie z definicją wierzchołki w zbiorzeC1 powinny do siebie dotrzeć ścieżką. Wybieramy dwa losowe wierzchołki V1 I V6:

  • V6 jest osiągalny do V1 poprzez: E4 \rightarrow E7 \ lub\ E3 \rightarrow E5 \rightarrow E7 \ lub\ E1 \rightarrow E2 \rightarrow E6 \rightarrow E7
  • v1 jest osiągalny do v6 via: E7 \rightarrow E4 \ or\ E7 \rightarrow E5 \rightarrow E3 \ or\ E7 \rightarrow E6\rightarrow E2 \rightarrow E1

wierzchołkiV1 IV6 spełnia definicję i możemy zrobić to samo z innymi parami wierzchołków wC1.

3.2. Więcej niż jeden połączony komponent

w tym przykładzie wykresy nierozdzielone mają trzy połączone komponenty:

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

teraz zobaczmy, czy połączone komponentyC1C2 IC3 spełniają definicję, czy nie. Wybierzemy losowo parę z każdego zestawuC1C2 IC3.

z zestawuC1, wybierzmy wierzchołkiV4 IV6.

  • V6 jest osiągalny doV4 przez: E2 \rightarrow E6 \rightarrow E7 \ or\ E1 \rightarrow E4 \rightarrow E7 \ or\ E1 \rightarrow E3 \rightarrow E5 \rightarrow E7
  • V4 jest osiągalny do V6 Via: E7 \rightarrow E6 \rightarrow E2 \ or\ E7 \rightarrow E4 \rightarrow E1 \ or\ E7 \rightarrow E5 \rightarrow E3 \rightarrow E1

teraz wybierzmy wierzchołki V8 I V9 z zestawu 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 jest osiągalny doV11E10 \rightarrow E11

z tych prostych demonstracji wynika, żeC1C2 IC3 postępują zgodnie z definicją podłączonego komponentu.

właściwości

ponieważ omówiliśmy już definicję i zademonstrowaliśmy kilka przykładów połączonych komponentów, nadszedł dobry czas, aby wymienić niektóre ważne właściwości, które zawsze posiada połączony komponent.

Po pierwsze, zestaw podłączonych komponentów jest zawsze niepusty.

Ponadto, jeśli dla danego grafu jest więcej niż jeden połączony element, to związek połączonych elementów da zbiór wszystkich wierzchołków danego grafu.

na przykład G2:

\

wreszcie, połączone zestawy komponentów są parami rozłącznymi. Oznacza to, że jeśli weźmiemy przecięcie między dwoma różnymi połączonymi zbiorami komponentów, to przecięcie będzie równe pustemu zbiorowi lub zbiorowi null.

rozważmy ponownie połączone składniki grafu G2. W G2, sprawdźmy tę właściwość:

\

znajdowanie połączonych komponentów

biorąc pod uwagę nieskierowany Wykres, ważne jest, aby znaleźć liczbę połączonych komponentów do analizy struktury wykresu – ma wiele rzeczywistych zastosowań. Do tego zadania możemy użyć DFS lub BFS.

w tej sekcji omówimy algorytm oparty na DFS, który daje nam liczbę połączonych komponentów dla danego wykresu:

renderowany przez QuickLaTeX.com

zmienna Component_Count Zwraca liczbę połączonych elementów na podanym wykresie.

zaczynamy od inicjalizacji wszystkich wierzchołków do flagi Nie odwiedzanej. Następnie wybieramy dowolny losowy wierzchołek, aby rozpocząć i sprawdzamy, czy odwiedziliśmy wierzchołek, czy nie. Jeśli nie, wywołujemy funkcję DFS.

gdy wszystkie wierzchołki oznaczone jako odwiedzone, algorytm kończy pracę i wypisuje liczbę połączonych komponentów.

w funkcji DFS argumentami, które przekazujemy są zbiór wierzchołków zawierający wszystkie wierzchołki danego wykresu oraz określony wierzchołek, który musi należeć do zbioru wierzchołków.

najpierw oznaczamy dany wierzchołek wejściowy jako odwiedzony. Następnie obliczamy sąsiednie wierzchołki danego konkretnego wierzchołka wejściowego. Dla każdego sąsiedniego wierzchołka sprawdzamy, czy je odwiedziliśmy, czy nie. Jeśli nie, to wywołujemy funkcję DFS rekurencyjnie, dopóki nie oznaczymy wszystkich sąsiednich wierzchołków jako odwiedzonych.

kluczowym punktem do zaobserwowania w algorytmie jest to, że liczba połączonych elementów jest równa liczbie niezależnych wywołań funkcji DFS. Zmienna Component_Count zlicza liczbę wywołań. Oczywiście nie obejmuje to wywołań rekurencyjnie wykonywanych w funkcji DFS ().

Uruchom Test

Uruchom algorytm na przykładowym wykresie:

dany Wykres G3(V, E), gdzie V = \{V1, V2, V3, V4, V5, V6, V7, V8\} I E = \{E1, E2, E3, E4, E5\}.

pierwszym krokiem algorytmu jest zainicjowanie wszystkich wierzchołków i zaznaczenie ich jako nie odwiedzonych.

czerwony wierzchołek oznacza, że nie jest odwiedzany. Zielony wierzchołek oznacza, że jest odwiedzany przez algorytm:

możemy wybrać dowolny wierzchołek z listy wierzchołków, aby uruchomić algorytm. Wybierzmy V1.

algorytm sprawdza czy jest odwiedzany czy nie. W tym przypadku V1 nie jest odwiedzany. Tak więc wywołuje DFS(V, V1).

W DFS () najpierw oznacza wierzchołekV1jako odwiedzony i wyszukuje sąsiednie wierzchołkiV1. Wszystkie sąsiednie wierzchołki są również oznaczone jako odwiedzone. Gdy plik DFS zakończy odwiedzanie wszystkich sąsiednich wierzchołków V1, wartość Component_Count staje się 1, a stan wierzchołków jest aktualizowany:

ponownie algorytm wybiera dowolny losowy wierzchołek. Wybierzmy v4 tym razem.

sprawdza, czy V4 jest już odwiedzony, czy nie. Ponieważ nie jest odwiedzany, algorytm wywołuje DFS(V, V4). Ponownie algorytm oznacza wierzchołek V4 oznacza jako odwiedzony, a DFS wyszukuje sąsiednie wierzchołki i oznacza je jako odwiedzone. Teraz wartość Component_Count wynosi 2, a status listy wierzchołków jest ponownie aktualizowany:

algorytm kontynuuje i wybiera V6, sprawdza status i wywołuje DFS(V, V6). Wierzchołek V6 I sąsiadujące z nim wierzchołki są oznaczone jako odwiedzone, a wartość Component_Count wzrasta do 3. Algorytm aktualizuje status listy wierzchołków:

wreszcie, algorytm wybiera V8, wywołuje DFS(V, V8) i sprawia, że V8 jako odwiedzone. Wierzchołek V8 nie ma żadnych sąsiednich wierzchołków, więc DFS zwraca i Component_Count zwiększa się do 4. Na koniec algorytm aktualizuje status listy wierzchołków:

gdy algorytm kończy przechodzić przez wszystkie wierzchołki grafu G3, kończy i zwraca wartość Component_Count, która jest równa liczbie połączonych elementów w G3div>. W tym przypadku algorytmy znajdują cztery połączone komponenty w G3:

użyliśmy czterech różnych kolorów, aby zilustrować połączone elementy wG3, a mianowicie:C1 = \{V1, V2, V3\}C2 = \{v4, v5\}C3 = \{V6, V7\}C4 = \{V8\}.

Analiza złożoności czasowej

algorytm, który właśnie widzieliśmy, aby znaleźć połączone komponenty na danym wykresie nieskierowanym, wykorzystuje wyszukiwanie DFS i zlicza liczbę wywołań funkcji DFS. Jeśli wykres jest reprezentowany przez Listę adjacency, to wyszukiwanie DFS odwiedza wszystkie wierzchołki raz i każdą krawędź dwa razy w przypadku wykresu nieskierowanego. Sprawdzanie stanu wierzchołka trwa O(1). Tak więc w sumie nasz algorytm zajmie \ mathbf{O(V + E)} czas.

w przypadku, gdy wykres jest reprezentowany przez macierz adjacency, wyszukiwanie DFS zajmuje O(V^2) czas, ponieważ musi przejść cały wiersz, aby obliczyć wierzchołki sąsiadów. Ponowne sprawdzenie stanu wierzchołka trwa O(1). W ten sposób otrzymujemy sumę\mathbf{O(V^2)} czasu.

podsumowanie

w tym artykule omówiliśmy prostą definicję połączonego komponentu, a następnie kilka prostych i łatwych do zrozumienia przykładów. Wymieniliśmy również kilka typowych, ale ważnych właściwości połączonych komponentów.

następnie omówiliśmy algorytm oparty na wyszukiwaniu DFS, aby znaleźć liczbę połączonych elementów na danym wykresie. Zademonstrowaliśmy algorytm za pomocą przykładowego wykresu. Na koniec przeanalizowaliśmy złożoność czasową algorytmu.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.