일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 삼성 코딩테스트
- 다음 지도 api
- 백트레킹
- 평창동계올림픽
- 외판원 순회
- DP
- 그리디 알고리즘
- 언어의 온도
- 인간이 그리는 무늬
- 성화봉송
- 위상정렬
- 캘리그라피
- boj
- 다음 API
- 이분탐색
- 생활코딩
- lower_bound
- BOJ 2098
- BFS
- Segment Tree
- 다이나믹 프로그래밍
- 성화봉송주자
- 안드로이드 스튜디오
- MST
- upper_bound
- yolo
- 비트마스크
- 영어회화 100일의 기적
- 창훈쓰다
- multiset
- Today
- Total
Hoon222y
DFS와 BFS를 비교해보자. 본문
그래프의 탐색은 대표적으로 2가지로 나눌수 있다.
1) DFS(깊이 우선 탐색)
2) BFS(너비 우선 탐색)
두 종류 모두 모든 정점을 1번씩 방문한다는 목표가 있기는 하지만 방문하는 방법에 있어서 차이가 존재한다.
먼저 DFS에 대해 알아보도록 하자.
DFS의 경우에는 스텍을 이용하여 갈 수 있는 만큼 최대한 많이 가고, 갈 수 없으면 이전 정점으로 돌아가는 방식이다.
위에 그림을 통해 이해를 하자면 원래 스텍에 12345 이렇게 들어있다가 5에서 더이상 갈 곳이 없어서 5가 제거되고 6이 들어온 모습을 나타낸 것이다.
그렇게 4 3 2 1순으로 다시 계속 돌아오는 것이다.
보통 DFS의 경우에는 재귀호출을 통하여 구현한다. 코드를 간단하게 작성하자면
1 2 3 4 5 6 7 8 | void dfs(int x) { check[x] = true; printf("%d ",x); for (int i=1; i<=n; i++) { if (a[x][i] == 1 && check[i] == false) { dfs(i); } } } | cs |
이런식으로 쓸 수 있을것이다. dfs에 들어왔다는 것은 일단 그 정점을 방문했다는 것이므로 check[x] = true로 해주고, 그 지점에서 모든 정점을 탐색하면서 연결성이 있고, 방문된적이 없을경우 그 지점에서 다시 DFS를 하는 방식이다.
이번에는 BFS에 대해 알아보도록 하자.
BFS는 보통 큐로 구현을 한다. 큐를 이용하여 지금 위치에서 갈 수 있는 모든 지점을 큐에 넣는 방식으로 넣을때 방문했다고 체크를 해야한다.
위의 그림처럼 먼저 1을 체크하고 1과 연결된 2 5 를 체크한뒤 그 둘을 큐에 넣어주는 방식인것처럼 말이다.
먼저 인접행렬로 배열을 구현 하였을때 의 BFS의 구현코드를 살펴보도록 하자.
1 2 3 4 5 6 7 8 9 10 11 | queue<int> q; check[1] = true; q.push(1); while (!q.empty()) { int x = q.front(); q.pop(); printf("%d ",x); for (int i=1; i<=n; i++) { if (a[x][i] == 1 && check[i] == false) { check[i] = true; q.push(i); } } } | cs |
먼저 1번부터 시작하기 때문에 check[1] = true로 해주고, 큐에 1을 넣는다. 그다음 큐가 빌때까지 가장 먼저 들어온 값이 다른 정점과 연결성이 있고, 그 정점이 방문된적이 없을경우 그 다른 정점을 true로 체크하고 그 배열을 큐에 넣어준다.
이번에 다루어본 방법들은 전부 인접행렬도 그래프가 구현되었을 경우에 대해 살펴보았는데 .... 인접리스트의 경우에는 나도 아직 확실하게 이해가 가지 않아서 .....
다음 시간에 다루어 보도록 하겠다.
'코딩 > 자료구조&알고리즘' 카테고리의 다른 글
이분탐색 (Binary search) (0) | 2016.08.15 |
---|---|
다이나믹 프로그래밍(DP)에 대해 알아보자. (0) | 2016.07.12 |
Graph에 대해 정리해보자. (0) | 2016.07.10 |
Tree에 대해 정리해보자. (0) | 2016.07.10 |
STL -deque (0) | 2016.07.09 |