위 와 같은 그래프를 탐색하는 알고리즘은 크게 DFS(깊이 우선 탐색), BFS(너비 우선 탐색)으로 나뉩 니다.
위 그림과 같은 그래프를 탐색하는 알고리즘을 js로 구현해 보려 합니다.
BFS
- 위 그림과 같이 너비를 우선으로 탐색 => 현재 정점에가 같은 deps에 있는 노드들은 먼저 방문한다는 뜻
- 탐색 중인 현재 노드에서 인접한 노드를 먼저 방문
- 최단 거리를 찾을 때 주로 사용
- 자료구조 queue를 사용하여 구현
DFS
- 방문할 수 있는 최대 deps를 우선적으로 방문
- 루트 노드에서 시작해서 해당 그래프의 최대 deps 까지 탐색, 더이상 탐색할 수 없다면 되돌아가 다시 최대 deps로 방문
- stack 혹은 재귀 함수로 구현 가능
code
const graph = {
A: ["B", "D"],
B: ["A", "E", "F"],
D: ["A", "I", "J"],
E: ["B"],
F: ["B"],
I: ["D"],
J: ["D"],
};
const printBFS = [];
const printDFS = [];
const printRecursiveDFS = [];
// queue 사용
function BFS(graph, start) {
const visited = [];
const queue = [start];
visited.push(start);
while (queue.length > 0) {
const node = queue.shift();
printBFS.push(node);
for (const adjNode of graph[node]) {
if (!visited.includes(adjNode)) {
visited.push(adjNode);
queue.push(adjNode);
}
}
}
}
// stack 사용
function DFS(graph, start) {
const visited = [];
const stack = [start];
while (stack.length > 0) {
const node = stack.pop();
if (!visited.includes(node)) {
visited.push(node);
printDFS.push(node);
for (const adjNode of graph[node]) {
stack.push(adjNode);
}
}
}
}
// 재귀함수 사용
function RecursiveDFS(graph, start, visited) {
visited.push(start);
printRecursiveDFS.push(start);
for (const adjNode of graph[start]) {
if (!visited.includes(adjNode)) {
RecursiveDFS(graph, adjNode, visited);
}
}
};
BFS(graph, "A");
console.log("BFS : ", printBFS.join(" "));
DFS(graph, "A");
console.log("DFS : ", printDFS.join(" "));
RecursiveDFS(graph, "A", []);
console.log('DFS Recursive : ',printRecursiveDFS.join(" "));
출력
'algorithm' 카테고리의 다른 글
[JS] 프로그래머스 점찍기 (0) | 2023.07.30 |
---|---|
최장 공통 부분 수열(LCS) (0) | 2022.02.15 |
퀵 소트(Quick Sort) (0) | 2021.10.06 |
병합정렬 (Merge Sort) (0) | 2021.09.24 |
기수정렬 (Radix sort) (0) | 2021.09.15 |
댓글