Spanning Tree?
- 그래프 내의 모든 정점을 포함하지만 사이클이 없는 트리로, 신장 트리라고도 한다.
- 스패닝 트리는 그래프의 최소 연결 부분 그래프이다.
- 최소 연결은 간선의 수가 가장 적은 것을 의미한다.
- n개의 정점을 가지는 그래프의 최소 간선의 수는 n−1개이고 (n−1)개의 간선으로 연결되어 있으면 필연적으로 트리 형태가 되고 이것이 바로 Spanning Tree가 된다.
- 즉, 그래프에서 일부 간선을 선택해서 만든 트리이다.
신장 트리란?
- 연결 그래프의 부분 그래프이며, 그래프에서 모든 정점을 포함함
- 정점 간 서로 연결이 되어있어야 한다.
- 사이클이 존재하지 않는 그래프
- 연결 그래프에서 신장트리는 1개가 아닌 다수일 수 있음
Spanning Tree의 특징
- DFS, BFS를 이용하여 그래프에서 신장 트리를 찾을 수 있다.
탐색 도중에 사용된 간선만 모으면 만들 수 있다.
- 하나의 그래프에는 많은 신장 트리가 존재할 수 있다.
- Spanning Tree는 트리의 특수한 형태이므로 모든 정점들이 연결되어 있어야 한다.
또한 사이클을 포함해서는 안된다.
MST
Spanning Tree 중에서 사용된 간선들의 가중치 합이 최소인 트리
- MST = Minimum Spanning Tree = 최소 신장 트리
- 각 간선의 가중치가 동일하지 않을 때 단순히 가장 적은 간선을 사용한다고 해서 최소 비용이 얻어지는 것은 아니다.
- MST는 간선에 가중치를 고려하여 최소 비용의 스패닝 트리를 선택하는 것을 말한다.
- 즉, 네트워크(가중치를 간선에 할당한 그래프)에 있는 모든 정점들을 가장 적은 수의 간선과 비용으로 연결하는 것이다.
MST의 특징
- 간선의 가중치 합이 최소여야 한다.
- n개의 정점을 가지는 그래프에 대해서 반드시 (n−1)개의 간선만을 사용해야 한다.
- 사이클이 포함되어서는 안된다.
MST 구현 방법
1. Kruskal MST 알고리즘
Greedy를 이용하여 네트워크(가중치를 간선에 할당한 그래프)의 모든 정점을 최소 비용으로 연결하는 최적 해답을 구하는 것
Kruskal 알고리즘의 동작
- 그래프의 간선들을 가중치의 오름차순으로 정렬한다.
- 정렬된 간선 리스트에서 순서대로 사이클을 형성하지 않는 간선을 선택한다.
- 즉, 가장 낮은 가중치를 먼저 선택한다.
- 사이클을 형성하는 간선을 제외한다.
- 해당 간선을 현재의 MST의 집합에 추가한다.
Kruskal 알고리즘의 구체적인 동작 과정
Kruskal 알고리즘을 이용하여 MST를 만드는 과정
- 간선 선택을 기반으로 하는 알고리즘
- 이전 단계에서 만들어진 신장 트리와는 상관없이 무조건 최소 간선만을 선택하는 방법
주의 !!!!
- 다음 간선을 이미 선택된 간선들의 집합에 추가할 때 사이클을 생성하는지 체크
새로운 간선이 이미 다른 경로에 의해 연결되어 있는 정점들을 연결할 때 사이클이 형성된다.
즉, 추가할 새로운 간선의 양끝 정점이 같은 집합에 속해 있으면 사이클이 형성된다.
- 사이클 생성 여부를 확인하는 방법
추가하고자 하는 간선의 양끝 정점이 같은 집합에 속해 있는지를 검사한다.
- union-find 알고리즘 사용 ..
Kruskal 알고리즘의 시간 복잡도
- union-find 알고리즘을 이용하면 Kruskal 알고리즘의 시간 복잡도는 간선들을 정렬하는 시간에 좌우된다.
- 즉, 간선e개를 퀵정렬과 같은 효율적인 알고리즘으로 정렬한다면
Kruskal 알고리즘의 시간 복잡도는 O(elog2e)이 된다.
- Prim 알고리즘의 시간 복잡도는 (O(n2)이므로
- 그래프 내에 적은 숫자의 간선만을 가지는 '희소 그래프(Sparse Graph)'의 경우 Kruskal 알고리즘이 적합하고
- 그래프에 간선이 많이 존재하는 '밀집 그래프(Dense Graph)'의 경우는 Prim 알고리즘이 적합하다.
Prim 알고리즘
시작 정점에서부터 출발하여 신장트리 집합을 단계적으로 확장해나가는 방법
Prim 알고리즘의 동작
- 시작 단계에서는 시작 정점만이 MST 집합에 포함된다.
- 앞 단계에서 만들어진 MST 집합에 인접한 정점들 중에서 최소 간선으로 연결된 정점을 선택하여 트리를 확장한다.
즉, 가장 낮은 가중치를 먼저 선택한다.
- 위의 과정을 트리가 (n−1)개의 간선을 가질 때까지 반복한다.
Prim 알고리즘의 구체적인 동작 과정
Prim 알고리즘을 이용하여 MST를 만드는 과정
- 정점 선택을 기반으로 하는 알고리즘
- 이전 단계에서 만들어진 신장 트리를 확장하는 방법
Prim 알고리즘의 시간 복잡도
- 주 반복문이 정점의 수를 n만큼 반복하고, 내부 반복문이 n번 반복
- Prim 알고리즘의 시간복잡도는 O(n2)이 된다.
참고링크
https://gmlwjd9405.github.io/2018/08/30/algorithm-prim-mst.html