참고 : BaaaaaaaarkingDog | [실전 알고리즘] 0x14강 - 다익스트라 알고리즘_구버전
다익스트라 알고리즘 구현하다 스스로 얼마나 부족한지 깨달아서 새로 공부한다.
백준 최단경로(1753) 문제를 다시 풀어보며 제대로 내것으로 만들어보자 !
방향 혹은 무방향 그래프에서 하나의 시작점으로부터 다른 모든 정점 까지의 최단 거리를 구하는 알고리즘
최단경로(1735) 문제를 예시로 살펴보자.
그래프를 그려보면 다음과 같다.
시작정점인 1의 최단거리 테이블을 만들면 다음과 같다.
자기 자신으로 가는 비용은 0,
다른 정점으로 가는 비용은 아직 계산 전이므로 무한대로 두어진 상태
※ 파란색은 확정된 것, 초록색은 (정점계산 후 최단거리가) 변경된 것
테이블이 이렇게 바뀐다.
따라서 답은
0
2
3
7
INF
가 나오게 된다.
그러나 이를 곧이곧대로 구현하면, 데이터가 많을경우 엄청난 시간초과와 메모리초과에 걸릴 수 있다.
구현한 방법에 따라 O(V² + V²) 혹은 O(V² + E) 가 발생한다.
힙을 사용한다.
사실 아직도 헷갈리는 부분이 좀 많아서 차근차근 정리해보고자 한다.
맨 처음에 [시작점, 0]
을 힙에 넣어주고 시작한다.
(참고) 나는 {}
형태로 묶어 넣었다.
초기 세팅이 끝나면, 본 과정을 시작한다.
[1, 0]
이 선택된다. 최단거리 테이블[1] = 0
이 맞는가? 최단거리 테이블[1] = 0
이 맞으므로, 1번 정점을 거쳐서 갈 수 있는 정점들의 비용을 계산한다.
이 값이 최단거리 테이블에 저장된 값보다 작으면?
현재 테이블에 저장된 INF 보다 작으므로, 값을 갱신하고 힙에 넣는다.
처리해주었으므로 [1, 0]
을 힙에서 제거한다.
[2, 2]
가 가장 작다. 최단거리 테이블[2] = 2
가 맞는가?2번 정점을 거쳐서 갈 수 있는 정점을 게산한다.
이 값이 최단거리 테이블에 저장된 값보다 작으면?
4번은 작지만, 3번은 오히려 더 크다!
👉🏻 3번의 경우 위 과정을 깔끔하게 무시한다.
처리가 끝났으므로 [2, 2]
를 힙에서 제거한다.
[3, 3]
이 제일 작다. 최단거리 테이블[3] = 3
이 맞나?3번 정점을 거쳐 갈 수 있는 정점을 계산한다.
4번: 3 + 6
이 값이 최단거리 테이블에 저장된 값보다 작은가?
놉, 더 크다.
따라서 무시한다.
처리가 끝났으므로 [3, 3]
을 제거한다.
[4, 7]
이 제일 작다. 최단거리 테이블[4] = 7
이 맞나?4번 정점을 거쳐 갈 수 있는 정점을 계산한다.
과정을 거칠게 없으므로(..) 무시한다.
처리가 끝났으므로 [4, 7]
을 제거한다.
힙이 비었으므로 과정이 종료된다.
이로서 최종 최단거리 테이블은 다음과 같이 계산된다.
각 간선당 최대 1개의 원소가 힙에 들어간다.
따라서 시간복잡도는 O(ElogE)가 된다.
당연하다..
(다른 언어는 잘 모르지만)자바스크립트에서 지원하는 힙 클래스는 없는 것 같다.
그래서 다음엔 힙 알고리즘 공부와 자바스크립트로 힙을 구현하는 걸 공부할 것이다 !