SlideShare a Scribd company logo
다익스트라 최단 경로 탐색
너나들이 X 굴러가는길 X Jang Gong Ui
선행 지식
기본 용어 정리
간선
중심이 되는 선, 주요 구간 사이를 연결하는
가중치
요소가 가지는 중요성의 값을 나타내는 비율
☞오후 들어 곳곳의 주요 간선이 심한 교통 체증을 빚고 있습니다
☞많은 대학이 고등학교 내신 성적에 가중치를 적용하여서 신입생을 선발했다.
선행지식 - 그래프
그래프란?
현실 세계의 사물이나 추상적인 개념 간의 연결 관계를 표현한 것
여러 도시들을 연결하는 도로망
사람들 간의 지인 관계
웹사이트 간의 링크 관계
컴퓨터간의 네트워크망
방향 그래프와 무방향 그래프
무방향 그래프에서의 최단 경로를 찾기 위해서는 각각의 양방향 간선을
두개의 일방 통행 간선으로 쪼개서 방향 그래프로 만들어야함
❖다익스트라의 경우 뱡향그래프를 기준으로 설계되었기 때문
그래프의 표현 방식
3
2
0
1 4
그래프 인접 행렬 표현
0 1 2 3 4
2
1
3
4
0 0
0
1
0
1
1
0
0
0
0
0
0
0
1
0
0
0
1
0
0
1
0
0
1
0
선행지식 - 너비 우선 탐색
선행지식 - 우선순위 큐
선행지식 - 우선순위 큐
JAVA는 우선순위 큐 라이브러리를 지원한다!
import -> import java.util.PriorityQueue;
선언 - > PriorityQueue<자료형> queue;
일반적인 큐
연산의 결과로 먼저 들어간 데이터가 먼저 나옴
우선순위 큐
들어간 순서와 상관없이 우선순위가 높은 데이터가 먼저 나옴
병원을 예로 들면 위급한 환자에게
우선순위를 주어 먼져 치료하는 것!
다익스트라 알고리즘
다익스트라 알고리즘이란?
다익스트라(Dijkstra) 알고리즘은가장 유명한 그래프 알고리즘 중 하나이다
단일 시작점 최단 경로 알고리즘으로, 시작 정점으로부터
다른 정점들까지의 최단거리를 계산
❖ 단일 시작점 알고리즘 이란?
하나의 시작점에서 다른 모든 정점까지 가는 최단거리를 구하는것
너비 우선 탐색의 연장으로 분류되며 실제로 그렇다
우선순위 큐를 사용하는 너비 우선 탐색( 眞 다익스트라)
A(0)
C
D
E
B
G
F
5
1
2
1
5
3
3
3
2
각 정점까지의 최단 거리를 저장하는 배열 array_dist[]
A(0)
C
D
E
B
G
F
5
1
2
1
5
3
3
3
2
탐색 : 그래프의 구조를 들여다 보지 않았기 때문에, 다른 정점까지의 최단 거리는 알수 없다.
따라서 시작점인 A까지의 최단거리가 0이라는 사실만을 알고 있다.
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인 경로를 발견 할 수 있다
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) 를 삽입
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]를 비교하여 짧은 경로를 판별하는 것이 우선순위 큐 내에서 값을 찾아내 바꾸는 것보다 효율적임
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) 추가
A(0)
C(1)
D(5)
E(8)
B(4)
G(7) F(6)
5
1
2
1
5
3
3
3
2
방문 : array_dist[F]가 가장 작으므로 F를 방문한다.
탐색 : 인접한 정점들을 탐색하면 G로 가는 길이 8인 경로를 발견
최단경로 산정 : 이미 arrat_dist = 7 이므로 변경하지 않음
A(0)
C(1)
D(5)
E(8)
B(4)
G(7) F(6)
5
1
2
1
5
3
3
3
2
방문 : array_dist[G]가 array_dist[E]보다 우선이므로 방문 (너비 우선 탐색 법칙)
A(0)
C(1)
D(5)
E(8)
B(4)
G(7) F(6)
5
1
2
1
5
3
3
3
2
방문 : E 방문 (너비 우선 탐색 법칙)
존재하는 모든 정점에 대한 경로 탐색이 완료 된다
최단 경로 계산 완료
이렇게 모든 정점이 방문된 시점에서 다익스트라 알고리즘이 계산한
arrat_dist[] 배열에는 각 정점까지의 최단 경로가 모두 계산되어 있음
굵게 표시된 간선들을 모아보면 트리 형태가 된다.
이 트리의 루트 (A)에서 각 정점까지로 가는 경로는 원래 그래프의 최단경로이다
이를 최소 비용 스패닝트리(minimum cost spanning tree) 라고한다.
그래프의 각 변에 비용이 주어질 경우 생성 트리들 중에 모든 꼭짓점을 포함하며 비용이 최소이며 을 말한다.
산정된 최단 경로는 정당한가?
귀류법에 따른 정당성의 증명
어떤 주장에 대해 그 함의하는 내용을 따라가다보면 이치에 닿지 않는 내용 또는 결론에
이르게 된다는 것을 보여서 그 주장이 잘못된 것임을 보이는 것
정당성의 증명
귀류법을 위해 다익스트라 알고리즘이 최단 거리를
제대로 계산하지 못하는 정점 U가 있다고 가정
K
S
P
Q
U
방문됨
아직 방문되지 않음
다익스트라 알고리즘이 산정한 최단 경로는 실선 dist[U]
제대로 계산하지 못하여 실제 최단 경로는 점선 dist[Q]를 거쳐 정점 U에 도착하는 경로라 가정
❖dist[X] 시작점으로부터 X까지의 경로
K
S
P
Q
U
방문됨
아직 방문되지 않음
정당성의 증명
1. 시작점에 대해서는 항상 정확하게 최단거리를 계산하기
때문에 U는 시작점이 항상 아니라는 사실을 알 수 있음
2. 다익스트라 알고리즘이 U를 방문하는
순간, U 이전에 방문한 정점들과 아직 방문하
지 못한 정점들로 그래프를 나눌 수 있음
이때 U에 대해 최단 거리를 잘못 계산했다는 말은 다익스트라 알고리즘이 만든 스패팅 트리에서
의 경로보다 더 짧은 경로가 존재 한다는 의미
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]보다 짧다는
말은 모순이며 최소비용 스패닝트리보다 짮은 경로
는 존재할수 없다.
다익스트라 알고리즘이 찾아내는
경로는 항상 최단 경로이다.
결론
❖ 모든 간선의 가중치가 0이상인 경우

More Related Content

Similar to 다익스트라 최단 거리 알고리즘

자료구조 그래프 보고서
자료구조 그래프 보고서자료구조 그래프 보고서
자료구조 그래프 보고서mil23
 
Data Structure 2
Data Structure 2Data Structure 2
Data Structure 2yonsei
 
[Swift] Data Structure - Graph(DFS)
[Swift] Data Structure - Graph(DFS)[Swift] Data Structure - Graph(DFS)
[Swift] Data Structure - Graph(DFS)Bill Kim
 
GameMath-Chapter 09 가시성판단
GameMath-Chapter 09 가시성판단GameMath-Chapter 09 가시성판단
GameMath-Chapter 09 가시성판단Mark Choi
 
[Swift] Data Structure - Graph(BFS)
[Swift] Data Structure - Graph(BFS)[Swift] Data Structure - Graph(BFS)
[Swift] Data Structure - Graph(BFS)Bill Kim
 

Similar to 다익스트라 최단 거리 알고리즘 (6)

자구5번
자구5번자구5번
자구5번
 
자료구조 그래프 보고서
자료구조 그래프 보고서자료구조 그래프 보고서
자료구조 그래프 보고서
 
Data Structure 2
Data Structure 2Data Structure 2
Data Structure 2
 
[Swift] Data Structure - Graph(DFS)
[Swift] Data Structure - Graph(DFS)[Swift] Data Structure - Graph(DFS)
[Swift] Data Structure - Graph(DFS)
 
GameMath-Chapter 09 가시성판단
GameMath-Chapter 09 가시성판단GameMath-Chapter 09 가시성판단
GameMath-Chapter 09 가시성판단
 
[Swift] Data Structure - Graph(BFS)
[Swift] Data Structure - Graph(BFS)[Swift] Data Structure - Graph(BFS)
[Swift] Data Structure - Graph(BFS)
 

다익스트라 최단 거리 알고리즘

  • 1. 다익스트라 최단 경로 탐색 너나들이 X 굴러가는길 X Jang Gong Ui
  • 3. 기본 용어 정리 간선 중심이 되는 선, 주요 구간 사이를 연결하는 가중치 요소가 가지는 중요성의 값을 나타내는 비율 ☞오후 들어 곳곳의 주요 간선이 심한 교통 체증을 빚고 있습니다 ☞많은 대학이 고등학교 내신 성적에 가중치를 적용하여서 신입생을 선발했다.
  • 5. 그래프란? 현실 세계의 사물이나 추상적인 개념 간의 연결 관계를 표현한 것 여러 도시들을 연결하는 도로망 사람들 간의 지인 관계 웹사이트 간의 링크 관계 컴퓨터간의 네트워크망
  • 6. 방향 그래프와 무방향 그래프 무방향 그래프에서의 최단 경로를 찾기 위해서는 각각의 양방향 간선을 두개의 일방 통행 간선으로 쪼개서 방향 그래프로 만들어야함 ❖다익스트라의 경우 뱡향그래프를 기준으로 설계되었기 때문
  • 7. 그래프의 표현 방식 3 2 0 1 4 그래프 인접 행렬 표현 0 1 2 3 4 2 1 3 4 0 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0
  • 8. 선행지식 - 너비 우선 탐색
  • 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[]
  • 14. A(0) C D E B G F 5 1 2 1 5 3 3 3 2 탐색 : 그래프의 구조를 들여다 보지 않았기 때문에, 다른 정점까지의 최단 거리는 알수 없다. 따라서 시작점인 A까지의 최단거리가 0이라는 사실만을 알고 있다.
  • 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) 추가
  • 19. A(0) C(1) D(5) E(8) B(4) G(7) F(6) 5 1 2 1 5 3 3 3 2 방문 : array_dist[F]가 가장 작으므로 F를 방문한다. 탐색 : 인접한 정점들을 탐색하면 G로 가는 길이 8인 경로를 발견 최단경로 산정 : 이미 arrat_dist = 7 이므로 변경하지 않음
  • 20. A(0) C(1) D(5) E(8) B(4) G(7) F(6) 5 1 2 1 5 3 3 3 2 방문 : array_dist[G]가 array_dist[E]보다 우선이므로 방문 (너비 우선 탐색 법칙)
  • 21. A(0) C(1) D(5) E(8) B(4) G(7) F(6) 5 1 2 1 5 3 3 3 2 방문 : E 방문 (너비 우선 탐색 법칙) 존재하는 모든 정점에 대한 경로 탐색이 완료 된다
  • 22. 최단 경로 계산 완료 이렇게 모든 정점이 방문된 시점에서 다익스트라 알고리즘이 계산한 arrat_dist[] 배열에는 각 정점까지의 최단 경로가 모두 계산되어 있음 굵게 표시된 간선들을 모아보면 트리 형태가 된다. 이 트리의 루트 (A)에서 각 정점까지로 가는 경로는 원래 그래프의 최단경로이다 이를 최소 비용 스패닝트리(minimum cost spanning tree) 라고한다. 그래프의 각 변에 비용이 주어질 경우 생성 트리들 중에 모든 꼭짓점을 포함하며 비용이 최소이며 을 말한다.
  • 23. 산정된 최단 경로는 정당한가?
  • 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]보다 짧다는 말은 모순이며 최소비용 스패닝트리보다 짮은 경로 는 존재할수 없다.
  • 28. 다익스트라 알고리즘이 찾아내는 경로는 항상 최단 경로이다. 결론 ❖ 모든 간선의 가중치가 0이상인 경우