그래프(Graph) — 자료구조와 개념
그래프(Graph) — 자료구조와 개념
1. 그래프 개념
그래프는 **노드(Vertex, 정점)**와 **노드를 연결하는 간선(Edge)**으로 구성된 자료구조입니다. 노드들이 복잡하게 연결된 구조를 표현하는 데 적합합니다.
2. 구성 요소
- 정점(Vertex, Node): 그래프의 개별 객체
- 간선(Edge): 정점 간 연결 관계
방향성:
- 무방향 그래프(Undirected Graph): 간선에 방향 없음
- 방향 그래프(Directed Graph, Digraph): 간선에 방향 있음
- 가중치(Weight): 간선에 비용이나 거리 값을 부여할 수 있음
3. 표현 방법
인접 행렬(Adjacency Matrix)
- 2차원 배열로 간선 존재 여부 또는 가중치 저장
- 공간 복잡도: O(V²) (V는 정점 개수)
- 간선 존재 여부 빠르게 확인 가능
인접 리스트(Adjacency List)
- 각 정점에 연결된 정점 목록 저장
- 공간 효율적, 특히 간선이 적은 경우 유리
- 탐색 시 인접 노드 순회에 적합
4. 기본 연산 및 탐색
- DFS(Depth-First Search): 깊게 탐색하며 방문
- BFS(Breadth-First Search): 넓게 탐색하며 방문
- 최단 경로 알고리즘: 다익스트라, 벨만-포드, 플로이드-워셜 등
- 최소 신장 트리(MST): 크루스칼, 프림 알고리즘
5. 활용 사례
- 소셜 네트워크 연결 관계
- 도로, 통신망 경로 탐색
- 작업 스케줄링 (의존성 그래프)
- 추천 시스템, 게임 맵 탐색
6. 간단한 인접 리스트 구현 (Swift)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Graph<T: Hashable> {
private var adjacencyList: [T: [T]] = [:]
func addVertex(_ vertex: T) {
adjacencyList[vertex] = []
}
func addEdge(from: T, to: T, directed: Bool = false) {
adjacencyList[from]?.append(to)
if !directed {
adjacencyList[to]?.append(from)
}
}
func neighbors(of vertex: T) -> [T]? {
return adjacencyList[vertex]
}
}
7. 마무리
그래프는 복잡한 연결 관계를 나타내는 데 필수적이며, 컴퓨터 과학의 다양한 문제 해결에 사용됩니다. 자료구조와 알고리즘을 이해하면 효율적인 그래프 활용이 가능합니다.
This post is licensed under CC BY 4.0 by the author.