10. 선행지식 - 우선순위 큐
JAVA는 우선순위 큐 라이브러리를 지원한다!
import -> import java.util.PriorityQueue;
선언 - > PriorityQueue<자료형> queue;
일반적인 큐
연산의 결과로 먼저 들어간 데이터가 먼저 나옴
우선순위 큐
들어간 순서와 상관없이 우선순위가 높은 데이터가 먼저 나옴
병원을 예로 들면 위급한 환자에게
우선순위를 주어 먼져 치료하는 것!
12. 다익스트라 알고리즘이란?
다익스트라(Dijkstra) 알고리즘은가장 유명한 그래프 알고리즘 중 하나이다
단일 시작점 최단 경로 알고리즘으로, 시작 정점으로부터
다른 정점들까지의 최단거리를 계산
❖ 단일 시작점 알고리즘 이란?
하나의 시작점에서 다른 모든 정점까지 가는 최단거리를 구하는것
너비 우선 탐색의 연장으로 분류되며 실제로 그렇다
13. 우선순위 큐를 사용하는 너비 우선 탐색( 眞 다익스트라)
A(0)
C
D
E
B
G
F
5
1
2
1
5
3
3
3
2
각 정점까지의 최단 거리를 저장하는 배열 array_dist[]
15. A(0)
C(1)
D
E
B(5)
G
F
5
1
2
1
5
3
3
3
2
방문 : 다익스트라 알고리즘은 매 단계마다 아직 방문하지 않은 정점 중 시작점과 가까운 점을 찾아 방문한다.
아직 우리가 알고 있는 최단거리 정점은 시작점밖에 없음으로, 첫 단계는 항상 시작점을 방문하는 것
최단경로 산정 : 우리는 지금까지 이 경로들을 몰랐으므로 이 값들을 array_dist[B] 와 array_dist[C]에 저장
❖각 정점까지의 최단 거리를 저장하는 배열 array_dist[]
큐 저장 : 이는 현재까지의 최단거리이기 때문에 우선순위 큐에 (array_dist[B],B), (array_dist[C],C) 를 삽입
탐색 : A에 연결된 정점들을 살펴 보면 B로 가는 길이 5인 경로와 C로가는 길이 1인 경로를 발견 할 수 있다
16. A(0)
C(1)
D(5)
E
B(5)
G
F
5
1
2
1
5
3
3
3
2
방문 : 시작점으로부터의 거리를 아는 정점 중 가장 가까운 것은 그 거리가 1인 C 이므로 C를 방문한다.
탐색 : A 에서 C로 가는 최단 거리는 1인데, 이 뒤에 길이 2인 간선을 붙히면 D로 가는 길이 3인 경로를 발견할수 있다.
최단경로 산정 : 이 값들을 array_dist[D] 에 저장
큐 저장 : 이는 현재까지의 최단거리이기 때문에 우선순위 큐에 (array_dist[D],D) 를 삽입
17. A(0)
C(1)
D(5)
E(8)
B(4)
G
F(6)
5
1
2
1
5
3
3
3
2
방문 : array_dist[D]가 가장 작으므로 D를 방문한다.
탐색 : 인접한 정점들을 탐색하면 B로 가는 길이 4인 경로, E로 가는 길이 8인 경로 F로 가는 길이 6인 경로를 발견한다.
최단경로 산정 :이중 B[4]로 가는 경로는 우리가 알던 B까지의 최단경로보다 짧은걸 알수 있다.
array_dist[E] = 8 저장 , array_dist[E] = 6 저장
갱신 :기존 5 였던 array_dist[B]를 4로 변경하고 마찬가지로 우선순위 큐도 데이터를 반영한다.
큐 저장 : 우선순위 큐에 기존 (array_dist[B](5) ,B) 는 그대로 두고 (array_dist[B](4) ,B) 를 추가한다.
(array_dist[E] ,E) 추가 , (array_dist[F] ,F) 추가
이후 큐에서 꺼낼 때 array_dist[B]를 비교하여 짧은 경로를 판별하는 것이 우선순위 큐 내에서 값을 찾아내 바꾸는 것보다 효율적임
18. A(0)
C(1)
D(5)
E(8)
B(4)
G(7) F(7)
5
1
2
1
5
3
3
2
2
방문 : array_dist[B]가 가장 작으므로 B를 방문한다.
탐색 : 인접한 정점들을 탐색하면 G로 가는 길이 7인 경로, F로 가는 길이 7인 경로를 발견한다.
최단경로 산정 : G까지 가는 최단 경로 array_dist[G] = 7 을 저장 , F까지 가는 경로 를 발견하지만 이미 7보다
적으므로 변경하지 않음
큐 저장 : (array_dist[G] ,G) 추가
22. 최단 경로 계산 완료
이렇게 모든 정점이 방문된 시점에서 다익스트라 알고리즘이 계산한
arrat_dist[] 배열에는 각 정점까지의 최단 경로가 모두 계산되어 있음
굵게 표시된 간선들을 모아보면 트리 형태가 된다.
이 트리의 루트 (A)에서 각 정점까지로 가는 경로는 원래 그래프의 최단경로이다
이를 최소 비용 스패닝트리(minimum cost spanning tree) 라고한다.
그래프의 각 변에 비용이 주어질 경우 생성 트리들 중에 모든 꼭짓점을 포함하며 비용이 최소이며 을 말한다.
24. 귀류법에 따른 정당성의 증명
어떤 주장에 대해 그 함의하는 내용을 따라가다보면 이치에 닿지 않는 내용 또는 결론에
이르게 된다는 것을 보여서 그 주장이 잘못된 것임을 보이는 것
25. 정당성의 증명
귀류법을 위해 다익스트라 알고리즘이 최단 거리를
제대로 계산하지 못하는 정점 U가 있다고 가정
K
S
P
Q
U
방문됨
아직 방문되지 않음
다익스트라 알고리즘이 산정한 최단 경로는 실선 dist[U]
제대로 계산하지 못하여 실제 최단 경로는 점선 dist[Q]를 거쳐 정점 U에 도착하는 경로라 가정
❖dist[X] 시작점으로부터 X까지의 경로
26. K
S
P
Q
U
방문됨
아직 방문되지 않음
정당성의 증명
1. 시작점에 대해서는 항상 정확하게 최단거리를 계산하기
때문에 U는 시작점이 항상 아니라는 사실을 알 수 있음
2. 다익스트라 알고리즘이 U를 방문하는
순간, U 이전에 방문한 정점들과 아직 방문하
지 못한 정점들로 그래프를 나눌 수 있음
이때 U에 대해 최단 거리를 잘못 계산했다는 말은 다익스트라 알고리즘이 만든 스패팅 트리에서
의 경로보다 더 짧은 경로가 존재 한다는 의미
27. K
S
P
Q
U
방문됨
아직 방문되지 않음
정당성의 증명
1 .이미 방문한 정점을 P ,그 직전에 만난 정점을 Q 라고 가정
2. 이 때 시작점 부터 Q까지의 최단 거리는 dist[P] + w(P,Q) 가 된다.
❖ 가중치 w(❨X,Y)❩
❖dist[X] 시작점으로부터 X까지의 경로
3. 하지만 P는 이미 방문한 상태이기 때문에, dist[Q]는 이미 최단 거리가 저장되있고,
우선순위 큐에도 들어가 있는 상태이다.
4. 다익스트라가 큐에서 dist[U]를 먼져 꺼냈다는 말은 dist[U] < dist[Q] 임을 증명
즉 Q를 지나서 U로 오는 경로가 dist[U]보다 짧다는
말은 모순이며 최소비용 스패닝트리보다 짮은 경로
는 존재할수 없다.