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 wykres. Tutaj oznacza zestaw wierzchołków i oznacza zestaw krawędzi . Wykres ma jeden połączony komponent, nazwijmy go , który zawiera wszystkie wierzchołki . Teraz sprawdźmy, czy zestaw trzyma się definicji, czy nie.
zgodnie z definicją wierzchołki w zbiorze powinny do siebie dotrzeć ścieżką. Wybieramy dwa losowe wierzchołki I :
- jest osiągalny do poprzez:
- jest osiągalny do via:
wierzchołki I spełnia definicję i możemy zrobić to samo z innymi parami wierzchołków w.
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 , where , and . The graph has 3 connected components: and .
teraz zobaczmy, czy połączone komponenty I spełniają definicję, czy nie. Wybierzemy losowo parę z każdego zestawu I.
z zestawu, wybierzmy wierzchołki I.
- jest osiągalny do przez:
- jest osiągalny do Via:
teraz wybierzmy wierzchołki I z zestawu .
- is reachable to
- is reachable to
Finally, let’s pick the vertices and from the set .
- is reachable to
- jest osiągalny do
z tych prostych demonstracji wynika, że I 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 :
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 . W , 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:
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 , gdzie I .
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 .
algorytm sprawdza czy jest odwiedzany czy nie. W tym przypadku nie jest odwiedzany. Tak więc wywołuje .
W DFS () najpierw oznacza wierzchołekjako odwiedzony i wyszukuje sąsiednie wierzchołki. Wszystkie sąsiednie wierzchołki są również oznaczone jako odwiedzone. Gdy plik DFS zakończy odwiedzanie wszystkich sąsiednich wierzchołków , wartość Component_Count staje się 1, a stan wierzchołków jest aktualizowany:
ponownie algorytm wybiera dowolny losowy wierzchołek. Wybierzmy tym razem.
sprawdza, czy jest już odwiedzony, czy nie. Ponieważ nie jest odwiedzany, algorytm wywołuje . Ponownie algorytm oznacza wierzchołek 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 , sprawdza status i wywołuje . Wierzchołek 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 , wywołuje i sprawia, że jako odwiedzone. Wierzchołek 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 , kończy i zwraca wartość Component_Count, która jest równa liczbie połączonych elementów w div>. W tym przypadku algorytmy znajdują cztery połączone komponenty w :
użyliśmy czterech różnych kolorów, aby zilustrować połączone elementy w, a mianowicie:.
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 . Tak więc w sumie nasz algorytm zajmie czas.
w przypadku, gdy wykres jest reprezentowany przez macierz adjacency, wyszukiwanie DFS zajmuje czas, ponieważ musi przejść cały wiersz, aby obliczyć wierzchołki sąsiadów. Ponowne sprawdzenie stanu wierzchołka trwa . W ten sposób otrzymujemy sumę 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.