깊이 우선 탐색(DFS)
- 루트노드에서 시작하여 다음 분기로 넘어가기전 해당 분기를 완벽하게 탐색하는 방법.
- 해당 분기를 모두 탐색한 후, 이 분기는 이미 탐색함을 기록하고 다음분기로 넘어감
- 백트래킹으로 이용한다.
- 스택 또는 재귀함수로 구현한다.
-> 모든 노드를 방문하고자 할때 주로 사용함
-> BFS에 비해 상대적으로 검색속도가 느림
-> 구현은 DFS가 더 간단하다.
너비 우선 탐색(BFS)
- 루트노드 혹은 임의노드부터 시작하여 인접한 가까운 노드부터 탐색하고 마지막으로 가장 먼 노드를 탐색하는 방법
- 주로 노드사이의 최단거리를 계산할때 사용한다.
- 큐로 구현한다.
ex) 지구상의 모든 관계를 그래프로 표현했을때, 철수와 영희와의 관계를 찾는다면
깊이 우선탐색: 모든 관계를 탐색하며 찾는다.
너비 우선탐색: 철수의 가까운 관계부터 찾는다.
DFS와 BFS의 시간복잡도
모든 노드를 탐색한다는점에서 DFS와 BFS의 시간복잡도는 동일하다.
구현할때의 이용한 자료구조에 따라서 전체 시간복잡도는 다르게 될 수 있다.
N은 노드, E는 걸리는 시간 이라 한다면
인접리스트: O(N+E)
인접행렬: O(N^2)
DFS와 BFS의 활용유형
1. 그래프의 모든 접점을 방문해야 할 때
- 이는 둘다 비슷한 성능을 내므로 알맞은 자료구조로 시간을 줄여서 구현한다.
2. 경로의 특징을 저장해야할 때
- 백트래킹과 같은 노드를 탐색했을때, 조건에 맞지않아서 이를 기록하고 더이상 노드탐색을 하지않을때나 탐색하는데 있어서 여러가지 특징이나 조건을 저장하고 탐색할때 DFS를 이용한다.
3. 최단거리를 구할 때
- 미로찾기와 같은 최단거리를 구할 때 BFS를 이용하면 좋다.
- DFS를 이용한다면 모든 노드를 방문하게 될 수 있기때문이다.
DFS 구현 Swift
// 소스코드 출처: 개발자 소들이 https://babbab2.tistory.com/107
func dfs(graph: [String: [String]], start: String) -> [String]{
// 이미 방문한 배열
var visitedQueue = [String]()
// 방문해야하는 배열
var needVisitQueue = [start]
// DFS
// 분기에 가장 깊숙한 곳까지 탐색하기 때문에 removeLast()
while !needVisitQueue.isEmpty {
let node = needVisitQueue.removeLast()
if visitedQueue.contains(node) { continue }
visitedQueue.append(node)
needVisitQueue += graph[node] ?? []
}
return visitedQueue
}
BFS 구현 Swift
// 소스코드 출처: 개발자 소들이 https://babbab2.tistory.com/106
func bfs(graph: [String: [String]], start: String) -> [String]{
// 이미 방문한 배열
var visitedQueue = [String]()
// 방문해야하는 배열
var needVisitQueue = [start]
// BFS
// 분기에 가장 인접한 곳 부터 탐색하기 때문에 removeFirst()
while !needVisitQueue.isEmpty {
let node = needVisitQueue.removeFirst()
if visitedQueue.contains(node) { continue }
visitedQueue.append(node)
needVisitQueue += graph[node] ?? []
}
return visitedQueue
}
Reference:
https://velog.io/@lucky-korma/DFS-BFS%EC%9D%98-%EC%84%A4%EB%AA%85-%EC%B0%A8%EC%9D%B4%EC%A0%90
DFS, BFS의 설명, 차이점
그래프란, 정점(node)과 그 정점을 연결하는 간선(edge)으로 이루어진 자료구조의 일종을 말하며,그래프를 탐색한다는 것은 하나의 정점으로부터 시작하여 차례대로 모든 정점들을 한 번씩 방문하
velog.io
[알고리즘] 깊이 우선 탐색(DFS) 과 너비 우선 탐색(BFS)
[알고리즘] 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS) 그래프를 탐색하는 방법에는 크게 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS)이 있습니다. 📌여기서 그래프란, 정점(node)과 그 정점을 연결하
devuna.tistory.com
https://babbab2.tistory.com/107
Swift) 깊이 우선 탐색(DFS) 구현 해보기
안녕하세요 :) 소들입니다!!! 이번 포스팅에선 깊이 우선 탐색(DFS)에 대해 알아보려고 해요!!!! 깊이 우선 탐색이란, 너비 우선 탐색(BFS)과 마찬가지로 그래프를 탐색하는 방법 중 하나인데, 그래
babbab2.tistory.com
'코딩테스트 > 알고리즘' 카테고리의 다른 글
투포인터 알고리즘 Swift (0) | 2024.04.14 |
---|---|
순열과 조합 Swift (0) | 2024.04.10 |
이분탐색 Swift (1) | 2024.04.06 |
동적계획법 DP(Dynamic Programming) (0) | 2023.04.20 |
최대공약수와 최소공배수 Swift (0) | 2023.04.07 |