Tags
- 그리디
- Article & User
- migrations
- 통계학
- update
- 트리
- SQL
- create
- 뷰
- N:1
- Queue
- Vue
- drf
- 스택
- regexp
- 쟝고
- 백트래킹
- DB
- delete
- Tree
- 이진트리
- stack
- ORM
- outer join
- 큐
- 완전검색
- count
- distinct
- M:N
- Django
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
데이터 분석 기술 블로그
벨만-포드 알고리즘(Bellman-Ford Algorithm) 본문
벨만-포드 알고리즘
"가중치가 있는 그래프에서 최단 경로를 찾는 알고리즘으로, 음의 가중치(음수 간선)도 처리 가능하다!"
- 다익스트라와 달리 음수 가중치가 있는 그래프에서도 사용 가능
- 모든 간선을 최대 V-1번 반복하여 최단 경로를 업데이트하는 방식
- 음수 사이클(무한히 거리가 줄어드는 경우)도 감지 가능
벨만-포드 알고리즘 동작 원리
- 모든 노드까지의 최단 거리를 무한(∞)으로 초기화, 단 시작 노드는 0으로 설정
- 그래프의 모든 간선을 V-1번 반복하며 갱신 (V는 노드 개수)
- V번째 반복에서 값이 갱신되면 음수 사이클이 존재함!
# Pseudo Code
FUNCTION BellmanFord(graph, start):
거리 = {모든 노드를 ∞(무한대)로 초기화}
거리[start] = 0 # 시작 노드는 0
FOR i FROM 1 TO V-1 DO: # (V-1)번 반복
FOR (u, v, weight) IN 모든 간선:
IF 거리[u] + weight < 거리[v]:
거리[v] = 거리[u] + weight
# 음수 사이클 확인
FOR (u, v, weight) IN 모든 간선:
IF 거리[u] + weight < 거리[v]:
RETURN "음수 사이클 존재!"
RETURN 거리
# Full Code
def bellman_ford(graph, start, V):
distances = {node: float('inf') for node in graph} # 거리 초기화
distances[start] = 0 # 시작 노드는 거리 0
# V-1번 반복 (최대 V-1개의 간선 사용 가능)
for _ in range(V - 1):
for u in graph:
for v, weight in graph[u]: # 모든 간선 확인
if distances[u] + weight < distances[v]:
distances[v] = distances[u] + weight # 거리 갱신
# 음수 사이클 확인
for u in graph:
for v, weight in graph[u]:
if distances[u] + weight < distances[v]:
return "음수 사이클 존재!" # 무한히 감소하는 경로 발견
return distances # 최단 거리 반환
# 그래프 정의 (인접 리스트)
graph = {
1: [(2, 4), (3, 3)],
2: [(4, 2)],
3: [(2, -1), (4, 5)],
4: []
}
start_node = 1
V = len(graph)
shortest_paths = bellman_ford(graph, start_node, V)
print(shortest_paths)
벨만-포드 알고리즘의 시간복잡도
경우 | 시간복잡도 |
최선 (간선이 적고 빠르게 갱신 완료) | O(E) |
평균 | O(VE) |
최악 (V-1번 반복하며 모든 간선 체크) | O(VE) |
✅ 간선이 많을수록 느림 → O(VE) (V=노드, E=간선)
✅ 희소 그래프(간선이 적은 그래프)에서는 다익스트라가 더 빠름
벨만-포드 알고리즘의 장단점
장점
- 음수 가중치가 있는 그래프에서도 동작 가능
- 음수 사이클(무한히 거리가 줄어드는 경로) 탐지 가능
- 모든 노드까지의 최단 경로를 한 번에 계산 가능
단점
- 다익스트라(O((V+E) log V))보다 느림 (O(VE))
- 간선 개수가 많으면 성능이 급격히 저하됨 (V가 클 때 비효율적)
결론
벨만-포드 알고리즘은 음수 가중치가 있는 경우에도 최단 경로를 구할 수 있으며, 음수 사이클을 감지할 수 있다. 하지만 성능이 O(VE)로 느리므로, 일반적으로 다익스트라 알고리즘을 더 많이 사용한다.
'데이터 사이언스 > 알고리즘' 카테고리의 다른 글
동적 계획법(DP, Dynamic Programming) (0) | 2025.02.28 |
---|---|
플로이드-워셜 알고리즘(Floyd-Warshall Algorithm) (0) | 2025.02.27 |
다익스트라 알고리즘(Dijkstra's Algorithm) (0) | 2025.02.25 |
너비 우선 탐색 (BFS, Breadth-First Search) (0) | 2025.02.24 |
깊이 우선 탐색 (DFS, Depth-First Search) (0) | 2025.02.23 |