: 정점(vertex)과 정점 사이를 연결하는 간선(edge)으로 이루어진 비선형 자료구조
그래프는 정점 집합과 간선 집합으로 표현할 수 있다.
: 간선에 방향이 있어, 시작하는 정점과 도착하는 정점이 있다.
: 간선에 방향이 없고, 두 정점이 양 방향으로 서로를 가리킨다.
: 연결의 강도(추가적인 정보)가 얼마나 되는지 적혀져 있는 그래프
: 연결의 강도가 적혀있지 않은 그래프
: 서로 다른 정점들이 인접한 상태인지를 표시한 행렬로 2차원의 배열의 형태로 나타낸다.
const graph = Array.from(Array(4), () => Array(4).fill(0));
// [0, 0, 0, 0]
// [0, 0, 0, 0]
// [0, 0, 0, 0]
// [0, 0, 0, 0]
graph[0][1] = 1; // 0 → 1
graph[0][2] = 1; // 0 → 2
graph[0][3] = 1; // 0 → 3
graph[1][2] = 1; // 1 → 2
graph[3][2] = 1; // 3 → 2
null
과 가중치값을 넣으면 된다.
Array.from
의 사용Array.from(Array(5), () => 1); // 크기가 5인 빈 배열을 1로 채운다. // [1, 1, 1, 1, 1]
: 각 정점이 어떤 정점과 인접하는지를 리스트의 형태로 나타낸다.
각 정점마다 하나의 리스트를 가지고 있으며, 이 리스트는 자신과 인접한 다른 정점을 담고 있다.
const graph = Array.from(Array(4), () => []);
// [ [], [], [], [] ]
graph[0].push(1);
graph[0].push(2);
graph[0].push(3);
graph[1].push(2);
graph[3].push(2);
// [
// [1, 2, 3]
// [2]
// []
// [2]
// []
// ]
JavaScript의 배열은 연결 리스트처럼 무한정 늘어날 수 있기 때문에, 정점의 수만큼 배열을 만들고, 연결할 정점을 배열에 추가하면 된다.
그래프 탐색의 목적은 하나의 정점에서 시작하여 모든 정점에 한 번씩 방문하는 것이다.
그래프의 데이터는 배열처럼 정렬되어 있지 않으므로, 원하는 자료를 찾으려면 하나씩 모두 방문해서 찾아야 한다.
가장 대표적인 그래프 탐색 알고리즘으로는 BFS와 DFS가 있다.
: 너비를 우선적으로 탐색하는 방식 (너비 우선 탐색)
시작 정점에서 가까운 정점부터 탐색하며, 더 이상 탐색할 정점이 없다면 그 다음 떨어져 있는 정점을 순서대로 방문한다.
: 깊이를 우선적으로 탐색하는 방식 (깊이 우선 탐색)
하나의 경로를 끝까지 탐색한 후, 찾는 값이 아니라면 다음 경로로 넘어가 탐색한다.