Algorithm

[Algorithm] 그래프(Graph)

걸어가는 신사 2022. 2. 12. 17:20

1. 그래프(Graph)란?

정점(Vertex)과 간선(Edge)으로 이루어진 자료 구조

(1) 간선(Edge) 종류

  • 무방향

  • 방향

  • 가중치

(2) 정점의 차수(Degree)

정점 x에 연결된 간선의 수
deg(x) := 정점 x의 차수(degree)

(3) 차수의 성질

모든 정점의 차수의 합 = 간선의 개수의 2배

 

2. 그래프(Graph)를 저장하는 방법

(1) 인접 행렬 (Adjacency Matrix)

  • int[][] adj = int new[V][V]
  • O(V^2) 만큼의 공간 필요
  • A에서 B로 이동 가능? 가중치 얼마? => O(1)
  • 정점 A에서 갈 수 있는 정점들은? => O(V)
  • ex) V=10만, E=50만 => V^2 = 100억 = 10GB 

 

 

(2) 인접 리스트 (Adjacency List)

  • ArrayList <Integer>[] adj
  • O(E) 만큼의 공간 필요
  • A에서 B로 이동 가능? 가중치 얼마? => O(min(deg(A), deg(B)))
  • 정점 A에서 갈 수 있는 정점들은? => O(deg(A))
  • ex) V=10만, E=50만 => 5*10^5 = 500K

 

 

 

 

 

(3) 요약

  • A와 B를 잇는 간선 존재 여부 확인을 물어보는 문제 => 인접 행렬
  • A와 연결된 모든 정점 확인 => 인접 리스트 
  • But 간선의 수가 많아서 공간 복잡도의 제한을 넘어간다면 인접 리스트를 사용해야 한다.

 

3. 그래프(Graph) 문제의 핵심

  • 정점(Vertex) & 간선(Edge)에 대한 정확한 정의
  • 간선 저장 방식을 확인하기 => 대부분 인접 리스트를 사용하는 것이 좋다.
반응형