반응형
다익스트라 알고리즘은 최단 경로를 구하는 데 사용되는 그리디 알고리즘으로 처음 출발 노드부터 각 노드까지의 최단 거리를 무한 초기화되며, 출발 노드 거리를 0으로 설정합니다. 그 후 출발 노드로부터 인접 노드에 대한 최단 거리를 계산하여 더 짧은 경로로 거쳐가는 노드로 값을 경신합니다. 이 과정을 모든 노드에 반복함으로써 최단거리를 구합니다. 그래프 방향의 유무는 상관없으나, 간선들 중 단 하나라도 가중치가 음수가 있으면 이 알고리즘을 사용할 수 없다.
다익스트라 알고리즘 주요 특징
- 하나의 출발 노드에서 다른 모든 노드로부터의 최단 경로를 구합니다.
- 음의 가중치를 가진 간선이 없는 경우에만 정상 작동합니다.
- 그리디 알고리즘으로 항상 최단 거리를 보장하지만, 음의 가중치가 있는 경우 정확한 결과를 보장하지 않습니다. 이런 경우 벨만- 포드 알고리즘을 사용해야 합니다.
시간복잡도
다익스트라 알고리즘의 시간복잡도는 보통 우선순위 큐를 이용하여 구현하고 있으며, 이 경우에는 O((V + E) * log V)입니다. 여기서 V는 노드의 수이고, E는 간선의 수를 말합니다.
코드 구현
인접리스트를 사용하여 그래프 표현한 후, 우선순위 큐를 사용하여 최단 거리를 구합니다.
import java.util.*;
// 그래프의 간선 클래스
class Edge {
int destination;
int weight;
public Edge(int destination, int weight) {
this.destination = destination;
this.weight = weight;
}
}
// 그래프 클래스
class Graph {
private int V; // 노드의 수
private List<List<Edge>> adjList; // 인접 리스트
public Graph(int V) {
this.V = V;
adjList = new ArrayList<>(V);
for (int i = 0; i < V; i++) {
adjList.add(new ArrayList<>());
}
}
public void addEdge(int source, int destination, int weight) {
adjList.get(source).add(new Edge(destination, weight));
}
// 다익스트라 알고리즘
public int[] dijkstra(int source) {
int[] distances = new int[V];
Arrays.fill(distances, Integer.MAX_VALUE);
distances[source] = 0;
PriorityQueue<Edge> pq = new PriorityQueue<>(Comparator.comparingInt(e -> e.weight));
pq.offer(new Edge(source, 0));
while (!pq.isEmpty()) {
Edge current = pq.poll();
int u = current.destination;
int currentDistance = current.weight;
// 이미 더 짧은 경로를 찾은 경우 무시
if (currentDistance > distances[u]) continue;
for (Edge neighbor : adjList.get(u)) {
int v = neighbor.destination;
int weight = neighbor.weight;
// 더 짧은 거리를 찾은 경우 갱신하고 큐에 추가
if (distances[u] + weight < distances[v]) {
distances[v] = distances[u] + weight;
pq.offer(new Edge(v, distances[v]));
}
}
}
return distances;
}
}
public class DijkstraExample {
public static void main(String[] args) {
int V = 6; // 노드의 수
Graph graph = new Graph(V);
// 그래프에 간선 추가
graph.addEdge(0, 1, 2);
graph.addEdge(0, 2, 4);
graph.addEdge(1, 2, 1);
graph.addEdge(1, 3, 7);
graph.addEdge(2, 4, 3);
graph.addEdge(3, 4, 1);
graph.addEdge(3, 5, 5);
graph.addEdge(4, 5, 2);
int source = 0; // 출발 노드
int[] distances = graph.dijkstra(source);
// 결과 출력
System.out.println("다익스트라 알고리즘을 사용하여 " + source + "번 노드에서 각 노드까지의 최단 거리:");
for (int i = 0; i < V; i++) {
System.out.println(source + " -> " + i + ": " + distances[i]);
}
}
}
사용 분야
- 도로 네트워크에서 최단 경로 탐색 : 내비게이션 시스템이나 GPS에서 최단 경로를 찾는 경우 다익스타라 알고리즘을 사용됩니다.
- 컴퓨터 네트워크에서 라우팅 : 패킷을 최적 경로를 전송을 위해 라우팅 테이블 생성하는데 다익스트라 알고리즘 사용됩니다.
- 게임 개발에서 경로 탐색 : 게임에서 캐릭터나 유닛의 이동 경로 계산할 경우 다익스트라 알고리듬이 사용됩니다.
- 통신 네트워크에서 네트워크 트래픽 관리 : 네트워크 트래픽 최적화를 위한 다익스트라 알고리즘 사용됩니다.
- 지능형 에이전트 결정 : 최단 경로 활용하여 에이전트가 목적지 도달 및 장애물을 피할 수 있도록 결정하는 데 사용됩니다.
- 지도 애플리케이션에서의 최적 경도 계산 : 지동 서비스에서 사용자가 출발지와 목적지를 입력하면 최적 경로를 찾기 위해 다익스트라 알고리즘이 활용됩니다.
다익스트라 알고리즘은 경로가 하나일 때 가장 빠르게 동작하며, 음수 가중치를 가지는 경우에는 제대로 동작하지 않을 수 있습니다. 음수 가중치를 가지는 경우에는 벨만-포드 알고리즘이나 A* 알고리즘과 같은 다른 알고리즘을 사용해야 합니다.
이처럼 다익스트라 알고리즘은 네트워크 라우팅, 최단 경로 찾기, 길 찾기 애플리케이션 등 다양한 분야에서 유용하게 사용되며, 그래프 이론에서 중요한 알고리즘 중 하나입니다. 이처럼
반응형
'자료구조' 카테고리의 다른 글
재귀함수란 무엇일까? (0) | 2023.07.31 |
---|---|
완전탐색 알고리즘에 대해 알아보자 (0) | 2023.07.30 |
그리디 알고리즘에 대해 알아보자 (0) | 2023.07.29 |
병합 정렬/합병 정렬(merge sort)이란 무엇일까? (0) | 2023.07.29 |
분할 정복 알고리즘에 대해 알아보자 (0) | 2023.07.28 |