2020-1ν•™κΈ°, λŒ€ν•™μ—μ„œ β€˜μ•Œκ³ λ¦¬μ¦˜β€™ μˆ˜μ—…μ„ λ“£κ³  κ³΅λΆ€ν•œ λ°”λ₯Ό μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€. 지적은 μ–Έμ œλ‚˜ ν™˜μ˜μž…λ‹ˆλ‹€ :)

13 minute read

2020-1ν•™κΈ°, λŒ€ν•™μ—μ„œ β€˜μ•Œκ³ λ¦¬μ¦˜β€™ μˆ˜μ—…μ„ λ“£κ³  κ³΅λΆ€ν•œ λ°”λ₯Ό μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€. 지적은 μ–Έμ œλ‚˜ ν™˜μ˜μž…λ‹ˆλ‹€ :)

Kruskal’s Algorithm & Prim’s Algorithmμ—μ„œ μ΄μ–΄μ§€λŠ” ν¬μŠ€νŠΈμž…λ‹ˆλ‹€.


Disjoint Set

이번 ν¬μŠ€νŠΈμ—μ„œλŠ” <Disjoint Set>μ΄λΌλŠ” μžλ£Œκ΅¬μ‘°μ— λŒ€ν•΄ μ‚΄νŽ΄λ³Έλ‹€. μˆ˜ν•™μ˜ Set을 자료ꡬ쑰둜 κ΅¬ν˜„ν•œ 것이라고 μƒκ°ν•˜λ©΄ λœλ‹€.

λ¨Όμ € <disjoint set>의 ꡬ체적이 κ΅¬ν˜„ 없이 κΈ°λ³Έ 연산듀을 μ‚΄νŽ΄λ³΄μž.

  • $\text{makeset}(x)$: create a new set containing $x$.
  • $\text{find}(x)$: return the root node of the set containing $x$.
  • $\text{union}(x, y)$: form a union of two sets containing $x$ and $y$.

ν”νžˆ μ§‘ν•©μ˜ κΈ°λ³Έ 연산이라고 ν•˜λ©΄ 집합 μ‚¬μ΄μ˜ Intersection, Union, Differenceλ₯Ό μƒκ°ν•˜κΈ° 마련인데, μ œμ‹œλœ κΈ°λ³Έ 연산듀은 λͺ¨λ‘ λ…Έλ“œ $x$λ₯Ό 인자둜 λ°›λŠ” 것을 λ³Ό 수 μžˆλ‹€.

그리고 λ…Έλ“œ $x$에 λŒ€ν•΄μ„œλŠ”

  • $\pi(x)$: pointer to its parent
  • $\text{rank}(x)$: height of the subtree hanging from $x$ ($x$λ₯Ό 루트둜 κ°–λŠ” subtree의 높이)

사싀 $\pi(x)$와 $\text{rank}(x)$λŠ” <disjoint set>이 Tree ν˜•νƒœλ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€λŠ” 것을 μ•Œμ•„μ•Ό μ œλŒ€λ‘œ 이해할 수 μžˆλ‹€.

<disjoint set>의 κΈ°λ³Έ μ—°μ‚°μœΌλ‘œ μ–΄λ–»κ²Œ Tree ν˜•νƒœμ˜ <disjoin set>이 λ§Œλ“€μ–΄μ§€λŠ”μ§€ μ‚΄νŽ΄λ³΄μž. πŸ‘€

λ¨Όμ € $\text{makeset}(x)$λŠ” 루트 λ…Έλ“œλ§Œ μžˆλŠ” 트리λ₯Ό μƒμ„±ν•œλ‹€. 그리고 $\text{union}(x, y)$ 연산은 각 λ…Έλ“œκ°€ ν¬ν•¨λœ 두 개의 트리λ₯Ό ν•˜λ‚˜μ˜ 트리둜 λ³‘ν•©ν•œλ‹€. μ΄λ•Œ ν•˜λ‚˜μ˜ 트리λ₯Ό λ‹€λ₯Έ 트리의 subtree둜 λ³‘ν•©λœλ‹€. ꡬ체적으둜 μ–΄λ–»κ²Œ $\text{union}(x, y)$둜 트리λ₯Ό λ³‘ν•©ν•˜λŠ”μ§€λŠ” μ½”λ“œλ₯Ό 보며 μ΄ν•΄ν•΄λ³΄μž.

Algorithm $\text{makeset}(x)$

$\pi(x) \leftarrow x$

$\text{rank}(x) \leftarrow 0$

λ¨Όμ € $\text{makeset}(x)$은 루트 λ…Έλ“œλ§Œ μžˆλŠ” 트리λ₯Ό λ§Œλ“ λ‹€. 루트 λ…Έλ“œλŠ” λΆ€λͺ¨κ°€ 자기 μžμ‹ μ„ 가리킀기 λ•Œλ¬Έμ— $\pi(x)$λŠ” μžκΈ°μžμ‹ μΈ $x$이닀.

Algorithm $\text{find}(x)$

while $x \ne \pi(x)$
Β Β do $x \leftarrow \pi(x)$

return x

λ…Έλ“œ $x$의 루트 λ…Έλ“œλ₯Ό λ°˜ν™˜ν•˜λŠ” $\text{find}(x)$λŠ” $\pi(x)$λ₯Ό μˆœνšŒν•˜λ©° μ‰½κ²Œ ꡬ할 수 μžˆλ‹€.

Algorithm $\text{union}(x, y)$

$r_x \leftarrow \text{find}(x)$
$r_y \leftarrow \text{find}(y)$

if $r_x = r_y$ // already in same set
Β Β them return

if $\text{rank}(r_x) > \text{rank}(r_y)$
Β Β then $\pi(r_y) \leftarrow r_x$ // attach $r_y$ to $r_x$
else if $\text{rank}(r_x) < \text{rank}(r_y)$
Β Β $\pi(r_y) \leftarrow r_x$ // attach $r_x$ to $r_y$
else
Β Β $\pi(r_y) \leftarrow r_x$
Β Β $\text{rank}(r_y) \leftarrow \text{rank}(r_y) + 1$

즉, 두 λ…Έλ“œ $x$, $y$의 루트 λ…Έλ“œλ₯Ό $\text{find}()$둜 찾은 ν›„, 두 set의 크기λ₯Ό $\text{rank}(r_x)$, $\text{rank}(r_y)$둜 μ–»μ–΄ $\text{rank}$κ°€ 큰 집합에 μž‘μ€ 집합을 λΆ™μ΄λŠ” λ°©μ‹μœΌλ‘œ $\text{union}()$을 μˆ˜ν–‰ν•œλ‹€.

<disjoint set>의 μ£Όμš”ν•œ 연산인 $\text{union}$κ³Ό $\text{find}$μ—μ„œ λ°œκ²¬λ˜λŠ” μ„±μ§ˆμ„ λ‚˜μ—΄ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

  • For any $x$, $\text{rank}(x) \le \text{rank}(\pi(x))$
  • If $x$ is not a root, $\text{rank}(x)$ will nenver change again.
    • Rank changes only for roots. A non-root node never becomes a root.
  • Any root node of rank $k$ has at least $2^k$ nodes in its tree.
  • If there are $n$ elements overall, there can be at most $n/2^k$ nodes of rank $k$.
    • The maximum rank is $\log n$, so the tree height $\le \log n$.

이 μ€‘μ—μ„œ 3번째 λ¬Έμž₯을 증λͺ…ν•΄λ³΄μž.

[Proof by Induction]

  • (Base) It holds for $k=0$
  • Assume that the claim holds for $k-1$.
  • A node $x$ of rank $k$ is created only by mergining two roots of rank $k-1$, each subtree consisting of $\ge 2^{k-1}$ nodes. Thus, $x$ has $\ge 2^k$ nodes in its subtree.

$\blacksquare$

λ§ˆμ§€λ§‰ 4번째 λ¬Έμž₯은 두 λ…Έλ“œκ°€ 동일 집합에 μ†ν•˜λŠ”μ§€λ₯Ό νŒλ‹¨ν•˜λŠ”λ° $O(\log n)$의 λΉ„μš©μ΄ ν•„μš”ν•¨μ„ μ˜λ―Έν•œλ‹€. κ·Έλž˜μ„œ Kruskal Algorithmμ—μ„œλŠ” MSTλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ union-find둜 동일 집합에 μ†ν•˜λŠ”μ§€ 계속 μ²΄ν¬ν•˜κ²Œ λ˜λŠ”λ°, 이 μž‘μ—…μ— $O(E \log V)$ 만큼의 λΉ„μš©μ΄ λ°œμƒν•œλ‹€.


Path Compression

λ†€λžκ²Œλ„ <disjoint set>은 Path Compressionμ΄λΌλŠ” μž‘μ—…μ„ 병행해주면 훨씬 적은 λΉ„μš©μœΌλ‘œ union-find μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€! 😲 Path Compression은 <disjoint set>의 트리의 높이λ₯Ό 짧게 μœ μ§€ν•΄μ£ΌλŠ” 방법이닀.

Path Compression은 $\text{find}(x)$ 연산을 μˆ˜ν–‰ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€!

Algorithm $\text{find}(x)$

if $x \ne \pi(x)$
Β Β then $\pi(x) \leftarrow \text{find}(\pi(x))$

return $\pi(x)$

$\text{find}(x)$ ν•¨μˆ˜κ°€ μž¬κ·€ν•¨μˆ˜μ˜ 꼴이 λ˜μ–΄μ„œ ν—·κ°ˆλ¦΄ μˆ˜λ„ μžˆμ§€λ§Œ, 핡심은 λ…Έλ“œ $x$κ°€ 루트 λ…Έλ“œλ„λ‘ λ§Œλ“ λ‹€λŠ” 것이닀. $\text{find}(x)$κ°€ 항상 루트 λ…Έλ“œλ₯Ό λ°˜ν™˜ν•œλ‹€λŠ” 사싀을 잘 ν•΄μ„ν•˜λ©΄ λœλ‹€.

그림으둜 보면 μ•„λž˜μ™€ κ°™λ‹€.

Time Complexity

Path Compression을 λ„μž…ν•˜λ©΄μ„œ 더이상 $\text{find}$의 λΉ„μš©μ€ $O(\log n)$보닀 μž‘μ•„μ§€κ²Œ λ˜μ—ˆλ‹€. κ·Έλ ‡λ‹΄ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό μ–΄λ–»κ²Œ ꡬ해야 ν• κΉŒ?

잠깐! πŸ– μ‹œκ°„ λ³΅μž‘λ„λ₯Ό μœ λ„ν•˜κΈ° 전에 <interval>μ΄λΌλŠ” κ°œλ…μ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ³  κ°€μž. interval $I_k$λŠ” μ•„λž˜μ™€ 같이 μ •μ˜ν•œλ‹€.

\[I_k = \left\{ k+1, k+2, ..., 2^k \right\}\]

κ·Έλž˜μ„œ 값을 λ‚˜μ—΄ν•΄λ³΄λ©΄,

\[\begin{aligned} I_0 &= \left\{ 1 \right\} \\ I_1 &= \left\{ 2 \right\} \\ I_2 &= \left\{ 3, 4 \right\} \\ I_4 &= \left\{ 5, 6, ..., 15, 16 \right\} \\ I_{16} &= \left\{ 17, 18, ..., 2^{16} \right\} \\ &... \\ I_i &= \left\{i+1, ..., 2^i\right\}\\ I_{2^i} &= \left\{ ... \right\} \end{aligned}\]

자! λ‹€μ‹œ disjoint set의 tree둜 λŒμ•„μ™€λ³΄μž. $n$개 λ…Έλ“œλ₯Ό κ°–λŠ” disjoint set의 tree의 $\text{rank}$λŠ” μ•„λž˜μ˜ λ²”μœ„λ₯Ό κ°–λŠ”λ‹€.

\[0 \le \text{rank}(x) \le \log n\]

μš°λ¦¬λŠ” $\text{rank}(x)$λ₯Ό μ•žμ—μ„œ κ΅¬ν•œ <interval>둜 λΆ„λ°°ν•  것이닀. μ΄λ•Œ $\text{rank}(x)$κ°€ μ–΄λŠ <interval>에 μ†ν•˜λŠ”μ§€λŠ” μ•„λž˜μ˜ ν•¨μˆ˜λ‘œ μ‰½κ²Œ μ•Œ 수 μžˆλ‹€.

\[\log^{*} n\]

이 $\log^{*}$ ν•¨μˆ˜λŠ” β€œnumber of successive $\log$ operation”을 κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜λ‘œ μ •μˆ˜ $n$에 $\log$을 λͺ‡λ²ˆ μ·¨ν•΄μ•Ό $\le 1$이 λ˜λŠ”μ§€λ₯Ό κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜λ‹€. μ ν™”μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

\[\log^{*} n = \begin{cases} 0 & \text{for} \; n \le 1 \\ 1 + \log^{*}(\log_2 n) & \text{for} \; n > 1 \end{cases}\]

$16 = 2^{2^{2}}$λ₯Ό 예둜 λ“€μžλ©΄,

\[\log^{*} 2^{2^{2}} = 1 + \log^{*} 2^{2} = 2 + \log^{*} 2 = 3\]

이 λœλ‹€. 이것은 곧 $16$이 3번째 <interval>인 $I_4$에 μ†ν•œλ‹€λŠ” 것을 λ§ν•œλ‹€.

<interval>μ΄λ‹ˆ $\log^{*}$ ν•¨μˆ˜λ‹ˆ 와닿지 μ•Šμ„ 수 μžˆλ‹€. 이 λ¬Έλ‹¨μ—μ„œ 얻을 것은 $\log^{*}$ ν•¨μˆ˜λ‘œ $\text{rank}(x)$κ°€ λͺ‡ 번째 <interval>에 μ†ν•˜λŠ”μ§€ μ•Œ 수 μžˆλ‹€λŠ” 것과 이λ₯Ό ν™œμš©ν•˜λ©΄ 두 λ…Έλ“œ $x$, $y$의 $\text{rank}$ 값이 μ„œλ‘œ 같은 <interval>에 μ†ν•˜λŠ”μ§€ μ•„λ‹Œμ§€λ₯Ό $\log^{*}$ ν•¨μˆ˜λ‘œ μ‰½κ²Œ μ•Œ 수 μžˆλ‹€λŠ” κ²ƒλ§Œ 잘 μ΄ν•΄ν•˜λ©΄ λœλ‹€ πŸ‘


μš°λ¦¬λŠ” $\text{find}$ μ—°μ‚°κ³Ό $\text{union}$ 연산이 μ„žμ—¬μžˆλŠ” 일련의 연산을 μ‚΄νŽ΄λ³Έλ‹€κ³  ν•˜μž. 일단 μ²˜μŒμ—λŠ” empty treeμ—μ„œλΆ€ν„° μ‹œμž‘ν•œλ‹€. 일련의 μ—°μ‚°μ—λŠ” $\text{find}$ μ—°μ‚°κ³Ό $\text{union}$ 연산이 μ„žμ—¬μžˆμ§€λ§Œ μš°λ¦¬λŠ” $\text{find}$ 연산을 $m$번 μ‹€ν–‰ν•œλ‹€κ³  생각할 것이닀. μ™œλƒλ©΄ $\text{union}$ 연산도 결ꡭ은 $\text{find}$λ₯Ό μ“°κΈ° λ•Œλ¬Έμ΄λ‹€.

μ–΄λ–€ λ…Έλ“œ $u$μ—μ„œ $\text{find}$λ₯Ό 톡해 루트 λ…Έλ“œκΉŒμ§€ λ„λ‹¬ν•˜λŠ” 과정을 μƒκ°ν•΄λ³΄μž. λΆ€λͺ¨ λ…Έλ“œλ₯Ό 거슬러 올라갈 λ•Œλ§ˆλ‹€ μš°λ¦¬λŠ” λ‹€μŒμ˜ 두 가지 경우λ₯Ό λ§ˆμ£Όν•œλ‹€.

  1. $x$ and $\pi(x)$ belong to the different interval.
  2. $x$ and $\pi(x)$ belong to the same interval.

μš°λ¦¬λŠ” 각 κ²½μš°μ— λŒ€ν•΄ κ±Έλ¦¬λŠ” λΉ„μš©μ„ $T_1$, $T_2$둜 적고, $\text{find}$둜 루트 λ…Έλ“œμ— λ„λ‹¬ν•˜λŠ” κ³Όμ •μ˜ 총 λΉ„μš© $T$λ₯Ό μœ λ„ν•  것이닀.

\[T = T_1 + T_2 = \sum (1) + \sum (2)\]

1. $x$ and $\pi(x)$ belong to the different interval

$n$의 λ…Έλ“œλ₯Ό 가진 Treeκ°€ μžˆλ‹€κ³  μƒκ°ν•΄λ³΄μž. μ΅œλŒ€ $\text{rank}$κ°€ $\log n$이기 λ•Œλ¬Έμ— interval의 κ°―μˆ˜λŠ” $\log^{*} n$이닀. κ·Έλž˜μ„œ ν•œλ²ˆμ˜ $\text{find}$μ—μ„œ interval이 λ°”λ€ŒλŠ” νšŸμˆ˜λ„ μ΅œλŒ€ $\log^{*} n$번 만큼 μΌμ–΄λ‚œλ‹€. μ²˜μŒμ— $\text{find}$ 연산을 $m$번 μ‹€ν–‰ν•œλ‹€κ³  ν–ˆμœΌλ―€λ‘œ λΉ„μš© $T_1$은

\[T_1 = O(m \cdot \log^{*} n)\]

이닀.

2. $x$ and $\pi(x)$ belong to the same interval

같은 interval에 μ†ν•˜λŠ” $\text{rank}$λŠ” λͺ¨λ‘ 같은 $\log^{*}$ 값을 가진닀. 그럼 $n$개 λ…Έλ“œλ₯Ό 가진 treeμ—μ„œ 같은 interval에 μ†ν•˜κ²Œ λ˜λŠ” λ…Έλ“œμ˜ κ°―μˆ˜λŠ” 총 λͺ‡ κ°œλ‚˜ 될까?

<disjoint set>의 μžλ£Œν˜•μ˜ μ„±μ§ˆ 쀑 λ§ˆμ§€λ§‰ 4번재 μ„±μ§ˆμ—μ„œ $\text{rank}$κ°€ $k$인 λ…Έλ“œκ°€ μ΅œλŒ€ $n/2^{k}$개 만큼 μ‘΄μž¬ν•œλ‹€λŠ” 것을 μ•ˆλ‹€. κ·Έλž˜μ„œ ν•œ interval μ•ˆμ— μ†ν•˜λŠ” λ…Έλ“œμ˜ 총 κ°―μˆ˜λŠ”

\[\frac{n}{2^{k+1}} + \frac{n}{2^{k+2}} + \cdots\]

만큼 μ‘΄μž¬ν•  것이닀. 그리고 이것은

\[\begin{aligned} &\frac{n}{2^{k+1}} + \frac{n}{2^{k+2}} + \cdots \\ &= n \cdot \left( \frac{1}{2^{k+1}} + \frac{1}{2^{k+2}} + \cdots \right) \\ &= \frac{n}{2^{k+1}} \cdot \left( 1 + \frac{1}{2} + \frac{1}{2^2} + \cdots\right) \\ &= \frac{n}{2^{k+1}} \cdot 2 = \frac{n}{2^k} \end{aligned}\]

κ°€ λœλ‹€. 즉, interval $I_k$에 λŒ€ν•΄ $\left| I_k \right| = n/2^k$λΌλŠ” 말이닀.

그럼 μ–΄λ–€ λ…Έλ“œ $u$μ—μ„œ $\text{find}$λ₯Ό μ‹œμž‘ν•΄μ„œ λ‹€λ₯Έ interval에 μ†ν•˜κ²Œ 될 λ•ŒκΉŒμ§€ 총 λͺ‡ 번의 $\text{find}$ ν•¨μˆ˜ 호좜이 ν•„μš”ν• κΉŒ? $\text{find}$ 호좜 1νšŒλ‹Ή ν•˜λ‚˜μ”© $\text{rank}$κ°€ ν•˜λ‚˜μ”© 쀄어간닀고 μƒκ°ν•˜λ©΄ $\le 2^{k}$번의 $\text{find}$ 호좜둜 λ‹€λ₯Έ interval에 μ†ν•˜λŠ” λ…Έλ“œλ₯Ό λ§Œλ‚˜κ²Œ λœλ‹€.

κ·Έλž˜μ„œ interval $I_k$에 μ†ν•˜λŠ” λͺ¨λ“  λ…Έλ“œλ“€μ— λŒ€ν•΄ 이것듀을 λ‹€λ₯Έ interval에 μ†ν•˜κ²Œ ν•˜λ €λ©΄ 총 $(\le 2^{k}) \times n/2^k = (\le n)$번 만큼의 $\text{find}$ 호좜이 ν•„μš”ν•˜λ‹€.

이것은 ν•˜λ‚˜μ˜ interval에 λŒ€ν•΄ ν•„μš” ν•œ $\text{find}$ 호좜의 총 νšŸμˆ˜μ΄λ‹€. Tree에 $\log^{*} n$ 만큼의 interval이 μžˆμœΌλ―€λ‘œ $(\le n) \times \log^{*} n$ 만큼의 $\text{find}$ 호좜이 ν•„μš”ν•˜λ‹€.

\[T_2 = O(n \cdot \log^{*} n)\]

이제 $T_1$, $T_2$의 λΉ„μš©μ„ λ”ν•΄μ„œ 일련의 $\text{find}$, $\text{union}$ 연산에 λ“œλŠ” λΉ„μš©μ„ κ΅¬ν•΄λ³΄μž. 전체 연산에 ν•„μš”ν•œ 총 λΉ„μš©μ€

\[O(m \cdot \log^{*} n) + O(n \cdot \log^{*} n) = O(m \cdot \log^{*} n)\]

이닀. μ—¬κΈ°μ„œ μš°λ¦¬λŠ” μ—°μ‚°μ˜ 총 λΉ„μš©μ— μ—°μ‚°μ˜ 횟수 $m$을 λ‚˜λˆ„μ–΄ amortized costλ₯Ό μœ λ„ν•  것이닀. λ”°λΌμ„œ $\text{find}$ μ—°μ‚°μ˜ amortize costλŠ”

\[O(m \cdot \log^{*} n) / m = O(\log^{*} n)\]

이닀!

μ΅œμ’…μ μœΌλ‘œ ꡬ해진 $\text{find}(x)$의 λΉ„μš©μΈ $O(\log^{*} n)$λŠ” 정말 μž‘μ€ λΉ„μš©μ΄λ‹€. $n = 2^{16}$일 λ•Œλ„ 4밖에 μ•ˆ 되기 λ•Œλ¬Έμ— 사싀상 μƒμˆ˜ λΉ„μš©μ΄λΌκ³  보면 λœλ‹€.


μ΄κ²ƒμœΌλ‘œ <disjoint set> μžλ£Œκ΅¬μ‘°μ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄μ•˜λ‹€. disjoint set을 톡해 κ·Έλž˜ν”„μ—μ„œ 사이클이 μ‘΄μž¬ν•˜λŠ”μ§€ 확인할 수 있기 λ•Œλ¬Έμ— MST 외에도 μΆ©λΆ„νžˆ ν™œμš©ν•  수 μžˆλ‹€.

λ‹€λ₯Έ ν¬μŠ€νŠΈμ—μ„œ <Heap> 자료ꡬ쑰의 κ΅¬ν˜„μ— λŒ€ν•΄ κΈ°μˆ ν•œ Implementations of Heap ν¬μŠ€νŠΈλ„ μžˆμœΌλ‹ˆ μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œν•΄κ²°μ— μ“°λŠ” μžλ£Œκ΅¬μ‘°κ°€ 더 κΆκΈˆν•˜λ‹€λ©΄ μΆ”μ²œν•œλ‹€.

Categories:

Updated: