그래프를 구현하는 방법으로 인접 행렬과 인접 리스트의 방법이 있다.

인접 행렬

인접 행렬 (Adjacency Materix)

- 그래프의 정점을 2차원 배열로 만드는 것

- 정점(노드)의 개수가 n 개라면 n * n 형태의 2차원 배열 사용

- 무방향 그래프는 인접행렬이 대칭적 구조

- 가중치 그래프 경우 행렬에 간선(링크)의 가중치 값 저장

- 그래프에 간선(링크)이 많이 존재하는 밀집 그래프의 경우 사용

장점

- 구현이 비교적 간단하다.

- 두 정점(노드)을 연결하는 간선(링크)을 조회할 때 0(1) 시간복잡도를 가진다.

- 정점(노드) (i)의 차수를 구할 때 인접행렬의 (i)번째 행의 값을 모두 더하여 0(n) 시간복잡도를 가진다.

 

단점

- 간선(링크)의 수와 무관하게 n² 크기의 2차원 배열이 필요하여 메모리 낭비가 크다.

- 그래프의 모든 간선(링크)를 알아내기 위해 인접행렬 전체를 확인하여 O(n²)의 시간복잡도를 가진다. 

  (노드의 갯수가 100개이고 링크가 1개일 때 1개의 연결을 찾기위해 100개의 노드를 확인해야한다.)

인접 리스트

인접 리스트 (Adjacency List)

- 실제로 연결된 노드들에 대한 정보만 저장

- 간선(링크)의 갯수에 비례하는 메모리만 차지

- 그래프의 정점(노드)에 인접한 정점(노드)들을 연결리스트로 만드는 것 

- 정점(노드)의 개수만큼 인접리스트가 존재하며 각각의 인접리스트에 인접한 정점(노드) 정보 저장

- 그래프는 각 인접리스트에 대한 헤드포인터를 배열로 갖는다.

- 그래프 내에 적은 숫자의 간선(링크)를 가지고 있는 희소 그래프의 경우 사용

장점

- 존재하는 간선(링크)의 수만 관리하여 메모리를 효율적으로 사용

- 그래프의 모든 간선(링크)를 알아내기 위해 각각의 모든 인접리스트를 탐색하여 O(n + e)의 시간복잡도를 가진다.

 

단점

- 구현이 비교적 어렵다.

- 두 정점(노드)가 연결 되었는지 확인 할 때 인접행렬 보다 비효율 적이다.

  (두 노드의 연결을 확인하기 위해 하나의 노드의 리스트 전체를 돌며 확인해야 한다.)

'자료구조, 알고리즘 문제 풀이 > 자료구조' 카테고리의 다른 글

Linear Queue 선형 큐  (0) 2022.03.07
stack 스택  (0) 2022.03.07
인접 리스트 구현  (0) 2022.02.17
인접행렬 구현  (0) 2022.02.17
그래프  (0) 2022.02.03

+ Recent posts