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']
};
λλΉ μ°μ νμ(Breadth-first search, BFS)μ λ§Ήλͺ©μ νμλ°©λ²μ νλλ‘ μμ μ μ μ λ°©λ¬Έν ν
μμ μ μ μ μΈμ ν λͺ¨λ μ μ λ€μ μ°μ λ°©λ¬Ένλ λ°©λ²μ΄λ€. λ μ΄μ λ°©λ¬Ένμ§ μμ μ μ μ΄ μμ λκΉμ§
λ°©λ¬Ένμ§ μμ λͺ¨λ μ μ λ€μ λν΄μλ λλΉ μ°μ κ²μμ μ μ©νλ€. OPEN Listλ νλ₯Ό μ¬μ©ν΄μΌλ§
λ 벨 μμλλ‘ μ κ·Όμ΄ κ°λ₯νλ€.
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"]
κΉμ΄ μ°μ νμdepth-first search, DFS)μ λ§Ήλͺ©μ νμλ°©λ²μ νλλ‘ νμνΈλ¦¬μ μ΅κ·Όμ 첨κ°λ λ
Έλλ₯Ό μ ννκ³ ,
μ΄ λ
Έλμ μ μ© κ°λ₯ν λμμ μ€ νλλ₯Ό μ μ©νμ¬ νΈλ¦¬μ λ€μ μμ€(level)μ ν κ°μ μμλ
Έλλ₯Ό 첨κ°νλ©°,
첨κ°λ μμ λ
Έλκ° λͺ©νλ
ΈλμΌ λκΉμ§ μμ μμ λ
Έλμ μ²¨κ° κ³Όμ μ λ°λ³΅ν΄ κ°λ λ°©μμ΄λ€
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)