BFS/DFS

μž„λ™λ―ΌΒ·2022λ…„ 7μ›” 26일
0

μ•Œκ³ λ¦¬μ¦˜

λͺ©λ‘ 보기
7/12

BFS/DFS 예제

BFS 방식: A - B - C - D - G - H - I - E - F - J
DFS 방식: A - B - D - E - F - C - G - H - I - J

좜처: https://saegeullee.github.io/algorithm/bfs-dfs μ—μ„œ 그림만 κ°€μ Έμ™”λ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ κ·Έλž˜ν”„ ν‘œν˜„ν•˜κΈ°

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']
};

BFS

λ„ˆλΉ„ μš°μ„  탐색(Breadth-first search, BFS)은 λ§Ήλͺ©μ  νƒμƒ‰λ°©λ²•μ˜ ν•˜λ‚˜λ‘œ μ‹œμž‘ 정점을 λ°©λ¬Έν•œ ν›„
μ‹œμž‘ 정점에 μΈμ ‘ν•œ λͺ¨λ“  정점듀을 μš°μ„  λ°©λ¬Έν•˜λŠ” 방법이닀. 더 이상 λ°©λ¬Έν•˜μ§€ μ•Šμ€ 정점이 없을 λ•ŒκΉŒμ§€
λ°©λ¬Έν•˜μ§€ μ•Šμ€ λͺ¨λ“  정점듀에 λŒ€ν•΄μ„œλ„ λ„ˆλΉ„ μš°μ„  검색을 μ μš©ν•œλ‹€. OPEN ListλŠ” 큐λ₯Ό μ‚¬μš©ν•΄μ•Όλ§Œ
레벨 μˆœμ„œλŒ€λ‘œ 접근이 κ°€λŠ₯ν•˜λ‹€.

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"]

DFS

깊이 μš°μ„  탐색depth-first search, DFS)은 λ§Ήλͺ©μ  νƒμƒ‰λ°©λ²•μ˜ ν•˜λ‚˜λ‘œ νƒμƒ‰νŠΈλ¦¬μ˜ μ΅œκ·Όμ— μ²¨κ°€λœ λ…Έλ“œλ₯Ό μ„ νƒν•˜κ³ ,
이 λ…Έλ“œμ— 적용 κ°€λŠ₯ν•œ λ™μž‘μž 쀑 ν•˜λ‚˜λ₯Ό μ μš©ν•˜μ—¬ νŠΈλ¦¬μ— λ‹€μŒ μˆ˜μ€€(level)의 ν•œ 개의 μžμ‹λ…Έλ“œλ₯Ό μ²¨κ°€ν•˜λ©°,
μ²¨κ°€λœ μžμ‹ λ…Έλ“œκ°€ λͺ©ν‘œλ…Έλ“œμΌ λ•ŒκΉŒμ§€ μ•žμ˜ μžμ‹ λ…Έλ“œμ˜ 첨가 과정을 λ°˜λ³΅ν•΄ κ°€λŠ” 방식이닀

DFS κ΅¬ν˜„

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 DFS = (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 = [...graph[node], ...needVisit];
    }
  }
  return visited;
};

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

μ‹œκ°„λ³΅μž‘λ„

DFS와 BFSλŠ” λ…Έλ“œ 수 + κ°„μ„  수 만큼의 λ³΅μž‘λ„λ₯Ό μ§€λ‹Œλ‹€. 즉, O(n)

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보