Djikstra Algorithm
유명한 Shortest Path의 정답. 프림 알고리즘과 유사하다.
시작은 한군데지만 모든 목적지로 가는 shortest path를 다 구한다.
shortest path의 모든 부분은 shortest path이다.
대부분 path를 구하는 것이 아니라 path의 길이만을 구한다.
=> 길까지 구하는 것으로 금방 바꿀 수 있다. 심지어 path가 여러 개일때 모든 path를 다 찾을 수 있다.
3단계로 나눠서 얘기하면 이를 설명할 수 있음
일단 1단계부터 설명 => 2단계로 바꾸고 => 3단계로 바꿀 것임
(1단계에서 왜 이게 답을 찾느냐가 어려움)
G: 입력 그래프
n: 노드 갯수
R: 빨간 노드 집합
V0: source node
dmin: 노드에 써진 숫자
빨간노드와 파란 노드가 있다.
빨간 노드: 최종 정답을 아는 노드 , 빨간 숫자를 가지고 있다.
빨간 숫자: 최종 정답
파란 노드: 최종 정답을 모르는 노드, 파란 숫자를 가지고 있다.
파란 숫자: Red node들만을 거쳐서 올 수 있는 가장 짧은 길의 길이
T: 빨간 노드들의 집합
T가 아닌 애들은 파란 노드
시작했을 때 source node는 본인이 0이라는 것을 알고 있다. (유일한 레드 노드)
오른쪽 위의 노드는 source node에서 빨간 것만 거쳐서 갈 수 있는 가장 짧은 길이 없다.
엣지가 없으므로 무한대라고 생각 (그래프의 모든 엣지를 다 더한 것보다 큰값..일단 무한대로 써놓기)
파란 노드 2개는 빨간 노드만을 거쳐서 갈 수 있는 가장 짧은 길의 길이 = 15, 19이므로
각각의 엣지의 weight는 15, 19이다.
(바로 가는 것이 답이 아니므로 파란 숫자로 써야 한다.)
한 바퀴 돌때마다 빨간 노드가 하나씩 추가된다.
간단한 그리디 작전! (이 작전이 왜 통하느냐가 중요)
파란노드들 중에 dmin이 가장 작은 걸 찾아라
※ 파란 노드가 빨간 노드를 전부 다 지나야 하는 것은 아님 = 파란 노드는 파란 노드를 못 거친다.
지금까지 재귀적으로 정상적으로 동작했다고 생각하며, 빨간 노드 하나를 더 추가시키면 되는 상황
다익스트라 알고리즘의 주장 : 파란 노드 중에 가장 작은 것은 정답이다 (15가 정답이라고 주장)
파란 노드 중 15가 제일 작으니까 빨간 노드로 바꾼다.
이유: (밑에 이해 안감 ㅠㅠ 어려워)
우리가 15노드에 대해 알고 있는 2가지 fact
1. 15는 빨간 것만 거쳐서 오는 제일 짧은 거리이다
2. 파란 숫자 중 가장 작은 값이 15이다.
다익스트라 알고리즘은 파란 노드 중 가장 작은 15를 정답이라고 생각하고 빨간 노드로 바꿔버린다.
(아직 사실인지 모르지만 다익스트라 알고리즘의 주장)
그래서 그 주장을 어떻게 확인하는데?
그 주장이 틀렸다면 어떻게 될지를 생각해보자
팩트: 빨간 노드만 거쳐서 오는 것 중에 가장 짧은 값은 15이다.
만약 15가 정답이 아니라면? 더 좋은 답이 있다면?
그 답은 빨간 노드만을 거쳐서 오는 것이 아닐 것이다.
왜냐하면 빨간 노드만 거쳐서 오는 것 중에 가장 짧은 값은 15이기 떄문에
그건 파란 노드를 거쳐서 오는 것일 것임
파란 노드를 거치는 path가 있다면 그 중 빨간 것만 거쳐서 최초로 파란 노드로 나오는 순간이 있을 것이다.
그리고 그것이 15보다 작아야 하는데 이미 15는 빨간 것만 거치는 노드 중 가장 작은 값이기 때문에 불가능
ex
(20노드에 도달하기 전에 최초의 파란 노드가 있었다면 그 값은 20보다 작을 것임. 하지만 15보단 클 것이기 때문에 X)
'알고리즘' 카테고리의 다른 글
알고리즘7-2 BFS (0) | 2020.09.23 |
---|---|
알고리즘7 다익스트라, BFS (0) | 2020.09.23 |
알고리즘5 - Kruskal Algorithm (0) | 2020.09.16 |
알고리즘4 Greedy Algorithms - Prim Algorithm (0) | 2020.09.10 |
알고리즘3-2 자료구조 리뷰2 (0) | 2020.09.10 |