: 그래프 내의 모든 정점을 포함하는 트리
모든 정점이 연결되어 있고, 사이클
이 없는 그래프이다.
신장 트리는 n개의 정점
을 (n-1)개의 간선
으로 표현한다.
신장 트리 == 그래프의 최소 연결 부분 그래프
: 간선들의 가중치의 합이 최소
인 신장트리.
위 그래프에서 오른쪽의 트리가 최소 신장 트리이다.
간선의 개수 = 정점의 개수 - 1
(정점 n, 간선 e일 때 e = n - 1
사이클이 없다.
가중치의 합이 최소
최소 신장 트리 (이하 MST)를 구하기 위한 알고리즘은 크게 두 가지가 있다.
Greedy
한 방법을 이용해서 각 단계 별 최소 비용을 구한다.
Greedy
: 탐욕법
현재 상황에서 가장 최적의 상황만을 찾는다.
각 단계에서 사이클을 이루지 않는 최소 비용의 간선을 선택한다.
여기서 해당 간선이 사이클을 이루는지 여부는, union-find
알고리즘을 이용해서 판별한다.
union-find 알고리즘
여러 정점 중에서, 두 정점이 속하는 집합이 같은 집합인지 판별한다.
(정점 u, v에 대해 u가 속한 집합과 v가 속한 집합이 같은 집합인지)union-find = union + find 연산.
union
: 두 원소가 속한 집합을 합치는 연산 (합집합)
find
: 해당 원소가 속한 집합을 반환하는 연산
정점 n개, 간선 e개 라고 했을 때
간선들을 정렬해야 하므로
시간 복잡도는 O(eloge)
.
단계 별로, 신장 트리의 집합을 확장시켜 나가는 방법이다.
이전 단계에서 만들어진 신장 트리 집합에서 인접한 정점들 중, 최소 간선으로 연결된 정점을 추가하는 방식이다.
우선순위 큐
를 사용한다.
정점 n개 기준
O(n^2)
둘 다 가중치가 작은 간선들을 Greedy하게 선택한다는 공통점이 있다.
하지만 Kruskal
은 간선들을 정렬하고 가중치가 작은 간선부터 선택하고,
Prim
은 임의의 정점부터 시작해서, 해당 정점 기준으로 가중치가 가장 작은 간선을 선택해나간다.
구분 | Kruskal | Prim |
---|---|---|
기준 | 간선 선택 기반 | 정점 선택 기반 |
시간복잡도 | O(eloge) | O(n^2) |
때문에,
정점에 비해 간선이 드문 희박한 그래프라면 Kruskal
알고리즘을 사용하고,
간선이 많은 밀집된 그래프라면 Prim
알고리즘을 사용하는 것이 적합하다.