happy coding
[lecture] 5주차.동적 계획 알고리즘_모든쌍 최단 경로 문제(플로이드 알고 본문
수업을 듣고 정리한 내용입니다.
Dynamic programming(DP) : 이미 문제가 분할되어 있는 상태로, 입력 크기가 작은 문제들을 해결하기 위해 그 해를 이용해 보다 큰 크기의 부분 문제를 해결하고 최종적으로 원래 주어진 입력의 문제를 해결하는 것이 목표이다.
DP vs. 분할
동적 계획 | 분할 |
여러 layer를 취합하여 해결한다. | 이전 layer를 취합하여 해결한다. |
동적 계획 알고리즘은 부분 문제 사이의 의존적 관계가 존재한다. 이는 문제와 입력에 따라 다르고 대부분 뚜렷하다는 함축적 순서를 가지고 있다고 말할 수 있다. 부분 문제의 해는 중복 사용하지 않는다.
- 최적 부분 구조/ 최적성 원칙 : 문제의 최적해 중 부분문제의 최적해
- 부분문제들 사이의 관계를 빠짐없이 고려해야 한다.
모든 쌍 최단 경로 문제 (All Pairs Shortest Paths)
모든쌍 최단 경로 문제는 각 쌍의 점 사이의 최단 경로를 찾는 문제이다. 이 문제는 다익스트라 알고리즘 또는 플로이드-워셜 알고리즘을 통해 해결할 수 있는데, 다익스트라는 각 점을 시작점으로 하는 알고리즘이며, 이 때의 시간복잡도는(n-1)*O(n^2) = O(n^3)이다.
플로이드-워샬 알고리즘(플로이드 알고리즘) 은 그래프의 모든 정점 쌍의 최단 거리를 저장하는 배열 dist[][]를 계산한다.(동적 계획법)
이 배열의 원소 dist[u][v]는 정점 u에서 v로 가는 최단 거리를 나타낸다.
아이디어
모든 점을 경유가능한 점들로 고려하고, 모든 쌍의 최단 경로의 거리를 계산한다
부분문제 찾기
D_ij^k = 점 {1,2,…,k}만을 경유하는 점들로 고려하고, 점 i로부터 점 j까지의 모든 경로 중에서 가장 짧은 경로의 거리이다. 단, 점 1에서 k까지의 모든 점들을 반드시 경유하는 경로를 의미하는 것은 아니다.
예시)
- D_ij^1은 i에서 점 1을 경유하여 j로 가는 경로, i에서 j로 직접 가는 경로, 즉 선분 (i,j) 중에서 짧은 거리이다. 단, i≠1, j≠1
- i에서 점 2를 경유하여 j로 가는 경로의 거리와 D_ij^1 중에서 짧은 거리를 D_ij^2로 정한다. 단, 점 2를 경유하는 경로의 거리는 D_i2^1 + D_2j^1 이다. 단, i≠2, j≠2
- i에서 점 k를 경유하여 j로 가는 경로의 거리와 D_ij^k-1 중에서 짧은 것을 D_ij^k로 정한다. 단, 점 k를 경유하는 경로의 거리는 D_ik^(k-1)+D_kj^(k-1)이다. 단, i≠k, j≠k
이런 방식으로 k가 1에서 n이 될 때까지 D_ij^k를 계산하여 모든 점을 경유 가능한 점들로 고려된 모든 쌍 i와 j의 최단 경로의 거리를 찾는 방식이 플로이드의 모든 쌍 최단경로 알고리즘이다.
시간 복잡도
각 k에 대해 모든 i,j 쌍에 대해 계산하는데 이것은 n*n*n으로 표현된다. 그리고 각 계산은 O(1)을 소요하기 때문에 시간 복잡도는 O(n^3)이다.
pseudocode
input : 2차원 배열 D, 단 D[ij] = 간선 (i,j)의 가중치, 만일 간선 (i,j)가 없다면 D[i,j]값은 무한대이다. 모든 i에 대해 D[i,j] = 0
output : 모든 쌍 최단 경로의 거리를 저장한 2차원 배열 D
AllPairsShortest
for k = 1 to n
for i = 1 to n ( i =/= k)
for j = 1 to n (j =/= k, j =/= i)
D[i,j] = min{D[i,k] + D[k,j], D[i,j]}
계산 다시 해보기 이해가 안감
'lecture > algorithm' 카테고리의 다른 글
[lecture] 6주차.정렬 알고리즘 (0) | 2022.11.25 |
---|---|
[lecture] 5주차.동적계획알고리즘_동전 거스름돈 문제 (0) | 2022.11.25 |
[lecture]5주차.동적계획 알고리즘_배낭 문제 (0) | 2022.11.16 |
[lecture]5주차.동적계획 알고리즘_편집 거리 문제 (0) | 2022.11.16 |
[lecture]5주차.동적계획 알고리즘_연속행렬곱셈 (0) | 2022.11.14 |