2023. 5. 8. 15:48ㆍAlgorithm
이번 글에서는, Minimum Spanning Tree에 대해 살펴볼 것이다.
MST (Minimum Spanning Tree)
Definition
Given $G$ is undirected weighted graph with positive weights (connected).
A spanning tree of $G$ is a subgraph $T$ that is both a free tree (connected and acyclic) and spanning (includes all the vertices).
(spanning tree는 span하고 acyclic이기에, V-1개의 edge를 가지고 있다.)
MST(Minimum Spanning Tree) of G is spanning tree which has minimum total weight.
Cut in graph is partition of its vertices into two (non empty) sets.
Crossing edge connects a vertex in one set with a vertex in other.
Cut property
Given any cut, the crossing edge of min weight is in the MST.
(임의의 cut으로 그래프를 분할했을 때, 최소 가중치를 가진 crossing edge(=$e$)는 MST에 속한다.)
Proof
"edge $e$(=minimum crossing edge)가 MST에 속하지 않는다"고 가정하자.
위 가정으로 인해, 다른 crossing edges(=$f$) 중 하나 이상이 MST에 있어야 한다. (because MST is spanning.)
- MST에 $e$를 추가시켜, cycle을 만든다. (becase MST has V edges.)
- cycle에 crossing edge(s) $f$가 무조건 포함되어 있다.
(A에서 B로 가는 경로는 2가지(1. $e$로 가는 경로, 2. $f$로 가는 경로)가 있다.
위 경로를 합치면$e$와 $f$를 포함하는 cycle이 만들어진다.) - $f$를 제거해, spanning tree를 재구성한다.
(cycle에 포함된 임의의 edge 하나를 제거하면,연결성과span이 유지되는 동시에,순환이 없어진다.) - 재구성된 spanning tree의 total weight가 MST보다 낮아지는 모순이 발생한다.
Cut property를 활용해 MST greedy algorithm을 설계할 수 있다.
Weighted graph representation
graph와 동일하다. 다만, edge의 가중치 값을 추가로 저장해야 한다.
- Graph: if v-w exists, then adj[v][w] = adj[w][v] = true
(or adj[v].append(w), adj[w].append(v)) - Weighted Graph: if v-w exists, then adj[v][w] = adj[w][v] = weight
(or adj[v].append((w, weight)), adj[w].append((v, weight)))
0. Greedy algorithm
- 모든 edge를 gray edge로 초기화한다.
- V-1개의 black edge를 가질 때까지, 다음 과정을 반복한다.
- gray crossing edge로만 구성된 임의의 cut을 찾고,
- minimum crossing edge를 black edge로 바꾼다.
Correctness of algorithm
black edge는 MST에 속한다. (by cut property)
V-1개 이하의 black edge가 있을 경우, gray crossing edge로만 구성된 cut이 존재한다.
(CC(=black edge로 연결된 vertex)를 기반으로 graph를 분할하면, 쉽게 gray crossing edge로만 구성된 cut을 찾을 수 있다.)
1. Kruskal's algorithm
- weight를 기준으로 edge를 정렬한다. (by PQ)
- 현재 남은 edge 중 minimum edge(=$e$)를 가져온다.
- 이때, $e$가 순환을 생성하지 않으면, 트리(=$T$)에 추가한다. (by Union-Find)
- $T$가 V-1개의 edge를 가질 때까지, 2 ~ 3번을 반복한다.
Correctness of algorithm
$e$(=v-w)는 다음 2가지 조건을 만족한다.
($e$ = 순환을 만들지 않은 minimum edge)
- $e$는 A(=v의 CC)와 B(=else)로 분할된 cut의 crossing edge다.
- $e$가 A와 B사이를 순환하지 않으면, "crossing edge가 트리(=$T$)에 없음"을 의미한다.
$e$가 현재 남은 edge 중 minimum edge이기에, minimum crossing edge다.
위 조건을 만족하기에, $e$는 임의의 cut의 minimum crossing edge다.
Performance
sort edge (build PQ) |
get min-edge (del edge) |
add edge (union) |
check cycle (connected) |
|
frequency | 1 | E | V | E |
time per op | $E \log E$ | $\log E$ | $\log^* E$ | $\log^* V$ |
2. Prim's algorithm
- source vertex를 트리(=$T$)에 추가한다.
- non-$T$ vertex에서 $T$ vertex로 가는 minimum edge(=$e$)를 $T$에 추가한다.
- $T$가 V-1개의 edge를 가질 때까지, 2번을 반복한다.
Correctness of algorithm
$e$(=v-w)는 다음 2가지 조건을 만족한다.
($e$ = tree vertex에서 non-tree vertex를 연결하는 minimum edge)
- $e$는 A(tree vertex)와 B(non-tree vertex)로 분할된 cut의 crossing edge다.
- $e$의 정의가 minimum crossing edge라는 것을 의미한다.
위 조건을 만족하기에, $e$는 임의의 cut의minimum crossing edge다.
non-$T$ vertex에서 $T$ vertex로 가는minimum edge 찾기
2.1. Lazy algorithm
PQ (key = edge, priority = weight of edge)
임의의 vertex v을 방문(visited[v] = True)한 후, v의 모든 edge를 push한다.
pop을 통해 minimum edge $e$(=v-w)를 가져온다.
- v와 w 모두 방문했으면(visited[v] = visited[w] = True), 다시 pop한다.
- 둘 중 하나만 방문했으면(if visited[v] = False and visited[w] = True),
- v를 방문(visited[v] = True)한 후, $e$(=v-w)를 $T$에 추가한다.
- 모든 v의 edge(v-x)를 찾은 후, visited[x] = False인 모든 edge를 push한다.
2.2. Eager algorithm
PQ (key = vertex(=v), priority = weight of shortest edge connected v to $T$)
임의의 vertex v를 방문(marked[v] = True)한 후, v 인접 정점의 priority를 update한다.
(처음에는, source vertex를 0, 그 외 정점은 ∞로 초기화한다.)
pop을 통해 min vertex(=v)를 가져온다.
- v를 방문(visited[v] = True)한 후, v의 priority(=weight)에 해당하는 $e$(=v-w)를 $T$에 추가한다.
- 모든 v의 edge(v-x)를 찾은 후, visited[x] = False인 모든 vertex x의 priority를 update한다.
(if v-x's weight < x's priority, then update x's priority by v-x's weight)
Performance
Time-Complexity | Space-Complexity | |
Lazy | $E\log E$ | $E$ |
Eager | $(E + V)\log V$ | $V$ |
MST application: clustering
MST algorithm을 활용하면, single-link clustering 문제를 쉽게 풀 수 있다.
Definition
k-clustering divide a set of objects classify into k coherent groups.
single link: distance between two clusters equals the distance between the two closest objects.
single-link clustering: given an integer k, find a k-clustering that maximizes the distance between two closest clusters.
Single-link clustering algorithm
- 각 클러스터가 하나의 객체만 포함하게 V개의 클러스터를 만든다.
- 서로 다른 클러스터에 속한 객체 쌍 중 가장 가까운 객체 쌍을 찾아, 두 클러스터를 합병한다. (using MST)
- 클러스터 개수가 k개가 될 때까지 반복한다.
'Algorithm' 카테고리의 다른 글
[Algorithm Part 2] 5. Mincut/Maxflow (0) | 2023.05.23 |
---|---|
[Algorithm Part 2] 4. Shortest Paths (0) | 2023.05.22 |
[Algorithm Part 2] 2. Directed Graph (0) | 2023.05.04 |
[Algorithm Part 2] 1. Undirected Graph (0) | 2023.05.01 |
[Algorithm Part 1] 10. Hash Table (0) | 2023.04.17 |