Algorithm

크러스컬(Kruskal) 알고리즘

soba_memil 2020. 7. 2. 18:03

크러스컬(Kruskal) 알고리즘이란?

 

크러스컬 알고리즘은 최소 비용 신장 그래프를 찾는 알고리즘 입니다.

변의 개수를 E, 꼭지점의 개수를 V라고 한다면 크러스컬 알고리즘은 O(ElogV)의 시간 복잡도를 갖습니다.

 

크러스컬의 MST(욕심쟁이 방법) 알고리즘 간략 코드 : 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
edge_set kruskal_MST(edge_set E, int n) {
    sort(E); // 간선 정렬
    edge_set MST_E = { };
    for (i=0; i<n; i++) init_set(i); // n개의 집합(트리)을 생성
    while(MST_E의 간선 수 < n - 1) {
        (u, v) = E의 최소 가중치 간선;
        E = E - {(u, v)};
        if(find(u) != find(v)) // u와 v가 다른 집합(트리) 원소
        {
            MST_E = MST_E ∪ {(u, v)}; // 간선 추가
            union(u, v); // 두 집합(트리)을 합병
        }
    }
    return MST_E;
}
 

 

 

 

 

- 예제 -

 

입력으로 받을 그래프 : 

가중치 그래프

 

 

실행 예 :

실행 예

 

구조 : 

크러스컬 알고리즘을 구현하기 위해서는 크게 세 가지 중요한 부분이 있습니다.

첫 번째로 최초에 정점 하나를 원소로 하는 집합을 만드는 init set 연산

두 번째로 임의의 정점이 어느 집합의 원소인지를 알아내는 find 연산

마지막으로 두 집합을 하나로 합치는 union 연산

 

이 알고리즘에서는 2번 줄에 간선을 정렬하는 부분이 전체 알고리즘의 복잡도를 좌우하게 되는데, 주어진 그래프의 정점의 수가 n이고 간선의 수가 e이라고 할 때, 정렬 방법 중 성능이 우수한 퀵정렬, 합병정렬 등을 사용한다면 O(e loge)의 시간 복잡도를 갖습니다.

위쪽에서 변의 개수를 E, 꼭지점의 개수를 V라고 한다면 크러스컬 알고리즘은 O(ElogV)의 시간 복잡도를 갖는다고 하였는데, 그 이유는 간선의 수 e는 최대 O(n^2) 이므로 O(e loge) = O(e logn^2) = O(2e logn) = O(e logn) 가 성립하므로 둘 중 어떠한 복잡도로 말해도 틀린 것이 아니기 때문입니다.

 

 

크러스컬 알고리즘에 대한 실제 구현 예제는 아래 링크에서 볼 수 있습니다.

2021.04.09 - [알고리즘] - 크러스컬 알고리즘 구현 1 (붕괴법칙을 적용하지 않은 방법)

 

크러스컬 알고리즘 구현 1 (붕괴법칙을 적용하지 않은 방법)

프로그램 개요 : C 언어를 사용한 크러스컬 알고리즘(Kruskal Algorithm) 구현. 붕괴법칙을 적용하지 않은 크러스컬 알고리즘. 붕괴법칙을 적용한 크러스컬 알고리즘 입력 파일 : 프로그램 실행 결과 :

sobamemil.tistory.com