[알고리즘]-너비 우선 탐색(BFS, Breadth-First Search)
너비 우선 탐색(BFS, Breadth-First Search)
개념
루트 노드(혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법이다. 사용하는 경우 : 두 노드 사이의 최단 경로, 임의의 경로를 찾고 싶을 때
bfs가 dfs보다 복잡하다.
특징
dfs와 같이 노드의 방문 여부를 검사해야한다. 무한루프에 빠질 수 있다. 다익스트라 알고리즘과 유사하다.
구현 방법
- 큐(Queue)
복잡도
DFS(정점의 수:N, 간선의 수:E)의 모든 간선을 조회한다
- 인접리스트로 표현된 그래프 : O(N+E)
- 인접행렬로 표현된 그래프 : O(N^2)
인접리스트
인접리스트는 정점과 간선의 표현을 배열을 통해 나타낸 방법이다. 인접리스트는 필요 공간만 사용 - O(N+E)의 공간복잡도 배열 A의 인덱스 1부터 시작한다. 정점 1과 인접한 다른정점(2, 5)을 ‘A[1] 2 5’ 이렇게 표현한다
인접행렬
인접행렬은 정점과 간선의 표현을 행렬로 나타낸 방법이다. 인접행렬은 그림처럼 인접해 있으면 1로 표현해주고 인접하지 않으면 0으로 표기한다. 인접행렬의 크기는 정점과 간선 갯수 상관없이 O(N^2)의 공간복잡도
인접행렬이 익숙하고 쉬운 편이지만 인접리스트가 공간적으로 효율적이다.
BFS 구현 코드 예시
public static void bfs(int start) {
Queue queue = new LinkedList(); // 큐
queue.offer(start); // 시작점
visited[start] = true; // 방문 표시
System.out.print(start + " ");
while(!queue.isEmpty()) {
int temp = queue.poll();
for(int j = 1; j <= n; j++) {
if(arr[temp][j] == 1 && !visited[j]) { // 이어져있고 방문 안한 곳
queue.offer(j); // 큐에 넣고
visited[j] = true; // 방문 표시
System.out.print(j + " ");
}
}
}
}
요약
- 다익스트라 알고리즘에 BFS가 이용된다.
- DFS는 가까운곳을 먼저 탐색한다.