logo

ДФС (Дептх Фирст Сеарцх) алгоритам

У овом чланку ћемо разговарати о ДФС алгоритму у структури података. То је рекурзивни алгоритам за претраживање свих врхова структуре података дрвета или графа. Алгоритам претраге у дубину (ДФС) почиње са почетним чвором графа Г и иде дубље док не пронађемо циљни чвор или чвор без деце.

Због рекурзивне природе, структура података стека се може користити за имплементацију ДФС алгоритма. Процес имплементације ДФС-а је сличан БФС алгоритму.

замените боју у гимп-у

Процес корак по корак за имплементацију ДФС преласка је дат на следећи начин -

  1. Прво направите стек са укупним бројем врхова у графу.
  2. Сада изаберите било који врх као почетну тачку преласка и гурните тај врх у стек.
  3. Након тога, гурните непосећени врх (поред темена на врху гомиле) на врх гомиле.
  4. Сада поновите кораке 3 и 4 све док не остане ниједан врх који треба посетити са врха на врху гомиле.
  5. Ако нема остављеног врха, вратите се и избаците врх из стека.
  6. Поновите кораке 2, 3 и 4 док се гомила не испразни.

Примене ДФС алгоритма

Примене коришћења ДФС алгоритма су дате на следећи начин -

  • ДФС алгоритам се може користити за имплементацију тополошког сортирања.
  • Може се користити за проналажење путања између два врха.
  • Такође се може користити за откривање циклуса у графикону.
  • ДФС алгоритам се такође користи за загонетке са једним решењем.
  • ДФС се користи за одређивање да ли је граф бипартитан или не.

Алгоритам

Корак 1: СЕТ СТАТУС = 1 (спремно стање) за сваки чвор у Г

Корак 2: Гурните почетни чвор А на стек и поставите његов СТАТУС = 2 (стање чекања)

Корак 3: Поновите кораке 4 и 5 док се СТАЦК не испразни

4. корак: Отворите горњи чвор Н. Обрадите га и поставите његов СТАТУС = 3 (обрађено стање)

5. корак: Гурните на стек све суседе Н који су у стању приправности (чији СТАТУС = 1) и поставите њихов СТАТУС = 2 (стање чекања)

[КРАЈ ПЕТЉЕ]

Корак 6: ИЗЛАЗ

Псеудоцоде

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

Пример ДФС алгоритма

Сада, хајде да разумемо рад ДФС алгоритма користећи пример. У доле наведеном примеру постоји усмерени граф који има 7 врхова.

ДФС алгоритам

Сада, почнимо да испитујемо граф почевши од чвора Х.

Корак 1 - Прво гурните Х на гомилу.

 STACK: H 

Корак 2 - ИСКУПИТЕ горњи елемент из гомиле, тј. Х, и одштампајте га. Сада гурните све суседе Х на стек који су у стању приправности.

 Print: H]STACK: A 

Корак 3 - ИСКУПИТЕ горњи елемент из гомиле, тј. А, и одштампајте га. Сада гурните све суседе А на стек који су у стању приправности.

 Print: A STACK: B, D 

Корак 4 - ИСКУПИТЕ горњи елемент из гомиле, тј. Д, и одштампајте га. Сада гурните све суседе Д на стек који су у стању приправности.

стринг јава низ
 Print: D STACK: B, F 

Корак 5 - ИСКУПИТЕ горњи елемент из гомиле, тј. Ф, и одштампајте га. Сада гурните све суседе Ф на стек који су у стању приправности.

 Print: F STACK: B 

Корак 6 - ИСКУПИТЕ горњи елемент из гомиле, тј. Б, и одштампајте га. Сада, ПУСХ све суседе Б на стек који су у стању приправности.

 Print: B STACK: C 

Корак 7 - ИСКУПИТЕ горњи елемент из гомиле, тј. Ц, и одштампајте га. Сада гурните све суседе Ц на стек који су у стању приправности.

 Print: C STACK: E, G 

Корак 8 - ИСКУПИТЕ горњи елемент из стека, тј. Г и ПУСХ све суседе Г на стек који су у стању приправности.

 Print: G STACK: E 

Корак 9 - ИСКУПИТЕ горњи елемент из стека, тј. Е и ПУСХ све суседе Е на стек који су у стању приправности.

 Print: E STACK: 

Сада су сви чворови графа пређени, а стек је празан.

Сложеност алгоритма претраге у дубину

Временска сложеност ДФС алгоритма је О(В+Е) , где је В број темена а Е број ивица у графу.

Просторна сложеност ДФС алгоритма је О(В).

Имплементација ДФС алгоритма

Сада, да видимо имплементацију ДФС алгоритма у Јави.

У овом примеру, графикон који користимо да демонстрирамо код је дат на следећи начин -

ДФС алгоритам
 /*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;>