DFS(Depth-First Search
) κΉμ΄ μ°μ νμ, BFS(Breadth-First Search
) λλΉ μ°μ νμ λͺ¨λ graph
λ₯Ό νμνλ λ°©λ²μ΄λ€. μκ³ λ¦¬μ¦μμ graph
λ, node
μ κ·Έ node
λ₯Ό μ°κ²°νλ edge
λ‘ μ΄λ£¨μ΄μ§ μλ£κ΅¬μ‘°λ₯Ό λ§νλ©°, μ΄λ₯Ό νμνλ€λ κ²μ νλμ node
μμ μμν΄ edge
λ‘ μ°κ²°λ μ°¨λ‘λλ‘ λͺ¨λ node
λ₯Ό νλ²μ© λ°©λ¬Ένλ κ²μ λ§νλ€.

Depth-First Search (DFS: κΉμ΄ μ°μ νμ)

DFS
λ νμ graph
μ μ΅μ΄μ node
λ₯Ό νμ₯νμ¬ λͺ©ν μνκ° λ°κ²¬λ λκΉμ§ λ κΉμ΄ νμ₯νλ λ§Ήλͺ©μ νμ (Blind search)μ΄λ€. λ§μΌ μμnode
λ₯Ό κ°κ³ μμ§ μμ node
μ μ΄λ₯΄λ©΄ back-tracking
νμ¬ λ€μ node
μμ μΆλ°νλ€. μ¦, μμμ λΆν° λ€μ λΆκΈ°λ‘ λμ΄κ°κΈ° μ μ ν΄λΉ λΆκΈ°λ₯Ό μλ²½νκ² νμνκ³ λμ΄κ°λ λ°©λ²μ΄λ€.
DFS
λ λ€μκ³Ό κ°μ λͺκ°μ§ νΉμ§μ κ°μ§λ€
- μκΈ° μμ μ νΈμΆνλ μν μκ³ λ¦¬μ¦ ννλ₯Ό κ°μ§λ€
- μ μμνλ₯Ό ν¬ν¨ν λ€λ₯Έ ννμ νΈλ¦¬ μνλ λͺ¨λ
DFS
μ ν μ’ λ₯μ΄λ€ - λ¨μ κ²μ μλλ λλΉ μ°μ νμ(
BFS
) λ³΄λ€ λλ¦Ό - ꡬν μ
graph
νμμ κ²½μ° μ΄λ€node
λ₯Ό λ°©λ¬Ένμλμ§ μ¬λΆλ₯Ό λ°λμ κ²μ¬ν΄μΌ νλ€ (κ·Έλ μ§ μμ κ²½μ° λ¬΄ν루ν μ£Όμ!) Recursion
λλStack
μ μ΄μ©νμ¬ κ΅¬ν κ°λ₯νλ€
DFSμ μκ° λ³΅μ‘λ
- μΈμ 리μ€νΈλ‘ ννλ κ·Έλν:
O(N+E)
- μΈμ νλ ¬λ‘ ννλ κ·Έλν:
O(N^2)
- κ·Έλν λ΄μ μ μ μ«μμ κ°μ (
edge
)λ§μ κ°μ§λ ν¬μ κ·Έλν(Sparse Graph) μ κ²½μ° μΈμ νλ ¬λ³΄λ€ μΈμ 리μ€νΈλ₯Ό μ¬μ©νλ κ²μ΄ μ 리νλ€.
Breadth-First Search (BFS: λλΉ μ°μ νμ)

BFS
λ λλΉ μ°μ νμμ΄λΌκ³ λ λΆλ¦¬λ©° graph
μμ μμ node
μ μΈμ ν node
λΆν° νμνλ μκ³ λ¦¬μ¦μ΄λ€. μμ node
λ‘λΆν° κ°κΉμ΄ node
λ¨Όμ λ°©λ¬Ένκ³ λ©λ¦¬ λ¨μ΄μ Έ μλ node
λ₯Ό λμ€μ λ°©λ¬Ένλ λ°©μμΌλ‘ μνν¨μΌλ‘μ¨ λ
Έλλ₯Ό λκ²(wide) νμνλ€. μ£Όλ‘ λ node
μ¬μ΄μ μ΅λ¨ κ²½λ‘ νΉμ μμμ κ²½λ‘λ₯Ό μ°Ύκ³ μΆμ λ μ΄ λ°©λ²μ μ¬μ©νλ€.
BFS
λ λ€μμ νΉμ§μ κ°μ§λ€
-
μ§κ΄μ μ΄μ§ μλ€λ λ¨μ μ΄ μλ€
-
μ¬κ·μ μΌλ‘ λμνμ§ μλλ€
-
ꡬνμ μ΄λ€
node
λ₯Ό λ°©λ¬Ένμλμ§ μ¬λΆλ₯Ό λ°λμ κ²μ¬ν΄μΌ νλ€ -
Queue
λ₯Ό μ΄μ©νμ¬ κ΅¬νκ°λ₯νλ€ -
Prime algorithm(νλ¦Ό μκ³ λ¦¬μ¦), Dijkstra algorithm(λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦)κ³Ό μ μ¬νλ€
BFSμ μκ° λ³΅μ‘λ
- μΈμ 리μ€νΈλ‘ ννλ κ·Έλν:
O(N+E)
- μΈμ νλ ¬λ‘ ννλ κ·Έλν:
O(N^2)
- κΉμ΄ μ°μ νμ(
DFS
)κ³Ό λ§μ°¬κ°μ§λ‘ κ·Έλν λ΄μ μ μ μ«μμ κ°μ (edge
)λ§μ κ°μ§λ ν¬μ κ·Έλν(Sparse Graph) μ κ²½μ° μΈμ νλ ¬λ³΄λ€ μΈμ 리μ€νΈλ₯Ό μ¬μ©νλ κ²μ΄ μ 리νλ€
ꡬνμμ
const graph = {
A: ["B", "C"], B: ["A", "D"], C: ["A", "E"],
D: ["B", "F"], E: ["C", "G"], F: ["D", "H", "I"],
G: ["E", "J", "K"], H: ["F", "L"], I: ["F", "M"],
J: ["G", "N"], K: ["G", "O"], L: ["H"],
M: ["I", "P"], N: ["J"], O: ["K"],
P: ["M"]
};

const dfs = (graph, start) => {
const checked = []; // νμ μλ£ λ°μ΄ν°
const willCheck = []; // νμ μμ λ°μ΄ν°
willCheck.push(start);
while(willCheck.length!==0){
const node = willCheck.pop(); // μ€ν(Last In First Out)
if(!checked.includes(node)){
checked.push(node);
//reverse() μ κ±° μ κ·Έλ¦Όμ 4,3,2,1 μμλ‘ νμ
willCheck.push(...graph[node].reverse());
}
}
return checked;
}
console.log(dfs(graph, "A"));
// ['A', 'B', 'D', 'F', 'H', 'L', 'I', 'M', 'P', 'C', 'E', 'G', 'J', 'N', 'K', 'O']

const bfs = (graph, start) => {
const checked = [];
const willCheck = [];
willCheck.push(start);
while(willCheck.length!==0){
const node = willCheck.shift(); // ν(First In First Out)
if(!checked.includes(node)){
checked.push(node);
willCheck.push(...graph[node]);
}
}
return checked;
}
console.log(bfs(graph, "A"));
// ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P']
- https://ko.wikipedia.org/wiki/%EB%84%88%EB%B9%84_%EC%9A%B0%EC%84%A0_%ED%83%90%EC%83%89
- https://ko.wikipedia.org/wiki/%EA%B9%8A%EC%9D%B4_%EC%9A%B0%EC%84%A0_%ED%83%90%EC%83%89