У овом чланку ћемо разговарати о ДФС алгоритму у структури података. То је рекурзивни алгоритам за претраживање свих врхова структуре података дрвета или графа. Алгоритам претраге у дубину (ДФС) почиње са почетним чвором графа Г и иде дубље док не пронађемо циљни чвор или чвор без деце.
Због рекурзивне природе, структура података стека се може користити за имплементацију ДФС алгоритма. Процес имплементације ДФС-а је сличан БФС алгоритму.
замените боју у гимп-у
Процес корак по корак за имплементацију ДФС преласка је дат на следећи начин -
- Прво направите стек са укупним бројем врхова у графу.
- Сада изаберите било који врх као почетну тачку преласка и гурните тај врх у стек.
- Након тога, гурните непосећени врх (поред темена на врху гомиле) на врх гомиле.
- Сада поновите кораке 3 и 4 све док не остане ниједан врх који треба посетити са врха на врху гомиле.
- Ако нема остављеног врха, вратите се и избаците врх из стека.
- Поновите кораке 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) /*'V' 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's all about the article. Hope it will be helpful and informative to you.</p> <hr></v;>