일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Python
- 안드로이드
- 웹
- django
- 파이썬3
- 스프링
- 파이썬
- Spring
- 자바
- 개발
- 보안
- 웹 개발
- 자료구조
- 스프링 부트
- rabbitmq
- mysql
- 데이터베이스
- JPA
- Spring Boot
- 스프링부트
- ORM
- 디자인 패턴
- python3
- 장고
- HTTP
- bytecode
- db
- BCI
- java
- node.js
- Today
- Total
semtax의 개발 일지
자료구조에서 그래프를 모델링하는 방법들 본문
개요
이번 포스팅에서는, 자료 구조에서 그래프를 모델링 하는 방법들에 대해서 알아보도록 하겠습니다.
그래프?
그래프는 정점(Vertex) 와 간선(Edge)로 이루어진 자료 구조 입니다.
보통 수학적으로는 아래와 같이 표기하게 됩니다.
G = (V, E)
V = {A, B, C}
E = {(A,B),(B,C),(A,C)}
즉, 위의 설명을 그림으로 나타내면 아래와 같습니다.
보통 위와 같은 형태의 자료구조를 그래프 라고 부릅니다.
또한 그래프의 종류에는 방향 그래프와, 무방향 그래프 2종류가 존재합니다.
방향 그래프는 A -> C, C -> A 와 같이 서로 방향이 존재하는 그래프를 가리킵니다.
무방향 그래프는 반면에 A -> C, C -> A 를 따로 구분 하지 않는 방향이 없는 그래프를 가리킵니다.
이제 그럼, 그래프를 어떻게 프로그래밍 적으로 모델링을 하는지 알아보도록 하겠습니다.
1. 인접 행렬
먼저 인접 행렬 방식입니다.
해당 방식은 말 그대로 A = M*N 배열의 형태로 그래프를 모델링 하는 방법입니다.
그런 뒤, i -> j 로 가는 길이 있으면, A(i,j) = 1, 아닌 경우 A(i,j) = 0 으로 표시하는 방식입니다.
보통 2차원 배열 또는 리스트로 모델링이 가능합니다.
위의 그래프를 파이썬을 이용해서 인접행렬 방식으로 나타내면 아래와 같습니다.
A = [
[0,1,1],
[1,0,1],
[0,1,1],
]
위 방식의 장/단점은 아래와 같습니다.
- 장점 : 구현이 간편하고, 특정 경로가 존재하는지를 빠르게 찾을 수 있다. O(1)
- 단점 : 메모리를 많이 먹는다.
2. 인접 리스트
다음으로, 인접 리스트 방식입니다.
해당 방식은 그래프의 한 정점 에서 연결되어 있는 정점 들을 하나의 리스트로 표현하는 방법입니다.
즉, 아래와 같은 방식으로 표시 합니다.
A : [B, C]
B : [C, D]
C : [D, E, F]
즉, 위의 인접 리스트를 예시를 들면
A는 B,C 와 연결 되어 있고, B는 C,D 랑 연결 되어 있고, C는 D,E,F 랑 연결이 되어 있는것입니다.
보통 리스트의 배열 또는, 리스트의 해시 테이블로 모델링이 가능합니다.
예시를 한개 더 들어 보도록 하겠습니다.
위의 그래프를 파이썬을 이용해서 인접리스트 방식으로 나타내면 아래와 같습니다.
A = {
A : [B,C],
B : [C,A],
C : [A,B],
}
위 방식의 장/단점은 아래와 같습니다.
- 장점 : 메모리를 인접 행렬 방식에 비해 적게 먹는다.
- 단점 : 특정 경로가 존재하는지를 찾는데에 인접행렬 방식보다 오래 걸린다 : O(N)
3. 기타
그 외에도, 간선 리스트 와 같은 방법들이 있습니다.
출처
'개발 > 알고리즘' 카테고리의 다른 글
위치정보를 빠르게 검색하자 : Geohashing (0) | 2021.01.10 |
---|---|
백분위수를 빠르고 효율적으로 계산하자 : DD-Sketch (0) | 2020.10.17 |
통계값을 효율적으로 저장하기 : HdrHistogram (0) | 2020.05.16 |
파이썬과 백트래킹 알고리즘을 이용한 스도쿠 구현 (1) | 2020.02.28 |
온라인 알고리즘을 이용해서 평균 값 구하기 (0) | 2020.02.23 |