1. 개요
Floyd(플로이드) 알고리즘은 진짜 쉬움.
가장 간단히 최단 경로를 찾는 알고리즘.
간단한 가공으로 음의 가중치 역시 계산 가능. (경로 끊김 표시만 잘 처리한다면)
3중 반복문으로 풀이.
걸리는 시간 O(V^3)임. (엣지의 개수에 영향 받지 않으므로 정점이 적다면 사용해볼만 함)
물론 평균 속도는 다익스트라 알고리즘이 월등함.
알고리즘의 운행은 2차원 행렬을 다시 정점 수만큼 운행.
즉, 2차원 행렬 운행 시간 * V만큼 운행 => O(V^2) * O(V) = O(V^3)
점화식
T[i, j] = min( T<k-1>[i, j] , T<k-1>[i, k] +T<k-1>[k, j] )
점화식 의미
현재까지 계산된 정점 i에서 j로 가는 시간보다 정점 k를 거쳐서 가는 길이 더 작다면 교체.
즉, 계속 3개의 정점들을 비교하면 됨.
(의문점)
경로는 수없이 많은데 왜 3개만 비교하는 이유: DP 방식이기 때문에.
즉, 현재 계산할 경로는 이미 이전에 계산한 결과로 비교하기 때문에.
관념적으로는 3개의 정점만 비교하는 것이지만, 결국 V*V*V라는 것은 모든 정점을 다 비교.
그렇기에 이전 계산의 결과는 정점 i에서 정점 j까지 오는 모든 길을 비교한 것이 됨.
2. 문제
3. 코드
3-1) 플로이드 알고리즘
3-2) 출력
(맨 아래 행렬을 잘 조사하면 저 값이 최단 거리라는 것을 알 수 있다)
4. 정리
플로이드 알고리즘은 정점의 크기가 작을 때, 최단 거리를 찾는데 사용된다.
다익스트라 알고리즘과 비교하면,
플로이드 O(V^3) VS 다익스트라 O(ElogV)
성능을 고려한다면 무조건 다익스트라를 쓰자.
만약 E(엣지)의 수가 월등히 많다면 플로이드도 좋다.
하지만 성능보다 간결한 코드와 메모리 리소스에 대한 이슈를 해결하려 한다면 플로이드도 한번 생각해보자.
'테크 > 알고리즘' 카테고리의 다른 글
34. KMP 문자열 매칭 알고리즘 (0) | 2016.08.03 |
---|---|
33. 문자열 매칭 알고리즘 - 전수조사법(Brute Force) (0) | 2016.08.03 |
31. Hash 기초 문제 (1) 문자열에서 중복 문자 제거 알고리즘 (2) | 2016.07.17 |
30. Hash Separate Chaining(해시+링크드리스트) 구현 알고리즘 (5) | 2016.07.16 |
29. 가장 긴 공통 부분 문자열(LCS, Longest Common Subsequence) 찾기 알고리즘 (0) | 2016.07.09 |