Tags
- Django
- 큐
- DB
- 백트래킹
- Tree
- 완전검색
- Article & User
- delete
- 이진트리
- stack
- M:N
- 스택
- Queue
- N:1
- 쟝고
- ORM
- 그리디
- create
- regexp
- count
- 트리
- SQL
- 뷰
- migrations
- drf
- update
- distinct
- outer join
- Vue
- 통계학
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Notice
Recent Posts
Link
데이터 분석 기술 블로그
다익스트라 알고리즘(Dijkstra's Algorithm) 본문
"가중치가 있는 그래프에서 특정 시작 노드로부터 모든 노드까지의 최단 경로를 찾는 알고리즘"
- 음의 가중치가 없는 그래프에서 최단 경로를 찾을 때 사용됨
- 우선순위 큐(Priority Queue)를 활용하여 효율적으로 탐색
- 네트워크 라우팅, GPS 길 찾기, 그래프 기반 문제 해결 등에 사용됨
다익스트라 알고리즘 동작 원리
- 시작 노드에서 모든 노드까지의 거리를 무한(∞)으로 초기화, 단 시작 노드는 0으로 설정
- 현재 가장 가까운 노드를 선택하여 인접 노드의 거리 갱신
- 모든 노드를 처리할 때까지 반복
# Pseudo Code
FUNCTION Dijkstra(graph, start):
거리 = {모든 노드를 ∞(무한대)로 초기화}
거리[start] = 0 # 시작 노드는 0
우선순위 큐 PQ에 (0, start) 삽입
WHILE PQ가 비어있지 않다면:
(현재 거리, 현재 노드) = PQ에서 최소값 꺼내기
IF 현재 거리 > 저장된 거리 THEN CONTINUE
FOR 모든 인접 노드 (next, weight) in graph[현재 노드]:
새로운 거리 = 현재 거리 + weight
IF 새로운 거리 < 저장된 거리[next]:
거리[next] = 새로운 거리
PQ에 (새로운 거리, next) 삽입
RETURN 거리
# Full Code
import heapq
def dijkstra(graph, start):
distances = {node: float('inf') for node in graph} # 거리 초기화
distances[start] = 0 # 시작 노드는 거리 0
pq = [(0, start)] # 우선순위 큐 (힙 사용)
while pq:
current_distance, current_node = heapq.heappop(pq) # 최단 거리 노드 꺼내기
if current_distance > distances[current_node]:
continue # 이미 처리된 노드는 무시
for neighbor, weight in graph[current_node]: # 인접 노드 탐색
distance = current_distance + weight
if distance < distances[neighbor]: # 최단 거리 갱신
distances[neighbor] = distance
heapq.heappush(pq, (distance, neighbor)) # 큐에 삽입
return distances # 모든 노드까지의 최단 거리 반환
# 그래프 정의 (인접 리스트)
graph = {
1: [(2, 2), (3, 4)],
2: [(3, 1), (4, 3)],
3: [(4, 5)],
4: []
}
start_node = 1
shortest_paths = dijkstra(graph, start_node)
print(shortest_paths)
다익스트라 알고리즘의 시간복잡도
구현 방식 | 시간복잡도 |
우선순위 큐 (Heap 사용) | O((V + E) log V) |
일반 리스트 사용 | O(V²) |
✅ 우선순위 큐를 사용하면 성능이 훨씬 좋아짐
다익스트라 알고리즘의 장단점
장점
- 가중치가 양수인 그래프에서 최단 경로를 빠르게 찾을 수 있음
- 우선순위 큐를 사용하면 O((V + E) log V)으로 최적화 가능
- GPS 내비게이션, 네트워크 라우팅 등 실생활에서 많이 사용됨
단점
- 음의 가중치를 가진 그래프에서는 사용할 수 없음 (벨만-포드 알고리즘 사용 필요)
- 우선순위 큐를 쓰지 않으면 성능이 O(V²)로 비효율적
결론
다익스트라 알고리즘은 가중치가 있는 그래프에서 최단 경로를 찾을 때 가장 많이 쓰이며, 우선순위 큐를 활용하면 빠르게 해결할 수 있다.
'데이터 사이언스 > 알고리즘' 카테고리의 다른 글
플로이드-워셜 알고리즘(Floyd-Warshall Algorithm) (0) | 2025.02.27 |
---|---|
벨만-포드 알고리즘(Bellman-Ford Algorithm) (0) | 2025.02.26 |
너비 우선 탐색 (BFS, Breadth-First Search) (0) | 2025.02.24 |
깊이 우선 탐색 (DFS, Depth-First Search) (0) | 2025.02.23 |
이진 탐색(Binary Search) (0) | 2025.02.22 |