본문 바로가기

Data Structure

Graph [concept] - DataStructure

그래프(Graph)

 

개념


그래프란, 노드들과 그 노드들을 연결한 간선을 나타낸 자료구조이다.

각각의 노드들은 정점(Vertex)이라고 표현한다.

 

그럼 트리와는 뭐가 다른가요?

그래프 트리
노드와 노드를 연결하는 간선들의 집합 Cycle이 없는 Connected Graph
Cycle 존재 가능 Cycle 존재 불가능
두 정점 사이의 여러개의 경로 존재 가능 두 정점 사이 반드시 1개의 경로 존재
간선의 수는 그래프의 종류에 따라 다름 간선의 수 = 정점의 수 -1

그래프  트리

 

 

표현방식


그래프 자료구조의 표현 방식에는 두 가지가 있다.

1. 인접 행렬

2. 인접 리스트

 

• 인접행렬 (Adjency Matrix)

정의 : 그래프의 연결 관계를 이차원 배열로 나타낸 방식,,

ex) adMa[i][j] -> i 정점에서 j 정점으로 가는 간선이 존재하면 adMa[i][j] = 1

이때 만약 간선에 가중치가 존재한다면 행렬 내부의 값을 가중치로 바꿔주기만 하면 된다.

Adjency Matrix

 

 

• 인접리스트 (Adjency List)

정의 : 그래프의 연결 관계를 연결 리스트로 나타낸 방식,,

따라서 정점의 개수만큼 인접리스트가 존재하고, 각각의 인접 리스트에는 인접한 정점의 정보가 저장된다.

Adjency List

 

 

 

이번엔 또 두 개가 뭐가 다른가요...?

두 개의 표현방식에는 각각의 장단점이 있다.

 

 

 

• 인접행열 (Adjency Matrix)

 

장점

노드 i j의 인접(Adjency, 둘 사이에 간선이 존재하는 지) 여부를 O(1) 시간에 확인 가능.

밀집한(dense, 간선의 개수가 최대에 가까운) 그래프에서 효율적.

구현하기에 비교적 쉬움.

단점

간선의 개수에 상관없이 반드시 |Vertex|×|Vertex| 메모리 사용.

인접한 정점을 알려면 O(V)의 시간을 사용. ( 정점 개수와 간선 개수의 차이가 많이 날수록 비효율적)

 

 

 

• 인접리스트 (Adjency List)

 

장점

존재하는 간선에 따라 메모리 사용이 유동적 (드문(sparse) 그래프에서 효율적)

한 개 노드에 연결되어 있는 정점을 찾기에 간편.

단점

노드 i와 j의 인접 여부를 확인하려면 i에 연결되어있는 모든 정점을 확인해야 하므로 느림(최악의 경우 O(V) 사용)

구현이 비교적 어려움

 

 

정리하면,

인접 행렬 : 메모리를 많이 사용하지만, 탐색이 빠르고 간선이 많을수록 효율적 

인접 리스트 : 메모리는 간선의 개수만큼만 사용하지만, 탐색이 느림, 구현 어려움