* 본 포스팅은 기본적으로 edwith 플랫폼을 통해 제공되고 있는 MIT 6.006 Introduction to Algorithms (Fall 2011) 강의 내용을 바탕으로 정리한 것입니당 :D
------- * ------- * ------- * -------
* 가중 그래프 (Weighted graphs)
- 간선에 가중치가 부여된 그래프 구조 (모든 간선이 갖는 가중치가 동일하지 않음!) --> 더욱 다양한 종류의 문제에 대해 적용 가능함
- G = (V, E, W)
- W = 각 간선의 가중치를 나타내는 가중치 함수. W: E(간선 집합) → R(실수 집합)
- 다익스트라 알고리즘; 음수가 아닌 (non-negative) 가중치를 가정. O(V log V + E) 의 복잡도.
- 벨만-포드 알고리즘; 음수인 가중치에 대해서도 작동 가능. O(VE) 의 복잡도를 가짐.
+ 용어 정리
- 경로 path 는 간선의 나열과 같으며, 각 간선은 그래프에 존재해야 함 (간선 집합 E 의 원소여야!)
- p = < v_0, v_1, ... , v_k > & (v_i, v_(i+1)) ∈ E for 0 ≤ i < k
- 경로의 가중치 W(p) 는 간선의 가중치들의 합과 같음
- W(p) = ∑_(i=0 to k-1) w(v_i, v_(i+1))
- 최단 경로 문제는 가중치가 최소인 경로 p 를 찾는 것
- 가중치의 '개수'는 O(E^2) 에 제한되나, 가중치 '값'의 범위는 훨씬 넓은 범위에 걸쳐 (ex.지수적으로..) 존재할 수 있음!
- 또한, 가능한 경로의 수가 지수적으로 존재한다는 점에서 일반적인 탐색/정렬보다 어려운 문제...!!
- v_0 --(p)--> v_k : 정점 v_0 에서 v_k 로의 최단 경로를 찾는 문제에 대해,
- (v_0) = v_0 에서 v_0 까지의 경로이며, 가중치는 0 임
- 정점 u 에서 v 까지의 최단 경로 가중치 delta(u, v) = min{ w(p), u --(p)--> v } if any such path exists, or ∞ (inf)
- d(v) : 현재의 정점 v 까지의 (누적) 가중치. 최종적으로 delta 값을 갖게 하는 것이 목표!
- ∏[v] : 정점 v 까지의 최선의 경로에서 (v에 선행하는) 바로 직전 정점. 선행 관계를 나타냄~
+ 음의 가중치 (Negative weights)
- 근본적으로, 음의 가중치를 갖는 그래프가 왜(언제) 필요한가?
- 예 1) 운전 시 경로에 따라 돈을 내거나 (통행료 지불) / 돈을 받게 (광고를 보는 것에 대한 보상= 역통행료) 되는 경우
- 예 2) SNS 에서 좋아요 / 싫어요 flag 를 타고 이어지는 log
- 그래프에서 음의 사이클이 존재하는 경우, 최단 거리 delta 를 정의할 수 없는 정점들이 생기게 되는 문제 --> 해당 사이클에 특별한 처리 (종료 조건을제대로 설정하기 위해!) 를 해야 함!
- 유한의 값을 갖는 정점에 대해서는 delta 값을 찾고, 나머지는 미결정 또는 -∞ 라고 표시해야 함!
* 최적 경로 알고리즘의 일반적인 구조 (brute-force, no negative cycle only)
- 정점 집합에 있는 모든 u 에 대해 d[v] = ∞ 로 초기화하고, 선행자 ∏[v] = NIL 로 설정.
- 출발점 s 이 하나일 때 (single-source), d[s] = 0 으로 설정한 후, 간선 (u, v) 를 선택 & 완화(relax) 하는 과정을 반복함
- 간선 (u, v) 의 선택은 Somehow... 이걸 어떻게 하느냐에 따라 다른 알고리즘이 됨!
- 간선 (u, v) 를 완화(relax) == if d[v] > d[u] + w(u,v) ==> d[v] = d[u] + w(u,v) & ∏[v] = u 으로 갱신
- -- 기존의 d[v] 가 d[u] + w(u, v) 보다 크다면, v 로 가는 기존의 방법보다 더 나은 방법 (u를 거쳐가는 길!) 을 찾았다는 것!
- 모든 간선에 대해 d[v] 가 d[u] + w(u,v) 보다 작거나 같아질 때 (= 어떤 간선에 대해서도 더이상 완화가 불가능할 때) 반복이 끝남~
- 종료 조건을 만족시키기 위해선 모든 간선에 대해 확인해봐야 하므로 O(E) 만큼의 비용 요구됨
- 간선을 어느 순서로 선택할 지 신중하게 고려해서 알고리즘을 디자인 해야함!
-- 아니면 간선 완화하느라.. exponential time complexity 가 걸릴 수도...!!
- 간선을 어느 순서로 선택할 지 신중하게 고려해서 알고리즘을 디자인 해야함!
+ 최적 부분 구조 조건
- 대부분의 최단 경로 알고리즘이 효율적인 복잡도를 얻기 위해 이용하는 기법
- Theorem 1: 최단 경로의 부분 경로는 최단 경로가 됨
- Theorem 2: (삼각부등식)

- 해당 두 조건을 이용해 위의 brute-force 알고리즘을 선형 시간 알고리즘으로 개선할 수 있음!
'algorithms > [이론] MIT_6.006' 카테고리의 다른 글
| [MIT 6.006 정리] Lec 17. 그래프 (최단 경로 알고리즘_ 벨만-포드 알고리즘) (0) | 2021.03.30 |
|---|---|
| [MIT 6.006 정리] Lec 16. 그래프 (최단 경로 알고리즘_ 다익스트라 알고리즘) (0) | 2021.03.17 |
| [MIT 6.006 정리] Lec 14. 그래프 (깊이 우선 탐색 (DFS), 간선 분류, 순환 검출, 위상 정렬) (0) | 2021.03.15 |
| [MIT 6.006 정리] Lec 13. 그래프 (그래프 탐색, 너비 우선 탐색 (BFS)) (0) | 2021.03.14 |
| [MIT 6.006 정리] Lec 10. 해싱 (개방 주소법, 균일 해싱) (0) | 2021.03.10 |