BFS는 자식 정점을 방문하기 전에 이웃 정점을 방문하며 검색 프로세스에서 큐가 사용됩니다. 다음은 BFS가 작동하는 방식입니다 -
- 인접한 방문하지 않은 정점을 방문합니다. 방문한 것으로 표시하십시오. 그것을 표시하십시오. 대기열에 삽입하세요.
- 인접한 정점이 없으면 대기열에서 첫 번째 정점을 제거합니다.
- 대기열이 비어 있을 때까지 규칙 1과 규칙 2를 반복합니다.
BFS Traversal이 작동하는 방식에 대한 그림을 살펴보겠습니다.
단계 | 순회 | 설명 |
---|---|---|
1 | 대기열을 초기화합니다. | |
2 | S를 방문하여 시작합니다. (시작 노드)를 방문으로 표시합니다. | |
3 | 그러면 S.에서 방문하지 않은 인접 노드가 표시됩니다. 이 예에서는 세 개의 노드가 있지만 알파벳순으로 A,를 선택합니다. 방문한 것으로 표시하고 대기열에 넣습니다. | |
4 | 다음으로 S의 방문하지 않은 인접 노드 B . 방문한 것으로 표시하고 대기열에 넣습니다. | |
5 | 다음으로 S의 방문하지 않은 인접 노드 C . 방문한 것으로 표시하고 대기열에 넣습니다. | |
6 | 지금, S 방문하지 않은 인접 노드가 없습니다. 그래서 우리는 큐에서 빼내고 A를 찾습니다. . | |
7 | 에서 A는 D 입니다. 방문하지 않은 인접 노드로. 방문한 것으로 표시하고 대기열에 넣습니다. |
이 단계에서는 표시되지 않은(방문하지 않은) 노드가 남지 않습니다. 그러나 알고리즘에 따라 방문하지 않은 모든 노드를 얻기 위해 대기열에서 계속 빼냅니다. 대기열이 비워지면 프로그램이 종료됩니다.
이것을 JavaScript로 구현하는 방법을 살펴보겠습니다.
예시
BFS(node) { // Create a Queue and add our initial node in it let q = new Queue(this.nodes.length); let explored = new Set(); q.enqueue(node); // Mark the first node as explored explored. add(node); // We'll continue till our queue gets empty while (!q.isEmpty()) { let t = q.dequeue(); // Log every element that comes out of the Queue console.log(t); // 1. In the edges object, we search for nodes this node is directly connected to. // 2. We filter out the nodes that have already been explored. // 3. Then we mark each unexplored node as explored and add it to the queue. this.edges[t] .filter(n => !explored.has(n)) .forEach(n => { explored.add(n); q.enqueue(n); }); } }
−
를 사용하여 이 기능을 테스트할 수 있습니다.예시
let g = new Graph(); g.addNode("A"); g.addNode("B"); g.addNode("C"); g.addNode("D"); g.addNode("E"); g.addNode("F"); g.addNode("G"); g.addEdge("A", "C"); g.addEdge("A", "B"); g.addEdge("A", "D"); g.addEdge("D", "E"); g.addEdge("E", "F"); g.addEdge("B", "G"); g.BFS("A");
출력
이것은 출력을 줄 것입니다 -
A C B D G E F