logo

DFS-algoritme (Depth First Search).

In dit artikel bespreken we het DFS-algoritme in de datastructuur. Het is een recursief algoritme om alle hoekpunten van een boomdatastructuur of een grafiek te doorzoeken. Het Depth-First Search (DFS)-algoritme begint met het initiële knooppunt van grafiek G en gaat dieper totdat we het doelknooppunt of het knooppunt zonder kinderen vinden.

Vanwege het recursieve karakter kan de stapelgegevensstructuur worden gebruikt om het DFS-algoritme te implementeren. Het implementatieproces van de DFS is vergelijkbaar met het BFS-algoritme.

Het stapsgewijze proces voor het implementeren van de DFS-traversal wordt als volgt gegeven:

  1. Maak eerst een stapel met het totale aantal hoekpunten in de grafiek.
  2. Kies nu een willekeurig hoekpunt als startpunt van de verplaatsing en duw dat hoekpunt in de stapel.
  3. Duw daarna een niet-bezocht hoekpunt (aangrenzend aan het hoekpunt bovenaan de stapel) naar de bovenkant van de stapel.
  4. Herhaal nu stap 3 en 4 totdat er geen hoekpunten meer zijn om te bezoeken vanaf het hoekpunt bovenaan de stapel.
  5. Als er geen hoekpunt meer over is, ga dan terug en knal een hoekpunt uit de stapel.
  6. Herhaal stap 2, 3 en 4 totdat de stapel leeg is.

Toepassingen van het DFS-algoritme

De toepassingen van het gebruik van het DFS-algoritme worden als volgt gegeven:

  • Het DFS-algoritme kan worden gebruikt om de topologische sortering te implementeren.
  • Het kan worden gebruikt om de paden tussen twee hoekpunten te vinden.
  • Het kan ook worden gebruikt om cycli in de grafiek te detecteren.
  • Het DFS-algoritme wordt ook gebruikt voor puzzels met één oplossing.
  • DFS wordt gebruikt om te bepalen of een grafiek bipartiet is of niet.

Algoritme

Stap 1: SET STATUS = 1 (gereedstatus) voor elk knooppunt in G

Stap 2: Duw het startknooppunt A op de stapel en stel de STATUS in op 2 (wachtstatus)

Stap 3: Herhaal stap 4 en 5 totdat STACK leeg is

Stap 4: Pop het bovenste knooppunt N. Verwerk het en stel de STATUS in op 3 (verwerkte status)

Stap 5: Duw op de stapel alle buren van N die zich in de gereed-status bevinden (waarvan STATUS = 1) en stel hun STATUS = 2 in (wachtstatus)

[EINDE LUS]

Stap 6: UITGANG

Pseudocode

 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() 

Voorbeeld van een DFS-algoritme

Laten we nu de werking van het DFS-algoritme begrijpen aan de hand van een voorbeeld. In het onderstaande voorbeeld is er een gerichte graaf met 7 hoekpunten.

DFS-algoritme

Laten we nu beginnen met het onderzoeken van de grafiek, beginnend bij Knooppunt H.

java booleaans

Stap 1 - Duw eerst H op de stapel.

 STACK: H 

Stap 2 - POP het bovenste element van de stapel, d.w.z. H, en druk het af. DRUK nu alle buren van H op de stapel die gereed zijn.

 Print: H]STACK: A 

Stap 3 - POP het bovenste element van de stapel, d.w.z. A, en druk het af. Duw nu alle buren van A op de stapel die gereed zijn.

 Print: A STACK: B, D 

Stap 4 - POP het bovenste element van de stapel, d.w.z. D, en druk het af. PUSH nu alle buren van D op de stapel die gereed zijn.

 Print: D STACK: B, F 

Stap 5 - POP het bovenste element van de stapel, d.w.z. F, en druk het af. PUSH nu alle buren van F op de stapel die gereed zijn.

 Print: F STACK: B 

Stap 6 - POP het bovenste element van de stapel, d.w.z. B, en druk het af. DRUK nu alle buren van B op de stapel die gereed zijn.

 Print: B STACK: C 

Stap 7 - POP het bovenste element van de stapel, d.w.z. C, en druk het af. PUSH nu alle buren van C op de stapel die gereed zijn.

 Print: C STACK: E, G 

Stap 8 - POP het bovenste element van de stapel, d.w.z. G, en PUSH alle buren van G op de stapel die gereed zijn.

 Print: G STACK: E 

Stap 9 - POP het bovenste element van de stapel, d.w.z. E, en PUSH alle buren van E op de stapel die gereed zijn.

 Print: E STACK: 

Nu zijn alle grafiekknooppunten doorlopen en is de stapel leeg.

Complexiteit van het Depth-first zoekalgoritme

De tijdscomplexiteit van het DFS-algoritme is O(V+E) , waarbij V het aantal hoekpunten is en E het aantal randen in de grafiek.

De ruimtecomplexiteit van het DFS-algoritme is O(V).

Implementatie van DFS-algoritme

Laten we nu eens kijken naar de implementatie van het DFS-algoritme in Java.

In dit voorbeeld wordt de grafiek die we gebruiken om de code te demonstreren als volgt weergegeven:

DFS-algoritme
 /*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;>