FSO


BFS란?

너비 우선 검색, 너비 우선 검색

가장 가까운 노드를 찾는 알고리즘

행동 과정

하나. 검색의 시작 노드를 대기열에 추가하다 방문처리하다

2. 노드 대기열에서 빼기 이 노드 이웃 노드 사이 방문하지 않은 모든 노드를 대기열에 추가 방문처리하다

3. 2단계 더 이상 할 수 없을 때까지 반복하다.

* 방문처리: 한 번 대기하고 처리된 노드가 다시 삽입되지 않는지 확인하는 것을 의미합니다. 방문 처리를 통해 각 노드를 한 번만 처리할 수 있습니다.

자세히 살펴보기

이웃 노드 중 방문하지 않은 노드가 여러 개인 경우 번호가 낮은 순서처리하다


* 방문한 노드~이다 회색대기열에서 꺼내십시오. 노드 처리 중~이다 하늘색로 표현

하나. 시작 노드 ‘1’대기열에 추가되고 방문한 것으로 처리됩니다.


2. 대기 중 노드 ‘1’ 아웃소싱 및 무인 이웃 노드 ‘2’. ‘3’, ‘8’ 모두 대기 및 방문 편집하다


3. 대기 중 노드 ‘2’방문하지 않은 이웃 노드 ‘7’두번째 대기열에 추가 및 방문 편집하다


4. 대기 중 노드 ‘3’이사하고 한번도 방문하지 않은 이웃 노드 ‘4’ 및 ‘5’모든 목록에 추가해하다 방문처리하다


5. 대기 중 노드 ‘8’이사하고 한번도 방문하지 않은 인접 노드가 없으므로 무시하다.


6. 대기 중 노드 ‘7’이사하고 한번도 방문하지 않은 이웃 노드 ‘6’두번째 목록에 추가해하다 방문처리하다


7. 방문하지 않은 나머지 노드 인접 노드 없음.

따라서 모든 노드를 순서대로 제거하면 다음과 같이 됩니다.


노드 검색 순서

1-2-3-8-7-4-5-6

특성

하나. 대기열 데이터 구조기반 -> 구현이 간단합니다.

2. 대기열 클래스사용하기 좋습니다

삼. 데이터 개수가 N일 때 O(N)의 시간 복잡도가지다

4. 일반적인 경우 실제 실행 시간은 DFS보다 짧습니다.

구현 코드

public class BFS {
    public static boolean() visited = new boolean(9);
    public static ArrayList<ArrayList<Integer>> graph;

    // BFS 함수 정의
    public static void bfs(int start) {
        Queue<Integer> q = new LinkedList<>();
        q.offer(start);

        // 현재 노드 방문 처리
        visited(start) = true;

        while (!q.isEmpty()) {
            // 큐의 맨 앞 원소를 꺼낸 후 출력
            int x = q.poll();
            System.out.print(x + " ");

            // 해당 원소와 연결된, 아직 방문하지 않은 원소들을 모두 큐에 삽입
            for (int i = 0; i < graph.get(x).size(); i++) {
                int y = graph.get(x).get(i);
                if (!visited(y)) {
                    q.offer(y);
                    visited(y) = true;
                }
            }
        }
    }

    public static void main(String() args) {
        // 그래프 정의
        graph = new ArrayList<>() {{
            add(new ArrayList<>(List.of()));
            add(new ArrayList<>(List.of(2, 3, 8)));
            add(new ArrayList<>(List.of(1, 7)));
            add(new ArrayList<>(List.of(1, 4, 5)));
            add(new ArrayList<>(List.of(3, 5)));
            add(new ArrayList<>(List.of(3, 4)));
            add(new ArrayList<>(List.of(7)));
            add(new ArrayList<>(List.of(2, 6, 8)));
            add(new ArrayList<>(List.of(1, 7)));
        }};

        // 정의된 BFS 함수 호출
        bfs(1);
    }

출력 결과

1 2 3 8 7 4 5 6

참조

코딩테스트입니다 – 나동빈