Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- nqueen
- 퀵정렬
- 해쉬테이블
- Korean-NLP
- 백준알고리즘2920번
- FastCampus
- 코딩테스트대비
- package-install
- 파이썬
- AIFFEL
- 환급챌린지
- 연결리스트
- BFS알고리즘
- 최단거리알고리즘
- 인강
- 작심삼개월
- Ai
- 코딩테스트
- 시간복잡도
- 프림알고리즘
- 코딩테스트인강
- 트리구조
- DFS알고리즘
- 1주차완료
- 자료구조
- 알고리즘
- 크루스칼알고리즘
- 내돈내산
- 패스트캠퍼스
- 시나공정보처리기사
Archives
- Today
- Total
DevLog
[패스트캠퍼스 :: 코딩테스트 인강] 10주차 ① 최단 거리 알고리즘, 다익스트라 알고리즘 본문
IT 개발/Algorithm 알고리즘
[패스트캠퍼스 :: 코딩테스트 인강] 10주차 ① 최단 거리 알고리즘, 다익스트라 알고리즘
Euniverse 2021. 4. 24. 22:45알고리즘/기술면접 완전 정복 올인원 패키지 Online
그래프 고급 탐색 알고리즘 - 최단 경로 알고리즘 이해 - 2
그래프 고급 탐색 알고리즘 - 최단 경로 알고리즘 이해 - 3
그래프 고급 탐색 알고리즘 - 다익스트라 알고리즘 파이썬 구현 - 1
그래프 고급 탐색 알고리즘 - 다익스트라 알고리즘 파이썬 구현 - 2
강의 제목부터도 어려웠던 강의.
벌써 10주 차이고, 5월 15일까지 환급 챌린지를 하게 되는데,
시간이 굉장히 빠르면서도 얼마 남지 않은 게 믿기지 않기도 하다.
강의 수가 꽤 많아서 아직 절반 정도밖에 못한 것 같아서
마음이 급해지기도 한다.
(꼭 강의를 끝내라는 규칙은 없었지만 스스로의 조급)
최단 경로 문제란?
- 최단 경로 문제란 두 노드를 잇는 가장 짧은 경로를 찾는 문제임
- 가중치 그래프 (Weighted Graph) 에서 간선 (Edge)의 가중치 합이 최소가 되도록 하는 경로를 찾는 것이 목적
최단 경로 문제 종류
- 단일 출발 및 단일 도착 (single-source and single-destination shortest path problem) 최단 경로 문제
- 그래프 내의 특정 노드 u 에서 출발, 또 다른 특정 노드 v에 도착하는 가장 짧은 경로를 찾는 문제
- 단일 출발 (single-source shortest path problem) 최단 경로 문제
- 그래프 내의 특정 노드 u 와 그래프 내 다른 모든 노드 각각의 가장 짧은 경로를 찾는 문제따지고 보면 굉장히 헷깔릴 수 있으므로 명확히 하자면, 예를 들어 A, B, C, D라는 노드를 가진 그래프에서 특정 노드를 A라고 한다면, A 외 모든 노드인 B, C, D 각 노드와 A 간에 (즉, A - B, A - C, A - D) 각각 가장 짧은 경로를 찾는 문제를 의미함
- 전체 쌍(all-pair) 최단 경로: 그래프 내의 모든 노드 쌍 (u, v) 에 대한 최단 경로를 찾는 문제
최단 경로 알고리즘 - 다익스트라 알고리즘
- 다익스트라 알고리즘은 위의 최단 경로 문제 종류 중, 2번에 해당
- 하나의 정점에서 다른 모든 정점 간의 각각 가장 짧은 거리를 구하는 문제
다익스트라 알고리즘 로직
- 첫 정점을 기준으로 연결되어 있는 정점들을 추가해 가며, 최단 거리를 갱신하는 기법
- 다익스트라 알고리즘은 너비우선탐색(BFS)와 유사
- 첫 정점부터 각 노드간의노드 간의 거리를 저장하는 배열을 만든 후, 첫 정점의 인접 노드 간의 거리부터 먼저 계산하면서, 첫 정점부터 해당 노드 간의 가장 짧은 거리를 해당 배열에 업데이트다익스트라 알고리즘의 다양한 변형 로직이 있지만, 가장 개선된 우선순위 큐를 사용하는 방식에 집중해서 설명하기로 함
- 우선순위 큐를 활용한 다익스트라 알고리즘
- 우선순위 큐는 MinHeap 방식을 활용해서, 현재 가장 짧은 거리를 가진 노드 정보를 먼저 꺼내게 됨
- 초기에는 첫 정점의 거리는 0, 나머지는 무한대로 저장함 (inf 라고 표현함)
- 우선순위 큐에 (첫 정점, 거리 0) 만 먼저 넣음
- 처음에는 첫 정점만 저장되어 있으므로, 첫 정점이 꺼내짐
- 첫 정점에 인접한 노드들 각각에 대해, 첫 정점에서 각 노드로 가는 거리와 현재 배열에 저장되어 있는 첫 정점에서 각 정점까지의 거리를 비교한다.
- 배열에 저장되어 있는 거리보다, 첫 정점에서 해당 노드로 가는 거리가 더 짧을 경우, 배열에 해당 노드의 거리를 업데이트한다.
- 배열에 해당 노드의 거리가 업데이트된 경우, 우선순위 큐에 넣는다.
- 결과적으로 너비 우선 탐색 방식과 유사하게, 첫 정점에 인접한 노드들을 순차적으로 방문하게 됨
- 만약 배열에 기록된 현재까지 발견된 가장 짧은 거리보다, 더 긴 거리(루트)를 가진 (노드, 거리)의 경우에는 해당 노드와 인접한 노드 간의 거리 계산을 하지 않음
import heapq
def dijkstra(graph, start):
distances = {node: float('inf') for node in graph}
distances[start] = 0
queue = []
heapq.heappush(queue, [distances[start], start])
while queue:
current_distance, current_node = heapq.heappop(queue)
if distances[current_node] < current_distance:
continue
for adjacent, weight in graph[current_node].items():
distance = current_distance + weight
if distance < distances[adjacent]:
distances[adjacent] = distance
heapq.heappush(queue, [distance, adjacent])
return distances
시간 복잡도
- 위 다익스트라 알고리즘은 크게 다음 두 가지 과정을 거침
- 과정1: 각 노드마다 인접한 간선들을 모두 검사하는 과정
- 과정2: 우선순위 큐에 노드/거리 정보를 넣고 삭제(pop)하는 과정
- 각 과정별 시간 복잡도
- 과정1: 각 노드는 최대 한 번씩 방문하므로 (첫 노드와 해당 노드 간의 갈 수 있는 루트가 있는 경우만 해당), 그래프의 모든 간선은 최대 한 번씩 검사
- 즉, 각 노드마다 인접한 간선들을 모두 검사하는 과정은 O(E) 시간이 걸림, E는 간선(edge)의 약자
- 과정2: 우선순위 큐에 가장 많은 노드, 거리 정보가 들어가는 경우, 우선순위 큐에 노드/거리 정보를 넣고, 삭제하는 과정이 최악의 시간이 걸림
- 우선순위 큐에 가장 많은 노드, 거리 정보가 들어가는 시나리오는 그래프의 모든 간선이 검사 될 때마다, 배열의 최단 거리가 갱신되고, 우선순위 큐에 노드/거리가 추가되는 것임
- 이때 추가는 각 간선마다 최대 한 번 일어날 수 있으므로, 최대 O(E)의 시간이 걸리고, O(E) 개의 노드/거리 정보에 대해 우선순위 큐를 유지하는 작업은 𝑂(𝑙𝑜𝑔𝐸)O(logE) 가 걸림
- 따라서 해당 과정의 시간 복잡도는 𝑂(𝐸𝑙𝑜𝑔𝐸)
- 과정1: 각 노드는 최대 한 번씩 방문하므로 (첫 노드와 해당 노드 간의 갈 수 있는 루트가 있는 경우만 해당), 그래프의 모든 간선은 최대 한 번씩 검사
최단 경로 관련 문제는 정말 많이 나오는 걸로 알고 있는데,
다시 들어봐야겠다....
아직 잘 모르겠다.
[패스트캠퍼스 100% 환급 챌린지 미션 중입니다.]
'IT 개발 > Algorithm 알고리즘' 카테고리의 다른 글
[패스트캠퍼스 :: 코딩테스트 인강] 11주차 ① 크루스칼 알고리즘 (0) | 2021.05.01 |
---|---|
[패스트캠퍼스 :: 코딩테스트 인강] 10주차 ② 신장 트리, 크루스칼 알고리즘 (0) | 2021.04.25 |
[패스트캠퍼스 :: 코딩테스트 인강] 9주차 ② 탐욕 알고리즘 (0) | 2021.04.18 |
[패스트캠퍼스 :: 코딩테스트 인강] 9주차 ① 너비 우선 탐색(BFS), 깊이 우선 탐색(DFS) (0) | 2021.04.17 |
[패스트캠퍼스 :: 코딩테스트 인강] 8주차 ② 순차 탐색, 그래프 (0) | 2021.04.11 |