앞선 글에서 최소 신장 트리를 구하는 크루스칼 알고리즘에 대해 배웠다.
하지만 또 한가지 최소 신장 트리를 구하는 알고리즘이 있다.
바로 프림 알고리즘이다.
오늘은 크루스칼과 프림 알고리즘을 비교하며 최소 신장 트리를 구하는 과정을 파헤쳐보자.
동작 원리
동작 원리
크루스칼은 간선 중심으로 만들어나고, 프림은 정점 중심으로 최소 신장 트리를 만들어나가는 차이점을 가지고 있다.
크루스칼 같은 경우는 매 간선을 선택할때마다, Find 연산으로 싸이클 생성 여부를 판단해야한다.
반면, 프림은 간선이 아닌 시작 정점과 가까운 정점들을 연결하면서 그래프를 구성하기 때문에 싸이클이 생길 수가 없다.
하지만 싸이클을 판단하는 Find 연산은 시간복잡도가 O(1)이기 때문에 큰 영향을 주지 않는다. 크루스칼 알고리즘의 시간복잡도에 가장 많은 영향을 미치는 것은 처음 간선을 오름차순 정렬해주는 부분이다.
크루스칼의 시간복잡도는 싸이클을 판단하는 O(1)과 간선을 오름차순 정렬하는 연산이 있다. 보통 내장 라이브러리 정렬의 시간 복잡도는 O(NlogN)이므로 만약 그래프의 간선의 갯수가 E라면, 크루스칼의 시간 복잡도는 O(ElogE)이다.
즉, 간선의 갯수에 영향을 받는다.
프림의 시간복잡도는 먼저 모든 정점을 탐색하는 O(V)과 정점마다 힙에서 최소 간선을 찾는 시간복잡도가 O(logV) 이므로 탐색에는 O(VlogV)의 시간이 소요된다. 그리고 각 정점에 연결된 간선을 힙에 추가하는 연산은 한 정점에 최대로 연결될 수 있는 간선 E에, 간선 하나당 최대 정점 N개가 힙에 들어가므로 정렬하는데에 logN이므로 시간복잡도가 O(ElogN)이다.
따라서 O(VlogV + ElogV)인데, 간선(E)는 정점(V)보다 크므로 VlogV는 무시될 수 있다. 따라서 최종 시간 복잡도는 O(ElogV)가 된다.
결론적으로 시간복잡도를 비교해보았을때,
이라는 결론이 나왔다.