최단 경로shortest path
는 그래프 내의 두 노드 사이의 최단 경로를 찾는 데 사용되는 알고리즘이다. 주로 다음과 같은 두 가지 유형의 그래프에서 적용된다.
1) 가중치 없는 그래프 (Unweighted Graphs
):
BFS
를 사용하여 최단 경로를 찾음2) 가중치 있는 그래프 (Weighted Graphs
):
Dijkstra's Algorithm
)Bellman-Ford Algorithm
)Dijkstra's Algorithm
)다익스트라 알고리즘은 1959년 에츠허르 데이크스트라가 발표한 최단 경로 알고리즘으로, 사실상 가중치가 있는 그래프의 최단 경로 문제는 대부분 다익스트라 알고리즘을 사용한다고 보면 될 정도로 중요한 알고리즘이다.
최단 거리 테이블: 각 노드까지의 최단 거리를 기록한 배열
노드 방문 여부 체크 배열: 각 노드가 방문되었는지를 기록한 배열
False
로 초기화간단한 그래프를 통해 다익스트라 알고리즘을 설명하도록 하겠다.
출발 노드와 도착 노드 설정
최단 거리 테이블 초기화
첫 번째 반복 (노드 A에서 시작)
두 번째 반복 (노드 B에서 시작)
세 번째 반복 (노드 D에서 시작)
네 번째 반복 (노드 C에서 시작)
모든 노드를 방문했으니 알고리즘 종료
💡 “음의 가중치가 있는 그래프에서 다익스트라 알고리즘은 어떨까?”
결론부터 말하면 다익스트라 알고리즘은 양의 가중치만 있는 그래프에서만 동작하므로 음의 가중치가 있는 그래프에서 제대로 동작하지 않는다. 그럼에도 다익스트라 알고리즘을 많이 사용하는 이유는 대부분의 경우 음의 가중치를 갖는 경우가 없고, 성능이 매우 뛰어나기 때문이다.
Bellman-Ford Algorithm
)벨만 포드 알고리즘 역시 노드에서 노드까지의 최소 비용을 구하는 알고리즘이다. 하지만 벨만-포드 알고리즘은 매 단계마다 모든 간선의 가중치를 다시 확인하여 치소 비용을 갱신하므로 음의 가중치를 가지는 그래프에서도 최단 경로를 구할 수 있다.
이번에도 간단한 그래프를 통해 단계를 설명해 보도록 하겠다.
1. 출발 노드와 도착 노드 설정
2. 최단 거리 테이블 초기화
3. 첫 번째 반복
4. 두 번째 반복
5. 세 번째 반복
6. 네 번째 반복
7. 모든 노드를 방문했으니 알고리즘 종료
💡 벨만-포드 알고리즘은 다익스트라 알고리즘보다 느리다?
다익스트라 알고리즘은 최단 경로를 찾기 위해 각 단계마다 가장 짧은 경로를 선택해 나가기 때문에 일반적으로 시간 복잡도가 더 낮다. 반면에 벨만-포드 알고리즘은 모든 가능한 간선을 반복적으로 검사하면서 최단 경로를 찾기 때문에 시간 복잡도가 상대적으로 높다.
특성 | 다익스트라 알고리즘 | 벨만-포드 알고리즘 |
---|---|---|
사용 가능한 그래프 유형 | 양의 가중치만 있는 그래프 | 음수 가중치가 있는 그래프도 처리 가능 |
동작 방식 | 각 단계마다 가장 짧은 경로 선택 | 모든 간선을 반복적으로 검사 |
시간 복잡도 | 상대적으로 낮음 | 상대적으로 높음 |
최단 경로 길이 | 단일 출발점에서 모든 다른 정점까지 최단 경로 계산 | 단일 출발점에서 모든 다른 정점까지 최단 경로 계산 |
사용 사례 | 양수 가중치만 있고 시간 복잡도가 중요할 때 | 음수 가중치가 있는 경우의 최단 경로 탐색 |
결론적으로 두 알고리즘은 사용 가능한 그래프 유형과 시간 복잡도 측면에서 차이가 있다. 따라서 경로 탐색에서 시간 복잡도가 중요한 경우에는 일반적으로 다익스트라 알고리즘을, 음수 가중치가 있는 경우나 더 유연한 해결 방법이 필요한 경우에는 벨만-포드 알고리즘이 사용하는편이 좋다.