관리 메뉴

개발 여행자, 현

[JavaScript] 너비우선탐색(BFS) 깊이우선탐색(DFS)이란? 본문

알고리즘

[JavaScript] 너비우선탐색(BFS) 깊이우선탐색(DFS)이란?

예스현 2022. 11. 6. 12:39

 너비우선탐색(BFS) 깊이우선탐색(DFS)


DFS(깊이우선탐색)이란?

A - B - D - E - F - C - G - H - I - J

 

- 정점의 자식인 노드들을 먼저 탐색하는 방식

- 큐와 스택 1개씩 이용

const graph = {
  A: ["B", "C"],
  B: ["A", "D"],
  C: ["A", "G", "H", "I"],
  D: ["B", "E", "F"],
  E: ["D"],
  F: ["D"],
  G: ["C"],
  H: ["C"],
  I: ["C", "J"],
  J: ["I"]
};

const bfs = (graph, startNode) => {
  let visited = []; // 탐색을 마친 노드들
  let needVisit = []; // 탐색해야할 노드들

  needVisit.push(startNode); // 노드 탐색 시작

  while (needVisit.length !== 0) { // 탐색해야할 노드가 남아있다면
    const node = needVisit.shift(); // queue이기 때문에 선입선출, shift()를 사용한다.
    if (!visited.includes(node)) { // 해당 노드가 탐색된 적 없다면
      visited.push(node); 
      needVisit = [...needVisit, ...graph[node]];
    }
  }
  return visited;
};

console.log(bfs(graph, "A"));
// ["A", "B", "C", "D", "G", "H", "I", "E", "F", "J"]

 

BFS(너비우선탐색)이란?

A - B - C - D - G - H - I - E - F - J

 

 

- 정점과 같은 레벨에 있는 노드들을 먼저 탐색하는 방식이다.

- 큐 2개 이용
- 큐
에 각 node의 정보를 기록해야 하기 때문에 메모리를 잡아먹음

- 찾고자 하는 target node가 root node와 가까이 있다고 예상될 경우 BFS를 사용한다.

  • 지도 어플에서 특정 위치까지의 최단거리 안내, 혹은 소셜미디어에서 친구 추천 등에 이용된다.
const graph = {
  A: ["B", "C"],
  B: ["A", "D"],
  C: ["A", "G", "H", "I"],
  D: ["B", "E", "F"],
  E: ["D"],
  F: ["D"],
  G: ["C"],
  H: ["C"],
  I: ["C", "J"],
  J: ["I"]
};

const BFS = (graph, startNode) => {
  const visited = []; // 탐색을 마친 노드들
  let needVisit = []; // 탐색해야할 노드들

  needVisit.push(startNode); // 노드 탐색 시작

  while (needVisit.length !== 0) { // 탐색해야할 노드가 남아있다면
    const node = needVisit.shift(); // queue이기 때문에 선입선출, shift()를 사용한다.
    if (!visited.includes(node)) { // 해당 노드가 탐색된 적 없다면
      visited.push(node); 
      needVisit = [...needVisit, ...graph[node]];
    }
  }
  return visited;
};

console.log(BFS(graph, "A"));
// ["A", "B", "C", "D", "G", "H", "I", "E", "F", "J"]

 

 

 

출처: https://www.fun-coding.org/