다익스트라 알고리즘: 간단한 구현 방법 성능 분석
- 총 O(V)번에 걸쳐서 최단 거리가 가장 짧은 노드를 매번 선형 탐색해야 합니다.
- 따라서 전체 시간 복잡도는 O(V²)입니다.
- 일반적으로 코딩 테스트의 최단 경로 문제에서 전체 노드의 개수가 5,000개 이하라면 이 코드로 문제를 해결할 수 있습니다.
- 하지만 노드의 개수가 10,000개 넘어가는 문제라면 어떻게 해야 할까요?
우선순위 큐
- 우선순위가 가장 높은 데이터를 가장 먼저 삭제하는 자료구조입니다.
- 예를 들어 여러 개의 물건 데이터를 자료구조에 넣었다가 가치가 높은 물건 데이터부터 꺼내서
확인해야 하는 경우에 우선순위 큐 이용할 수 있습니다.
- Python, C++, Java를 포함한 대부분의 프로그래밍 언어에서 표준 라이브러리 형태로 지원합니다.
자료규조 |
추출되는 데이터 |
스택(Stack) |
가장 나중에 삽입된 데이터 |
큐(Queue) |
가장 먼저 삽입된 데이터 |
우선순위 큐(Priority Queue) |
가장 우선순위가 높은 데이터 |
힙(Heap)
- 우선순위 큐(Priority Queue)를 구현하기 위해 사용하는 자료구조 중 하나입니다.
- 최소 힙(Min Heap)과 최대 힙(Max Heap)이 있습니다.
- 다익스트라 최단 경로 알고리즘을 포함해 다양한 알고리즘에서 사용됩니다.
우선순위 큐 구현 방식 |
삽입 시간 |
삭제 시간 |
리스트 |
O(1) |
O(N) |
힙(Heap) |
O(logN) |
O(logN) |
힙 라이브러리 사용 예제: 최소 힙
import heapq
# 오름차순 힙 정렬(Heap Sort)
def heapsort(iterable):
h = []
result = []
#모든 원소를 차례대로 힙에 삽입
for value in iterable:
heapq.heappush(h, value)
#힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
for i in range(len(h)):
result.append(heapq.heappop(h))
return result
result = heapsort([1, 3, 5, 7, 8, 2, 4, 6, 8, 0])
print(result)
힙 라이브러리 사용 예제: 최대 힙
import heapq
#내립차순 힙 정렬(Heap Sort)
def heapsort(iterable):
h = []
result = []
#모든 원소를 차례대로 힙에 삽입
for value in iterable:
heapq.heappush(h, -value)
#힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
for i in range(len(h)):
result.append(-heapq.heappop(h))
return result
result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
print(result)
다익스트라 알고리즘: 개선된 구현 방법
- 단계마다 방문하지 않은 노드 중에서 최단 거리가 가장 짧은 노드를 선택하기 위해 힙(Heap) 자료구조를 이용합니다.
- 다익스트라 알고리즘이 동작하는 기본 원리는 동일합니다.
- 현재 가장 가까운 노드를 저장해 놓기 위해서 힙 자료구조를 추가적으로 이용한다는 점이 다릅니다.
- 현재의 최단 거리가 가장 짧은 노드를 선택해야 하므로 최소 힙을 사용합니다.
댓글 영역