logo

DFS (Depth First Search) algoritmas

Šiame straipsnyje aptarsime DFS algoritmą duomenų struktūroje. Tai rekursinis algoritmas, skirtas ieškoti visose medžio duomenų struktūros ar grafiko viršūnėse. Pirmojo gylio paieškos (DFS) algoritmas pradedamas nuo pradinio grafiko G mazgo ir eina gilyn, kol randame tikslo mazgą arba mazgą be vaikų.

Dėl rekursyvaus pobūdžio DFS algoritmui įgyvendinti galima naudoti kamino duomenų struktūrą. DFS diegimo procesas yra panašus į BFS algoritmą.

Žingsnis po žingsnio DFS perėjimo įgyvendinimo procesas pateikiamas taip:

  1. Pirmiausia sukurkite krūvą su visu grafiko viršūnių skaičiumi.
  2. Dabar pasirinkite bet kurią viršūnę kaip pradžios tašką ir įstumkite tą viršūnę į krūvą.
  3. Po to stumkite nelankytą viršūnę (greta viršūnės krūvos viršuje) į krūvos viršūnę.
  4. Dabar kartokite 3 ir 4 veiksmus, kol nebeliks jokių viršūnių, kurias būtų galima aplankyti iš krūvos viršuje esančios viršūnės.
  5. Jei viršūnės neliko, grįžkite atgal ir iškelkite viršūnę iš krūvos.
  6. Kartokite 2, 3 ir 4 veiksmus, kol krūva bus tuščia.

DFS algoritmo taikymas

DFS algoritmo naudojimo programos pateikiamos taip:

  • DFS algoritmas gali būti naudojamas topologiniam rūšiavimui įgyvendinti.
  • Jis gali būti naudojamas ieškant kelių tarp dviejų viršūnių.
  • Jis taip pat gali būti naudojamas aptikti ciklus grafike.
  • DFS algoritmas taip pat naudojamas vieno sprendimo galvosūkiams.
  • DFS naudojamas nustatyti, ar grafikas yra dvišalis, ar ne.

Algoritmas

1 žingsnis: NUSTATYTI STATUSĄ = 1 (parengties būsena) kiekvienam G mazgui

2 žingsnis: Pastumkite pradinį mazgą A ant krūvos ir nustatykite jo STATUS = 2 (laukimo būsena)

3 veiksmas: Kartokite 4 ir 5 veiksmus, kol STACK bus tuščias

4 veiksmas: Atidarykite viršutinį mazgą N. Apdorokite jį ir nustatykite jo STATUS = 3 (apdorota būsena)

5 veiksmas: Įstumkite į krūvą visus N kaimynus, kurie yra parengties būsenoje (kurių STATUSAS = 1) ir nustatykite jų STATUSAS = 2 (laukimo būsena)

[KILPOS PABAIGA]

6 veiksmas: IŠĖJIMAS

Pseudokodas

 DFS(G,v) ( v is the vertex where the search starts ) Stack S := {}; ( start with an empty stack ) for each vertex u, set visited[u] := false; push S, v; while (S is not empty) do u := pop S; if (not visited[u]) then visited[u] := true; for each unvisited neighbour w of uu push S, w; end if end while END DFS() 

DFS algoritmo pavyzdys

Dabar, naudodami pavyzdį, supraskime, kaip veikia DFS algoritmas. Toliau pateiktame pavyzdyje yra nukreiptas grafikas, turintis 7 viršūnes.

DFS algoritmas

Dabar pradėkime nagrinėti grafiką, pradedant nuo mazgo H.

1 žingsnis - Pirmiausia stumkite H ant kamino.

 STACK: H 

2 žingsnis - Iškelkite viršutinį elementą iš krūvos, t. y. H, ir atsispausdinkite. Dabar įstumkite visus H kaimynus į krūvą, kurie yra paruoštos būsenos.

10 iš 50
 Print: H]STACK: A 

3 veiksmas - Iškelkite viršutinį elementą iš krūvos, t. y. A, ir atsispausdinkite. Dabar įstumkite visus A kaimynus į krūvą, kurie yra parengtos būsenos.

 Print: A STACK: B, D 

4 veiksmas - Iškelkite viršutinį elementą iš krūvos, t. y. D, ir atsispausdinkite. Dabar įstumkite visus D kaimynus į krūvą, kurie yra paruoštos būsenos.

 Print: D STACK: B, F 

5 veiksmas - Iškelkite viršutinį elementą iš krūvos, t. y. F, ir atsispausdinkite. Dabar įstumkite visus F kaimynus į krūvą, kurie yra parengties būsenoje.

 Print: F STACK: B 

6 veiksmas - Iškelkite viršutinį elementą iš krūvos, t. y. B, ir atsispausdinkite. Dabar įstumkite visus B kaimynus į krūvą, kurie yra parengtos būsenos.

 Print: B STACK: C 

7 veiksmas - Iškelkite viršutinį elementą iš krūvos, t. y. C, ir atsispausdinkite. Dabar įstumkite visus C kaimynus į krūvą, kurie yra parengties būsenoje.

 Print: C STACK: E, G 

8 veiksmas - Iškelkite viršutinį elementą iš krūvos, t. y. G, ir stumkite visus G gretimus į krūvą, kurie yra parengtos būsenos.

 Print: G STACK: E 

9 veiksmas - POP viršutinį elementą iš krūvos, t. y. E, ir stumkite visus E kaimyninius į krūvą, kurie yra parengties būsenos.

 Print: E STACK: 

Dabar visi grafiko mazgai buvo pereiti, o krūva tuščia.

Pirmojo gylio paieškos algoritmo sudėtingumas

DFS algoritmo laiko sudėtingumas yra O (V+E) , kur V – viršūnių skaičius, o E – kraštinių skaičius grafe.

DFS algoritmo erdvės sudėtingumas yra O(V).

DFS algoritmo įgyvendinimas

Dabar pažiūrėkime, kaip įdiegtas DFS algoritmas Java.

Šiame pavyzdyje grafikas, kurį naudojame kodui parodyti, pateikiamas taip:

DFS algoritmas
 /*A sample java program to implement the DFS algorithm*/ import java.util.*; class DFSTraversal { private LinkedList adj[]; /*adjacency list representation*/ private boolean visited[]; /* Creation of the graph */ DFSTraversal(int V) /*&apos;V&apos; is the number of vertices in the graph*/ { adj = new LinkedList[V]; visited = new boolean[V]; for (int i = 0; i <v; i++) adj[i]="new" linkedlist(); } * adding an edge to the graph void insertedge(int src, int dest) { adj[src].add(dest); dfs(int vertex) visited[vertex]="true;" *mark current node as visited* system.out.print(vertex + ' '); iterator it="adj[vertex].listIterator();" while (it.hasnext()) n="it.next();" if (!visited[n]) dfs(n); public static main(string args[]) dfstraversal dfstraversal(8); graph.insertedge(0, 1); 2); 3); graph.insertedge(1, graph.insertedge(2, 4); graph.insertedge(3, 5); 6); graph.insertedge(4, 7); graph.insertedge(5, system.out.println('depth first traversal for is:'); graph.dfs(0); < pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/28/dfs-algorithm-3.webp" alt="DFS algorithm"> <h3>Conclusion</h3> <p>In this article, we have discussed the depth-first search technique, its example, complexity, and implementation in the java programming language. Along with that, we have also seen the applications of the depth-first search algorithm.</p> <p>So, that&apos;s all about the article. Hope it will be helpful and informative to you.</p> <hr></v;>