1. Shortest Path
시작은 한군데지만 모든 목적지로 가는 shortest path를 다 구한다.
shortest path의 모든 부분은 shortest path이다.
이는 여러가지 버전이 있다.
- 길이만 구하기
- 길이와 Path 구하기
- 가능한 여러개의 Path 구하기
2. Dijkstra Algorithm
이 알고리즘에 대해 설명해보겠다.
먼저 몇가지 정의를 하고가면
- R: 정답이 확정된 노드들의 집합
- B: Red Set에 있는 노드들만 거쳐서 갈 수 있는 노드들의 집합
- Dmin : 최단거리
1) 먼저 시작 노드부터 각 노드까지의 weight를 dim에 기록한다. 연결이 되어있지 않으면 ∞라고 기록된다.
2) 시작 노드를 R에 넣고 아래의 과정을 반복한다
- R 밖에 있는 Dmin(u)들 중 가장 작은 weight를 가진 노드 u를 R에 넣는다.
- R에 속하지 않은 다른 노드들 w에 대하여 갱신할 수 있는 값들을 갱신해준다. 갱신하는 방법은 현재 기록되어있는 Dmin(w)와 Dmin(u)+(u→w의 weight) 중 더 작은 값으로 갱신해주면 된다. 여기서 u는 1에서 새로 들어온 노드이다.
3. Dijkstra Algorithm - length
증명 (proof by induction)
Dijkstra Algorithm이 각 노드들의 최단길이를 찾을 수 있음을 증명해보자.
Base : 으로 주장이 성립한다.
Step :
어떤 시점에 집합 , 이라고 하자.
에 속한 노드들 중 D 값이 가장 작은 노드를 이 노드를 집합 R에 추가하자.
* 가장 작은 노드를 R에 넣는게 정당한 이유
가 다음에 집합 에 추가할 노드가 아니라면,
집합을 거쳐서 오는길은 제일 짧은 것이 아니라는 뜻이므로 집합의 노드를 거쳐서 와야 더 짧다는 의미가 된다.
그 경로에서 처음으로 만난 집합의 노드를 반드시 존재하는데, 그 노드는 dmin(w) 보다 항상 크다.
따라서 모순이 발생하므로, w를 넣는 것이 정당하다.
R 집합에 B에 있던 노드 를 추가하면, 를 통하는 더 저렴한 길이 생길 수 있기 때문에 집합 B의 D 값들을 모두 값으로 갱신해줘야 한다.
만 확인해도되는 이유
인 경우가 w까지의 최단거리라고 가정해보자.
u는 방금 집합 R에 들어갔기 때문에, v는 그 이전에 집합 R에 들어가있었다.
즉, v가 에 들어간 시점에는 가 R 바깥에 있었다.
이 경우, source에서 로 가는 최단경로 중에서 u를 안쓰고 에 속하는 경로가 존재하게 된다.
따라서 u가 필요 없어지므로 가정에 모순이 된다.
그러므로 인 경우만 따지는 것이 정당하다.
이미 u까지 가는 최단거리는 기록되어있어서 u→w 만 확인해도 된다.
4. Dijkstra Algorithm - path
증명(proof)
이제는 Dijkstra Algorithm를 통해 각 노드들의 실제 최단거리를 찾을 수 있는 최단거리 트리를 만들 수 있다는 것을 증명해보겠다.
모든 노드들은 최단경로 내에서 부모를 알고있다고 해보자. R에 u를 추가한 후에는 w 들의 최단거리를 갱신한다. 거리가 같은경우 기존 최단거리를 선택한다. 이렇게 최단거리 트리가 만들어진다.
5. Dijkstra Algorithm - all path
증명(proof)
이제는 Dijkstra Algorithm를 통해 각 노드들의 가능한 최단거리를 모두 찾을 수 있다고 가정해보자.
모든 노드들은 최단경로 내에서 부모를 알고있다고 해보자. R에 u를 추가한 후에는 w 들의 최단거리를 갱신한다. 거리가 같은경우 두 노드의 정보를 모두 저장하면 된다. 이렇게 최단거리 트리가 만들어진다.
6. 성능
노드의 개수 n 엣지의 개수 m 이라 하자.
- Source와 연결된 모든 정점마다 Edge Weight 를 갱신 -
- 에 Source 노드를 추가-
- 바깥에 있는 들 중 가장 작은 값을 가진 노드 u를 찾아서 R에 넣는다. - O(logn)
- 그리고 R에 속하지 않는 노드들 w에 대해서 값으로 집합 B(u와 인접)를 갱신시켜준다. 갱신하는 것도 O(logn)이 걸리고, 이 행위를 모든 Edge들에 해야하므로 O(mlogn)의 시간이 걸린다.
'학부 내용 정리 > [ 2-2 ] 알고리즘' 카테고리의 다른 글
[ 알고리즘 ] Tape Storage (1) | 2022.10.14 |
---|---|
[ 알고리즘 ] Deadline Scheduling (0) | 2022.10.14 |
[ 알고리즘 ] MST(2) : Kruskal Algorithm (0) | 2022.10.11 |
[ 알고리즘 ] MST(1) : Prim Algorithm (0) | 2022.10.11 |
[ 알고리즘 ] 자료구조 내용 복습 (0) | 2022.10.09 |