(노드+연결선)
인접 리스트
,인접 행렬
을 살펴보고 인접 리스트
를 사용하여 그래프를 만들어보자무방향 그래프(Undirected graph)
이고, 순서가 있는 경우에는 방향 그래프(Directed graph)
라고 한다.Vertex(정점)
: 노드, 그림의 동그라미들Edge(간선)
: 노드 사이의 연결,화살표무방향 그래프
는 간선에 방향이 없고 양방향 연결이다.(위 그림)
방향 그래프
는 간선에 정해진 방향(화살표)가 있다.
가중 그래프
는 간선에 값이 부여된 그래프다.
비가중 그래프
-> 위 그림들
인접 행렬
은 2차원 구조로 보통 중첩 행렬로 표현행,열
에 한줄씩 추가된다.해시 테이블
을 이용한 인접 리스트
로 저장할 수 있다. 만약 아래 예시에서 C노드와 다른 노드들 간 간선을 확인하려면, 인접리스트
의 ‘C’ 키에 있는 ['B', 'D'] value를 통해 C 노드는 B노드 및 D노드와 연결되어 있다.인접 행렬
은 2차원 구조이기 때문에 O(v^2)의 공간복잡도를 가진다.인접 리스트
는 실제 연결만 저장한다.인접 리스트
를 사용하는게 좋다class Graph{
constructor(){
this.List = {};
}
}
addVertex(key){
if(!this.List[key]) this.List[key] = [];
}
addEdge(vertex1,vertex2){
this.List[vertex1].push(vertex2);
this.List[vertex2].push(vertex1);
}
removeEdge(vertex1,vertex2){
this.List[vertex1] = this.List[vertex1].filter((v) => v !== vertex2)
this.List[vertex2] = this.List[vertex2].filter((v) => v !== vertex1)
}
removeVertex(vertex){
this.List[vertex].forEach((v)=> this.removeEdge(vertex,v));
delete this.List[vertex]; //해당 키값을 아예 삭제
}
const g = new Graph();
g.addVertex("A");
g.addVertex("B");
g.addVertex("C");
g.addVertex("D");
g.addVertex("E");
g.addVertex("F");
g.addEdge("A", "B");
g.addEdge("A", "C");
g.addEdge("B", "D");
g.addEdge("C", "E");
g.addEdge("D", "E");
g.addEdge("D", "F");
g.addEdge("E", "F");
// A
// / \
// B C
// | |
// D --- E
// \ /
// F