Kruskal's Algorithm

그래프 중에서 MST (Minumum Spannig Tree)를 찾는 알고리즘중에 하나이다.

Union-Find알고리즘을 이용하며, 간선 (edge)의 가중치(weight)를 오름차순으로 정렬하여 가중치가 사이클이 생기지 않는 낮은 간선을 먼저 선택하는 방법.

사이클의 여부를 확인할때 union-find 알고리즘을 이용하여 찾게 된다.

union find 알고리즘 설명 보기

특징

  • 탐욕적인 방법( Greedy Method )

  • 간선 선택 기반 알고리즘

  • 간선 선택 단계에서 사이클을 포함하지 않고 최소 비용 간선을 선택

  • 부분 트리집합을 병합하면서 하나의 트리로 확장

  • 희소그래프에 적합 ( V > E )

  • 정렬 속도가 시간복잡도에 영향

Pesudo Code

algorithm Kruskal(G) is
    T := ∅
    for each v ∈ G.V do
        MAKE-SET(v)
    for each (u, v) in G.E ordered by weight(u, v), increasing do
        if FIND-SET(u) ≠ FIND-SET(v) then
           T := T ∪ {(u, v)}
           UNION(FIND-SET(u), FIND-SET(v))
    return T

구현

기본적으로 사이클이 생성되는지 검사하기 위해 union-find알고리즘이 쓰이며, kruskal 알고리즘의 시간복잡도는 edge를 정렬하는 속도와 밀접한 연관이 있다.

시간복잡도

make_set 하는데 O(V), 정렬하는데 걸리는 시간은 T (간선 E를 가지고 정렬 => O(E), O(1), O(ElgE), O(E^2) 등등 이 될 수있다.)

Union하기 위해 집합이 속하는지 검사하는 Find가 O(E)번 일어나며, Find 에 O(lgV)번 일어난다. 따라서 Union을 끝내는데 O(ElgV)만큼 걸린다.

때문에 O(ElgV + T)만큼 걸리게 된다.

구현하는 데 있어, 우선 본인의 힘으로 작성해보고 도저히 안되겠을 때 아래의 코드를 보자.

구현 코드

구현 방법은 사람마다 정말 다양하니 참고만 하도록 하자

소스코드 c++ ( 접기 / 펼치기 )

Last updated