최소 신장 트리 알고리즘: 크루스칼 vs 프림
최소 신장 트리 알고리즘: 크루스칼 vs 프림
최소 신장 트리(Minimum Spanning Tree, MST) 문제는 주어진 연결된 그래프에서 모든 정점을 연결하되, 그 가중치 합이 최소가 되는 신장 트리를 찾는 문제입니다. 이 문제를 해결하는 가장 대표적인 두 가지 알고리즘은 크루스칼 알고리즘
과 프림 알고리즘
입니다. 이 글에서는 이 두 알고리즘을 비교하고, 각각의 특징과 구현 방법, 장단점을 살펴보겠습니다.
크루스칼 알고리즘
크루스칼 알고리즘은 그리디 알고리즘의 일종으로, 그래프의 간선들을 오름차순으로 정렬한 후, 가장 적은 가중치 간선부터 선택하여 신장 트리를 만드는 방식입니다. 간단히 말해서 크루스칼 알고리즘은 '가장 적은 비용의 간선부터 가져오자'라는 원칙을 따릅니다.
구현 절차
- 간선 정렬: 그래프의 모든 간선을 가중치 기준으로 오름차순 정렬합니다.
- 집합 초기화: 각 정점을 개별적인 집합으로 초기화합니다 (유니온-파인드 자료구조 사용).
- 간선 선택: 정렬된 간선 리스트에서 순서대로 간선을 선택합니다. 선택한 간선이 사이클을 만들지 않는 한, 해당 간선을 MST에 추가합니다.
- 종료: 간선이 V-1개 선택될 때까지 계속합니다 (V는 정점의 수).
크루스칼의 장단점
크루스칼 알고리즘은 간선 중심이라는 점에서 큰 장점을 발휘합니다. 이 알고리즘은 다음과 같은 장단점을 가지고 있습니다:
- 장점: 희소 그래프(Sparse Graph)에 대해 매우 효율적입니다. 간선의 수가 적은 경우 비교적 빠르게 결과를 도출할 수 있습니다.
- 단점: 간선 정렬의 시간 복잡도가 O(E log E)로, 간선이 많은 경우 시간이 많이 소요될 수 있습니다.
프림 알고리즘
프림 알고리즘은 시작 정점에서 출발하여 신장 트리를 단계적으로 확장해 나가는 방식입니다. 시작 점을 기준으로 가장 저렴한 비용의 간선을 하나씩 추가해 나가는 방법으로 트리를 성장시키는 것이 특징입니다.
구현 절차
- 시작 정점 선택: 처음에 임의의 정점을 선택하여 시작합니다.
- 우선순위 큐 초기화: 선택된 정점에서 갈 수 있는 간선들을 우선순위 큐에 삽입합니다.
- 간선 선택: 큐에서 가장 작은 가중치의 간선을 뽑아 현재 MST에 추가합니다.
- 정점 추가 및 큐 업데이트: 새로 연결된 정점에서 갈 수 있는 간선들을 큐에 추가하거나 업데이트합니다.
- 종료: 모든 정점이 포함될 때까지 또는 필요한 간선 수 만큼 반복합니다.
프림의 장단점
프림 알고리즘은 정점을 중심으로 작동하므로 다음과 같은 장단점을 가지고 있습니다:
- 장점: 조밀한 그래프(Dense Graph)에서 유리합니다. 특히, 인접 리스트와 우선순위 큐를 사용한 구현에서 매우 효율적입니다.
- 단점: 정점과 간선의 수가 많은 경우 메모리 사용량이 증가할 수 있습니다.
크루스칼 vs 프림: 어떤 알고리즘을 선택할까?
두 알고리즘은 각각의 장단점이 뚜렷합니다. 따라서 주어진 문제의 그래프 특성에 따라 선택할 알고리즘이 달라질 수 있습니다.
- 그래프의 밀도: 희소 그래프의 경우 크루스칼 알고리즘이 더 효율적입니다. 반면, 조밀한 그래프의 경우 프림 알고리즘이 더 적합합니다.
- 자료구조: 유니온-파인드 자료구조와 같은 간선 중심의 자료구조를 잘 활용할 수 있다면 크루스칼이 적합합니다. 반면, 인접 리스트와 우선순위 큐 등 정점 중심의 자료구조를 더 잘 활용할 수 있다면 프림이 적합합니다.
- 시간 복잡도: 크루스칼 알고리즘의 시간 복잡도는 간선의 수에 크게 의존하며, 프림 알고리즘은 정점의 수에 의존합니다. 따라서 그래프의 형태에 따라 적절한 알고리즘을 선택할 수 있습니다.
결론적으로, 크루스칼과 프림 알고리즘은 서로 다른 특성과 장단점을 가지며, 사용 환경에 맞는 알맞은 알고리즘을 선택하는 것이 중요합니다. 이 두 알고리즘을 잘 이해하고 적재적소에 활용함으로써 그래프 문제를 효율적으로 해결할 수 있을 것입니다.