자료구조의 그래프는 마치 거미줄처럼 여러개의 점들이 선으로 이어져 있는 복잡한 네트워크 망과 같은 모습을 보이고있다.
정점: 서울, 대전, 부산
간선: 서울ㅡ대전, 대전ㅡ부산, 부산ㅡ서울
하지만 정점에 시카고를 추가한가도 하면? 자동차로는 한국에서 시카고로 이동할 수 없기 때문에, 어떠한 간선을 추가할 수 없다. Graph에서는 이런 경우를 관계가 없다 라고 표현한다.
위의 간선을 살펴보면, 서울, 대전, 부산이 서로 관계가 있다는 것은 알 수 있지만, 각 도시가 얼마나 떨어져있는지는 알 수 없다. 이렇게 추가적으로 정보를 파악할 수 없는 그래프, 가중치(연결의 강도가 얼마나 되는지) 가 적혀있지 않은 그래프를 비가중치 그래프라고 한다. 간단한 JS Object를 이용하여 비교할 수 있다.
let isConnected = {
seoul: {
busan: true;
daejeon: true;
},
...
}
console.log(isConnected.seoul.daejeon) // true;
[비가중치 그래프로 나타낸 서울, 대전, 부산 그래프]
위 정보만으로는 서울에서 부산까지 갈 수 있다는 사실외에 파악할 수 있는 정보가 없다. 네비게이션이라면, 적어도 각 도시간의 거리가 얼마나 되는지 표시해야한다. 그래서 가중치 그래프로 바꾸고, 각 도시간의 거리를 표시한다면 어떨까? 가중치 그래프는 더 자세한 정보를 담을 수 있기 때문이다.
이렇게 네비게이션은 간선에 거리를 표시한 가중치 그래프가 확장되어서, 수백만개의 정점(주소)과 간선이 추가되어서 네이게이션에서 쓰는 자료구조와 비슷해진다.
서울 > 대전 > 부산 > 서울
로 이동이 가능해서 , 사이클이 존재하는 Graph이다.위에서 인접이라는 용어을 설명했듯이, 두 정점을 바로 이어주는 간선이 있다면, 두 정점은 인접하다고 말한다. 인접 행렬은 서로 다른 정점들이 인접한 상태인지를 표시한 행렬으로 2차원 배열의 형태로 나타난다. 만약 A라는 정점과 B라는 정점이 이어져있다면, 1(true), 아니면 0 (false)로 표시한 일종의 표이다.
만약 가중치 그래프라면 1대신 관계에서 의미있는 값을 저장한다. 위의 네비게이션 예제라면, 거리를 입력하면 좋겠다.
네비게이션 Graph를 인접행렬로 표현하면?
ㅡㅡㅡㅡㅡto A B C
from A ㅡㅡ0 0 1 => 0번째 인덱스
ㅡㅡBㅡㅡ 1 0 1 => 1번째 인덱스
ㅡㅡCㅡㅡ1 0 0 => 2번째 인덱스
인접 리스트는 각 정점이 어떤 정점과 인접한지를 리스트의 형태로 표현한다. 각 정점마다 하나의 리스트를 가지고 있으며, 리스트는 자신과 인접한 다른 정점을 담고 있다. 위 그래프를 인접 리스트로 표현하면
A->C->Null
B->A->C->Null
C->A->Null
Graph, Tree, Stack, Queue 등 모든 자료구조는 구현하는 사람의 편의와 목적에 따라 기능을 추가 및 삭제할 수 있다. Graph를 인접 리스트로 구현할 때, 정점별로 살펴봐야할 우선순위를 고려해 구현할 수 있다. 이때, 리스트에 담겨진 정점들을 우선 순위 별로 정렬할 수 있다. 우선 순위가 없다면, 연결된 정점들을 단순하게 나열한 리스트가 된다.