그래프는 노드(Node, 또는 정점 -vertex- 이라고도 부릅니다), 그리고 노드와 노드를 연결하는 간선(edge)으로 구성됩니다. 그래프는 무방향(undirected)일 수 있습니다. 이는 간선에 의해 연결된 2개의 노드가 대칭일 수 있다는 의미입니다. 한편 방향성(directed)을 가질 수도 있는데, 이는 비대칭 관계를 의미합니다. 이번 스프린트에서는 무방향 그래프를 구현합니다.
노드(node) : 정점(vertice)라고도 불리며, 일반적으로 노드에는 데이터가 저장됨
간선(edge): 링크, arcs라고도 불리며, 노드간의 관계를 나타냄
인접 정점(adjacent vertex) : 간선에 의해 연결된 정점. 위 그림에서 노드A와 B는 인접 정점이라고 할 수 있다
단순 경로(simple-path): 경로 중 반복되는 정점이 없는것, 같은 간선을 자나가지 않는 경로
차수(degree): 무방향 그래프에서 하나의 정점에 인접한 정점의 수. 위 그래프에서 A의 차수는 3이다.
진출차수(out-degree)/진입차수(in-degree) : 방향그래프에서 사용되는 용어
진출 차수 는 한 노드에서 외부로 향하는 간선의 수,
진입차수 는 외부 노드에서 들어오는 간선의 수
그래프의 표현 방식은 인접 행렬과 인접 리스트 두가지 방식으로 나눌 수 있다.
/* Undirected Graph */
class Graph {
constructor() {
/*
* ex)
* nodes = {
* 0: [ 1, 2 ],
* 1: [ 0 ],
* 2: [ 0 ]
* }
*/
this.nodes = {};
}
addNode(node) {
//addNode(node) - 그래프에 노드를 추가합니다.
this.nodes[node] = this.nodes[node] || [];
}
contains(node) {
//contains(node) - 그래프에 해당 노드가 존재하는지 여부를 반환합니다.
if(this.nodes[node]) {
return true;
}
return false;
}
removeNode(node) {
//removeNode(node) - 그래프에서 노드를 삭제합니다.
if(!this.nodes[node]) {
return undefined;
} else {
if(this.nodes[node].length !== 0) {
for(let edge of this.nodes[node]) {
this.removeEdge(node, edge);
}
}
delete this.nodes[node];
return this.nodes;
}
}
hasEdge(fromNode, toNode) {
//hasEdge(fromNode, toNode) - fromNode와 toNode 사이의 간선 존재 여부를 반환합니다.
for(let i of this.nodes[fromNode]) {
if(i === toNode) {
return true;
}
}
return false;
}
addEdge(fromNode, toNode) {
//addEdge(fromNode, toNode) - fromNode와 toNode 사이의 간선을 추가합니다.
this.nodes[fromNode].push(toNode);
this.nodes[toNode].push(fromNode);
}
removeEdge(fromNode, toNode) {
//removeEdge(fromNode, toNode) - fromNode와 toNode 사이의 간선을 삭제합니다.
delete this.nodes[fromNode].pop(toNode);
delete this.nodes[toNode].pop(fromNode);
}
}
module.exports = Graph;