[Data Structure]Graph
Graph
여러개의 점들이 서로 복잡하게 연결되어 있는 관계를 표현한 자료구조
- 직접적인 관계가 있는 경우 두 점 사이를 이어주는 선
- 간접적인 관계라면 몇 개의 점과 선에 걸쳐 이어짐
- 하나의 점을 정점(vertex), 하나의 선은 간선(edge), 간선에는 양방향 간선, 단방향 간선
인접 행렬
간선이 있다면 이 두 정점은 인접하다.
인접 행렬은 서로 다른 정점들이 인접한 상태인지를 표시한 행렬로 2차원 배열의 형태로 나타냄
이어져 있다면 1(true), 이어져 있지 않다면 0(false)
가중치 그래프라면 1 대신 관계에서 의미 있는 값을 저장
내비게이션 예제라면, 거리를 입력
- A의 진출차수는 1개 입니다: A —> C
- [0][2] === 1
- B의 진출차수는 2개 입니다: B —> A, B —> C
- [1][0] === 1
- [1][2] === 1
-
C의 진출차수는 1개입니다: C —> A
- [2][0] === 1
- 한 개의 큰 표와 같은 모습을 한 인접 행렬의 정점 확인 시 사용
- e.g. A에서 B로 진출하는 간선이 있는지 파악하기 위해선 0 번째 줄의 1 번째 열에 어떤 값이 저장되어있는지 바로 확인
- 가장 빠른 경로(shortest path) 탐색 시 사용
인접 리스트
각 정점이 어떤 정점과 인접하는지 리스트의 형태로 표현
정점별로 살펴봐야 할 우선 순위를 고려할 때가 있다.
- 메모리를 효율적으로 사용하고 싶을 때
- 연결 가능한 모든 경우의 수를 저장하기 때문에 상대적으로 메모리 차지
Graph 용어
- 정점(vertex) - 노드(node)라고도 하며, 데이터가 저장되는 그래프의 기본 원소
- 간선(edge) - 정점 간의 관계 나타냄(정점을 이어주는 선)
- 인접 정점(adjacent vertex) - 직접 연결되어 있는 정점
- 가중치 그래프(weighted Graph) - 연결의 강도(추가적인 정보, ex. 서울-부산으로 가는 거리 등)가 얼마나 되는지 적힌 그래프
- 비가중치 그래프(unweighted Graph) - 연결의 강도가 적혀져 있지 않는 그래프
- 무(방)향 그래프(undirected graph) -
- 진입차수(in-degree) / 진출차수(out-degree) - 한 정점에 진입(들어오는 간선)하고 진출(나가는 간선)의 개수 인접(adjacency) - 두 정점 간에 간선이 직접 이어져 있다면 이 두 정점은 인접 자기 루프(self loop) - 정점에서 진출하는 간선이 곧바로 자기 자신에게 진입하는 경우 자기 루프를 가졌다 라고 표현. 다른 정점을 거치지 않는다는 것이 특징. 사이클 (cycle) - 한 정점에서 출발하여 다시 해당 정점으로 돌아갈 수 있다면 사이클.
BFS와 DFS
그래프의 모든 정점 탐색 방법 중 가장 대표적인 두 가지 방법
그래프의 탐색은 하나의 정점에서 시작하여 그래프의 모든 정점들을 한 번씩 방문(탐색)하는 것이 목적
자료를 찾으려면, 하나씩 모두 방문
BFS(Breadth-First Search)
너비를 우선적으로 탐색하는 방법
주로 두 정점 사이의 최단 경로를 찾을 때 사용
최악의 경우에는 모든 경로를 다 살펴볼 수도
정점에서 같은 레벨의 정점부터 탐색?
DFS(Depth-First Search)
하나의 경로를 끝까지 탐색한 후, 찾는 값이 아니라면 다음 경로로 넘어가 탐색
다음 경로로 넘어가기 전에 해당 경로를 완벽하게 탐색할 때 사용
방향을 정하고 끝까지 탐색?
댓글남기기