[그래프] 너비 우선 탐색 BFS

2024. 9. 13. 21:13알고리즘 & 자료구조/그래프

BFS (너비 우선 탐색)특징

  • 계층적 탐색: BFS는 시작 노드에서 가까운 노드부터 탐색을 시작하여 점차 거리가 먼 노드들을 탐색합니다. 노드를 "너비"를 기준으로 탐색합니다.
  • 큐(Queue) 사용: BFS는 큐를 이용하여 노드를 저장하고 순차적으로 처리합니다. 큐는 FIFO(First In, First Out) 방식으로, 먼저 삽입된 노드를 먼저 처리합니다.
  • 최단 경로 보장: 무가중치 그래프에서는 BFS가 시작 노드로부터 모든 다른 노드까지의 최단 경로를 보장합니다.
  • 방문 여부 체크: BFS는 동일 노드를 여러 번 방문하지 않도록 방문 여부를 체크합니다. 이를 위해 방문 여부를 기록하는 배열이나 집합(Set)을 사용합니다.

장단점

  • 장점:
    • 최단 경로 탐색에 유용합니다.
    • 모든 노드를 확실히 탐색할 수 있습니다.
  • 단점:
    • 큐와 방문 목록을 관리해야 하므로, 노드 수가 많을 경우 공간 복잡도가 증가할 수 있습니다.

시간 및 공간 복잡도

  • 시간 복잡도: O(V+E)O(V + E), 여기서 VV는 정점의 수, EE는 간선의 수입니다. 각 노드를 한 번씩 방문하고, 각 간선을 한 번씩 처리하기 때문입니다.
  • 공간 복잡도: O(V)O(V), 큐와 방문 여부를 기록하는 데 필요한 공간 때문입니다.
  • BFS는 그래프나 트리에서 노드를 탐색하는 알고리즘으로, 시작 노드에서부터 가까운 노드부터 차례대로 탐색합니다. 현재 노드의 인접 노드를 먼저 탐색한 후, 그 다음 단계에서 인접 노드의 이웃들을 탐색하는 방식으로 진행됩니다.

의사 코드 + Java 코드

BFS(graph, startNode):
    1. 큐(Queue) 생성
    2. 방문 여부를 기록할 리스트 또는 배열 생성
    3. 시작 노드를 큐에 추가하고 방문 처리
    4. 큐가 빌 때까지 다음을 반복:
        a. 큐에서 노드를 하나 꺼냄
        b. 해당 노드의 모든 인접 노드를 확인
        c. 방문하지 않은 인접 노드를 큐에 추가하고 방문 처리

// BFS 구현
public void bfs(int startNode) {
    // 방문한 노드를 기록하기 위한 집합
    Set<Integer> visited = new HashSet<>();

    // BFS에 사용할 큐
    Queue<Integer> queue = new LinkedList<>();

    // 시작 노드를 큐에 넣고 방문 표시
    queue.add(startNode);
    visited.add(startNode);

    while (!queue.isEmpty()) {
        // 큐에서 노드를 꺼내서 처리
        int currentNode = queue.poll();
        System.out.println("Visited node: " + currentNode);

        // 현재 노드의 이웃들을 확인
        List<Integer> neighbors = graph.getOrDefault(currentNode, new ArrayList<>());
        for (int neighbor : neighbors) {
            if (!visited.contains(neighbor)) {
                queue.add(neighbor);
                visited.add(neighbor);
            }
        }
    }
}

 

  • BFS의 활용 예시
    • 최단 경로 탐색: 미로 찾기, 네트워크에서 최소 홉 수 찾기 등 무가중치 그래프에서 최단 경로를 찾는 데 유용합니다.
    • 그래프 연결성 검사: 그래프가 모든 노드와 연결되어 있는지 확인하는 데 사용됩니다.
    • 레벨 순회: 트리에서 특정 레벨에 있는 모든 노드를 탐색할 때 사용됩니다.

 

'알고리즘 & 자료구조 > 그래프' 카테고리의 다른 글

[그래프] 깊이 우선 탐색 DFS  (0) 2024.09.14