반응형
> DFS(Depth-First Search, 깊이우선탐색)
- 이진트리의 순회 방법인 inorder, preorder, postorder 순회방법이 DFS의 이진트리 버전에 해당한다.
- lever order는 BFS의 이진트리 순회 버전이다.
깊이우선탐색(DFS)
- 출발점 s에서 시작한다.
- 현재 노드를 visited로 mark하고 인접한 노드들 중 unvisited 노드가 존재하면 그 노드로 간다.
- 2번을 계속 반복한다.
- 노드 8에 도달했을 때처럼 인접한 노드들중 invisited 노드가 존재하지 않는다면, unvisited인 이웃 노드가 존재하지 않는 동안 계속해서 직전 노드로 되돌아간다.
- 다시 2번을 계속 반복한다.
- 시작노드 s로 돌아오고 더 이상 갈 곳이 없으면 종료한다.
- 다음과 같은 흐름으로 깊이우선순회가 이루어 진다.
DFS, 깊이우선탐색
- 이진트리의 순회를 recursion으로 구현한 것처럼, 깊이우선탐색도 resursion으로 구현하는 것이 간명하다.
- 01 : 먼저 방문한 노드 v에 대해서 visited 체크를 하고
- 02 : v와 인접한 노드 x들에 대해서
- 03 : visited[x]가 No 이면,
- 04 : DFS(G, x)를 recursive하게 호출한다.
- 순회를 위해서 직전의 노드로 돌아가는 행동이 recursion으로 간명하게 구현된다.
00 DFS(G, v)
01 visited[v] <- YES;
02 for each node x adjacent to v do
03 if visited[x] = No then
04 DFS(G, x);
- 그래프가 disconnected 그래프 이거나 혹은 방향 그래프라면 DFS에 의해서 모든 노드가 방문되지 않을 수도 있음
- DFS를 반복하여 모든 노드 방문
- 모든 노드의 visited를 NO로 설정하고,
- 해당 노드들을 출발노드로 하여 DFS를 호출, 연결되지 않은 그래프에 해당하는 노드는 visited가 NO로 유지되어서 DFS를 호출하게됨
- 시간복잡도
- 첫번째 for문에 의해서 시간복잡도 O(n)은 피할 수 없고,
- 두번째 for문에 의해서 v노드와 엣지로 이어진 노드가 visited인지를 체크한다. 따라서, 인접리스트로 표현했다면 시간복잡도는 엣지의 갯수에 비례하게 된다. O(m)
- 최종적으로 O(n + m)의 시간복잡도를 갖는다.
- 만약, 인접행렬로 표현했다면 인접노드의 여부를 알기위해서 전체 노드의 수 만큼 검색해야 하므로 O(n)이므로, O(n^2)의 시간복잡도를 갖는다.
DFS-ALL(G)
for each v in V
visited[v] <- NO;
for each v in V
if (visited[v] = no) then
DFS(G, v)
반응형
'알고리즘 > [ 개념 ]' 카테고리의 다른 글
[ 개념 ] 18. 재귀(Recursion)의 기본 개념과 예제2 (0) | 2020.08.28 |
---|---|
[ 개념 ] 17. 재귀(Recursion)의 기본 개념과 예제1 (0) | 2020.08.28 |
[ 개념 ] 15. Graph - BFS(너비우선탐색) (0) | 2020.08.28 |
[ 개념 ] 14.Graph의 개념과 표현 (0) | 2020.08.28 |
[ 개념 ] 13. Hashing에 관하여 - 02 (Hashing in JAVA) (0) | 2020.08.28 |