|
|||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
Przeszukiwanie w głąb (ang. Depth-first search, w skrócie DFS) – w informatyce algorytm przeszukiwania grafu używany do przechodzenia lub przeszukiwania drzewa lub grafu. Przeszukiwanie zaczyna się od korzenia i porusza się w dół do samego końca gałęzi, po czym wraca się o jeden poziom i próbuje kolejne gałęzie itd.
edytuj PrzykładPrzyjrzyjmy się poniższemu grafowi: Zakładając że najpierw wybiera się węzły z lewej strony, później te z prawej, przeszukiwanie zaczynając od A, odwiedzi się węzły w tej kolejności: A, B, D, B, F, E, F, B, A, C, G. edytuj Właściwościedytuj Złożoność pamięciowaZłożoność pamięciowa przeszukiwania w głąb jest o wiele mniejsza niż przeszukiwania wszerz. edytuj Złożoność czasowaZłożoność czasowa obu algorytmów jest proporcjonalna do sumy liczby wierzchołków i liczby krawędzi w przeszukiwanym grafie. edytuj Kompletnośćedytuj Zastosowania algorytmuPrzeszukiwanie w głąb jest często stosowanym algorytmem w teorii grafów. Używa się go m.in. do:
Rozwiązania poniższych problemów teoriografowych opierają się na przeszukiwaniu w głąb:
Ponadto algorytm ten jest często spotykany w rozwiązaniach typu brute force problemów z innych dziedzin. Bazuje na nim zdecydowana większość algorytmów służących do przeglądania drzewa gry, np. min-max, czy też alpha-beta. edytuj Przykład w C++Implementacja DFS w C++: void DFS(vector< vector<int> > &graf,int wierzcholek,vector<bool> &uzyto) { vector<int>::iterator iter; //iterator po sąsiadach wierzchołka uzytowierzcholek = true; //kolorujemy odwiedzony wierzchołek //na tym węźle jesteśmy cout <<wierzcholek<<"\n"; //przejście po sąsiadach wierzchołka for (iter=grafwierzcholek.begin(); iter!=grafwierzcholek.end(); iter++) { //jeżeli wierzchołek nie odwiedzony, to wywołujemy DFS rekurencyjnie if (uzyto*iter == false) DFS(graf,*iter,uzyto); } } void DFS(vector< vector<int> > &graf, //wektor wektorów, w którym zapisujemy sąsiadów wierzchołka int wierzcholek=0 //wierzchołek, od którego startujemy ) { vector <bool> uzyto(graf.size(),false); DFS(graf,wierzcholek,uzyto); } edytuj Bibliografia
|
| All Right Reserved © 2007, Designed by Stylish Blog. |