그래프는 객체 간의 연결을 시각적으로 표현한 것이다. 그래프는 상하 구조가 없고, 노드(정점, vertex)와 노드를 연결하는 선으로 만들어진 데이터 형식이다. 즉 그래프 자료구조는 루트 노드의 개념, 부모-자식의 관계의 개념이 없다. 서로 평등한 네트워크 모델의 자료구조다.
사례 | 항목 | 연결 |
---|---|---|
웹사이트 | 웹페이지 | 링크 |
지도 | 교차로 | 도로 |
소셜미디어 | 사람 | 친구 맺기 |
전화 | 전화번호 | 전화선 |
class UndirectedGraph {
constructor() {
this.edges = {};
}
// 노드 생성
addVertex(vertex) {
this.edges[vertex] = {};
}
// 간선 연결
addEdges(vertex1, vertex2, weight = 0) {
this.edges[vertex1][vertex2] = weight;
this.edges[vertex2][vertex1] = weight;
}
// 간선 제거
removeEdge(vertex1, vertex2) {
if (this.edges[vertex1] && this.edges[vertex1][vertex2] !== undefined) {
delete this.edges[vertex1][vertex2];
}
if (this.edges[vertex2] && this.edges[vertex2][vertex1] !== undefined) {
delete this.edges[vertex2][vertex1];
}
}
// 노드 제거
// 노드가 제거되면, 연결되어있던 모든 간선도 같이 제거되어야 한다.
removeVertex(vertex) {
for (let currentVertex in this.edges[vertex]) {
this.removeEdge(currentVertex, vertex);
}
delete this.edges[vertex];
}
}
const ugraph = new UndirectedGraph();
ugraph.addVertex(1);
ugraph.addVertex(2);
ugraph.addVertex(3);
ugraph.addEdges(1,2,3);
ugraph.addEdges(1,3,5);
ugraph.removeVertex(1);
console.log(ugraph);
class DirectedGraph {
constructor() {
this.edges = {};
}
// 노드 추가
addVertex(vertex) {
this.edges[vertex] = {};
}
// 노드 연결
// 방향성이 있어야 하기 때문에 출발점/도칙점이 있다.
addEdges(start, end, weight = 0) {
this.edges[start][end] = weight;
}
// edge 객체에서 원점이 되는 정점만 삭제하면 된다.
removeEdge(start, end) {
if (this.edges[start] && this.edges[start][end] !== undefined) {
delete this.edges[start][end];
}
}
removeVertex(vertex) {
for (let currentVertex in this.edges[vertex]) {
this.removeEdge(currentVertex, vertex);
}
delete this.edges[vertex];
}
}
const dgraph = new DirectedGraph();
dgraph.addVertex(1);
dgraph.addVertex(2);
dgraph.addVertex(5);
dgraph.addEdges(1, 5, 5);
dgraph.addEdges(1, 2);
console.log(dgraph);