최소비용신장트리-03

Updated:

강의 사이트
  • http://www.kocw.net/home/search/kemView.do?kemId=1148815

Prim의 알고리즘

1. Prim의 알고리즘

  • 임의의 노드를 출발노드로 선택
  • 출발 노드를 포함하는 트리를 점점 키워 감.
  • 매 단계에서 이미 트리에 포함된 노드와 포함되지 않은 노드를 연결하는 에지들 중 가장 가중치가 작은 에지를 선택

2. 왜 MST가 찾아지는가?

  • Prim의 알고리즘의 임의의 한 단계를 생각해보자.
  • A를 현재까지 알고리즘이 선택한 에지의 집합이라고 하고, A를 포함하는 MST가 존재한다고 가정하자.

3. 가중치가 최소인 에지 찾기

  • 위에 처럼 단순하게 알고리즘을 만든다면 최악의 경우 O(N^3)의 시간복잡도가 생김

  • 이유는 예를 들어 집합 A에 있는 노드의 개수가 전체 노드에서 절반이 들어 있다면 N / 2개가 있다.

  • 이때 A에 속하지 않는 노드들도 똑같이 N / 2개이다.

  • 그렇다면 최악의 경우 A에 속한 노드들이 A에 속하지 않는 노드들에 모두 엣지가 있다면 에지의 개수는

    (N/2)^2. 즉, O(N^2)가 된다.

  • 다시 말해서 하나의 최소 엣지를 찾기 위해서는 O(N^2)가 걸린다.

  • 그러면 MST를 만들기 위해서는 N-1개의 엣지가 필요한데 각 엣지를 찾기 위해서 O(N^2)가 걸리므로 N*O(N^2). 즉, O(N^3) 시간 복잡도라는 계산이 나온다.

  • 이는 MST를 만들기 위해서는 너무 비효율적이다.

3.1 향상된 prime

  • V(A): 이미 트리에 포함된 노드들
  • V(A)에 아직 속하지 않은 각 노드 v에 대해서 다음과 같은 값을 유지
    • key(v): 이미 VA에 속한 노드와 자신을 연결하는 에지들 중 가중치가 최소인 에지 (u,v)의 가중치
    • π(v): 그 에지 (u,v)의 끝점 u

  • 예를들어 노드 d의 경우 집합 V(A)에 연결된 끝 노드(즉, π(v))는 C이고 최소 가중치(즉, key(v))는 7이다.
  • key가 무한대인 것은 연결 점이 없다는 의미

  • 이렇게 되면 최소인 엣지를 찾는데 O(N) 정도 걸린다.
  • 이때 설명이 안된 것은 key값을 찾는 걸린 시간. 위의 그림에서 f가 연결되면 나머지 연결되지 않는 노드들에 대해서 key값을 갱신하면 된다.
  • 이때 걸리는 시간도 O(N) 걸린다.
  • 다시 돌아와서 f가 연결되었다면 노드 d를 보자. 이전 노드의 key값은 7이었는데 d는 f와의 엣지도 있다. 이때 기존의 key값과 d와 f의 엣지 가중치를 비교하여 둘 중 더 최소 가중치를 key값으로 셋팅한다.
  • 따라서 d와 f의 가중치는 14이므로 기존의 key값의 7보다 가중치가 크므로 그대로 둔다.
  • g의 경우 key값이 6이고 파이가 i였으나 f가 연결되고 나서 (g, f) 엣지와 비교하니 가중치가 더 좋으므로 key가 2로 파이가 f로 바뀐다.

3.2 시간복잡도

  • r은 출발점
  • 인접행렬로 하나 인접리스트로 하나 똑같이 O(N^2) 시간복잡도 걸림

4. key 값이 최소인 노드 찾기

  • 최소 우선순위 큐를 사용
  • V-V(A)에 속한 노드들을 저장
  • Extract-Min : key 값이 최소인 노드를 삭제하고 반환

4.1 MST 최소 우선순위 큐 Pseudo Code

  • 이진 힙(binary heap)을 사용하여 우선순위 큐를 구현한 경우
  • while loop:
    • n번의 Extract-Min 연산: O(nlogn) . 순수 extract-min은 logN인데 n번 extract해야하니까
    • m번의 Decrease-Key 연산: O(mlogn) 이것도 위와 같음 재 정렬하는데 M(N*N)번 걸림
  • 따라서 시간복잡도: O(nlogn + mlogn) = O(mlogn)
  • 우선순위 큐를 사용하지 않고 단순하게 구현할 경우: O(n2)
  • Fibonacci 힙을 사용하여 O(m+nlogn)에 구현 가능[Fredman-Tarjan 1984]