07. greedy algorithm, prim algorithm [2 2주차]

Posted by aliontory on January 15, 2024 · 38 mins read

7. Greedy Algorithm, Prim Algorithm [2-2주차]

2024 1 9일 화요일

오후 11:09

<Greedy Algorithm 개요>

답을 찾기 위해 선택을 반복하는 알고리즘들 중 비교적 간단한(?) 방법으로 선택하고, 선택한 후 바꾸지 않는 알고리즘

 

ex) selection sort

선택 정렬도 직관적인 그리디 알고리즘. 뒤에서 가장 작은 것을 골라 앞쪽으로 보냄. 앞쪽은 이미 선택된 것들. 앞쪽의 원소들을 바뀌지 않음.

 

 

<Minimun Spanning Tree>

10

위와 같은 multi weight(가중치) graph가 있다.

위 그래프는 연결 그래프이다.

  • 연결 그래프 : 모든 정점의 쌍이 경로로 연결된 그래프

 

모든 정점을 트리 형태로(사이클이 없도록) 연결하는 간선들의 집합을 가중치가 최소가 되도록 찾아내어라.

-> 최소 신장 트리 문제

 

사이클이 안 되도록 하는 이유 : 사이클에서 간선 하나를 끊어도 사이클의 모든 정점이 연결된 상태는 유지된다. 따라서 사이클이 형성되면 불필요하게 가중치 합이 늘어나게 된다.

 

5개의 정점을 가중치가 최소가 되도록 연결하려면, 4개의 간선이 필요하다.

 

 

<Prim Algorithm>

최소 신장 트리를 찾아내는 알고리즘

 

1.     하나의 노드를 가진 트리로 시작(그래프의 아무 노드나 선택한다는 뜻)

2.     트리에 인접한 간선들 중 가장 작은 가중치를 가진 간선을 추가

a.     , 사이클을 만들지 않아야 함

3.     Spanning Tree가 될 때 까지 반복

 

 

<Prim Algorithm의 증명>

증명 과정 주의사항 : 정답이 여러 개일 수 있음.

 

간선들의 집합 Tmst임의의 정답이라고 하자.

Prim이 만들어 가는 답 TTTmst를 유지한다는 것을 증명해 보자.

 

base : T의 원소 개수 |T| = 0 일 때, TTmst 이다.

step : Tmst가 될 수 있는 하나의 특수한 정답Tmst0라 하자.

|T| = k일 때 TTmst0 라 한다. Prim 알고리즘이 한번의 선택을 진행하여 T' = T{(u, v)}를 만든다.

  • case1) T'Tmst0이면 T'Tmst 를 만족한다.
  • case2) T' Tmst0의 부분집합이 아니라고 하자. , 간선 (u, v) Tmst0에 없다. "Tmst0에서 u로부터 v로의 경로 p" (u, v)를 추가하면 사이클이 된다.

 

이때, T가 이루는 트리의 노드에 붙어 있으면서, T에 포함되지는 않는 간선 (x, y)가 경로 p에 적어도 하나 존재한다. Prim 알고리즘의 2.a 에 따르면, u는 트리T에 포함되고, v는 포함되지 않기 때문이다 (또는 v만 포함되고 u는 포함되지 않음).

트리의 성질에 따르면, u에서 v로의 경로는 p 하나뿐이므로, (x, y)를 삭제하면 Tmst0는 두 개로 나뉜다. 여기에 (u, v)를 추가하면 나뉜 요소가 다시 연결되고, 새로운 신장 트리 Tst0가 만들어진다.

 

Prim 알고리즘을 사용해 (u, v)를 선택하였으므로

  • w(u, v) <= w(x, y)

가 성립한다. 따라서

  • w(Tst0) = w(Tmst0) - w(x, y) + w(u, v)
  • w(Tst0) <= w(Tmst0)

Tmst0는 최소 신장 트리이므로 w(Tst0) = w(Tmst0).

Tst0도 최소 신장 트리이다.

T'Tst0 이므로, |T| = k+1일 때 TTmst가 성립한다.

 

따라서 Prim 알고리즘은 TTmst를 유지하고, 최소 신장 트리를 찾아내게 된다.

 

 

<Prim Algorithm의 구현과 성능>

Algorithm Prim(G, T)

T <- Empty Set  // 트리에 들어간 간선들의 집합

U <- {1}  // 트리에 들어간 노드들의 집합

while U!=V do

U의 한 노드와 V-U의 한 노드를 잇는 간선들 중 가중치가 가장 작은 것 (u, v)를 찾는다

(u, v) T에 추가

v U에 추가

 

  • 성능 분석

노드가 V, 간선이 E개일 때

while 문은 V-1번 반복된다.

 

가중치가 가장 작은 간선 찾기 : Priority Queue 이용

힙에 원소를 추가하고 제거하는 연산은 O(logn)시간이 걸린다. (n은 힙에 있는 원소의 개수)

모든 간선이 각각 2번씩 priority queue에 들어간다.

따라서 힙의 원소 개수는 최대 2E 이며, 최대 2E개의 원소가 힙에 들어갔다 나오게 된다.

-> priority queue를 통한 간선 선택 O(E logE) 시간이 걸린다.

 

간선과 노드를 집합에 추가하는 연산은 O(1) 시간이 걸린다.

 

시간복잡도는

O(E logE) + (V-1) * O(1) = O(E logE + V)

 

V-1 <= E <= VC2 = kV2 , log(V-1) <= logE <= 2logV + logk

이므로

O(E logE + V) = O(E logE) = O(E logV)

이다.

 

OneNote에서 작성되었습니다.