๋ฐ˜์‘ํ˜•

 

๊ตญ๋ฏผ๋Œ€ํ•™๊ต์—์„œ "์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜" ๊ต์žฌ๋ฅผ ์ด์šฉํ•œ
 ๋ฐ•ํ•˜๋ช… ๊ต์ˆ˜๋‹˜์˜ ๊ฐ•์˜ ๊ต์•ˆ์„ ์ด์šฉํ•˜์—ฌ ์ˆ˜์—… ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค

 

 

Disjoint Sets

 

Disjoint Sets๋ž€ ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š๋Š” ์ง‘ํ•ฉ๋“ค์„ ์˜๋ฏธํ•จ

 

=> ์–ด์ฉŒํ”ผ ๊ต์ง‘ํ•ฉ์ด ๊ณต์ง‘ํ•ฉ์ด๋ฏ€๋กœ intersect ์—ฐ์‚ฐ์€ ๋”ฐ๋กœ ์กด์žฌ X

 

โˆด Disjoint Set ์—ฐ์‚ฐ์—๋Š”

 

 

  • make-set(u) : u๋ฅผ ์œ ์ผํ•œ ์›์†Œ๋กœ ๊ฐ–๋Š” ์ง‘ํ•ฉ ์ƒ์„ฑ

  • find-set(u) : u๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ ๋ฆฌํ„ด

  • union(u, v) : u๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ๊ณผ v๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ํ•ฉ์นจ

 

https://www.acmicpc.net/problem/1717

 

์ง‘ํ•ฉ์˜ ํ‘œํ˜„ ์ด๋ผ๋Š” ๋ฐฑ์ค€ ๋ฌธ์ œ๋ฅผ Disjoint Set ์—ฐ์‚ฐ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž

 

 

 

python์˜ set์„ ์“ด๋‹ค๋ฉด union(u, v)๋ฅผ ํ•  ๋•Œ u, v๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ์ฐพ๊ธฐ์œ„ํ•ด ๊ฐ๊ฐ O(n) ๋งŒํผ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ณ  

u, v๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๊ธฐ ์œ„ํ•ด ํ•œ ์ชฝ์— ๊ฐ’์„ ๋‹ค ๋„ฃ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋˜ ๊ฑธ๋ฆผ

=> ํ•œ ๋ฒˆ์— ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋ฐฐ์—ด์„ ๋งŒ๋“ ์–ด๋†”๋„ ํ•ฉ์ง‘ํ•ฉ์„ ํ•  ๋•Œ ๊ฒฐ๊ตญ n๋งŒํผ ๊ฑธ๋ฆฌ๋ฏ€๋กœ ๋น„ํšจ์œจ์ 

 

Naive Implementation of Disjoint Sets

 

๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ๊ฐ ์›์†Œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•ด๋ณด๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Œ

 

 

 

  • arr[u]๋Š” u๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ์˜๋ฏธ

  • make-set(u) : arr[u] = u ๋กœ ์ดˆ๊ธฐํ™” 

    => O(1)

  • find-set(u) : arr[u]๋ฅผ ๋ฆฌํ„ด 

    => O(1)

  • union(u, v) : v๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์˜ ๊ฐ’์„ u์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋ณ€๊ฒฝ

    => O(n)

    (๋ฐฐ์—ด์„ ํ•œ๋ฒˆ scan ํ•˜๋ฉด์„œ ์†ํ•œ ์ง‘ํ•ฉ์„ ๋ฐ”๊ฟ”์ค˜์•ผํ•˜๋ฏ€๋กœ)

Parent Pointer Trees for Disjoint Sets

 

๊ฐ Tree๊ฐ€ ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋‚ด๋„๋ก ๊ตฌํ˜„

 

 

 

  • Tree์˜ root๋Š” ํ•ด๋‹น ์ง‘ํ•ฉ์˜ ๋Œ€ํ‘œ ๋…ธ๋“œ์ž„

  • find-set(u) : u๊ฐ€ ์†ํ•œ tree์˜ root๋ฅผ ๋ฆฌํ„ด 

    => O(tree ๋†’์ด)

    (root๊นŒ์ง€ ์ญ‰ ์˜ฌ๋ผ๊ฐ€์„œ ํ™•์ธํ•˜๋ฏ€๋กœ)

  • union-set(u, v) : v๊ฐ€ ์†ํ•œ tree์˜ root๋ฅผ u๊ฐ€ ์†ํ•œ tree์˜ root์— ์—ฐ๊ฒฐ

    => O(tree ๋†’์ด)

    (u, v์˜ root๋ฅผ ํ™•์ธํ•˜๊ณ  ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ root๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฏ€๋กœ O(tree์˜ ๋†’์ด) + O(tree์˜ ๋†’์ด) + O(1) = O(tree์˜ ๋†’์ด) ๊ฐ€ ๋จ)

 

ํ•˜์ง€๋งŒ ๊ฐ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์”ฉ ์—ฐ๊ฒฐ๋œ๋‹ค๋ฉด ์ตœ์•…์˜ ๊ฒฝ์šฐ tree์˜ ๋†’์ด๋Š” n์ด ๋จ

=> find-set ์™€ union-set ๋ชจ๋‘ O(n)์ด ๋˜๋ฒ„๋ฆฌ๋Š” ์ฐฝ์กฐ ์†ํ•ด๊ฐ€ ๋ฐœ์ƒํ•จ

๊ทธ๋Ÿผ ์ด์ œ ์–ด๋–ป๊ฒŒ tree์˜ ๋†’์ด๋ฅผ ๋‚ฎ๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ณ ๋ฏผํ•ด๋ด์•ผํ•จ

 

 

tree์˜ ๋†’์ด๋ฅผ ๋‚ฎ๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์ ํ™” ๋ฐฉ๋ฒ• Union by Rank์™€ Path Compression์„ ์‚ดํŽด๋ณด์ž

 

Union by Rank

 

 

 

 

2๊ฐœ์˜ Tree๋ฅผ Unionํ•  ๋•Œ,  ๋†’์ด๊ฐ€ ๋‚ฎ์€ Tree๋ฅผ ๋†’์€ Tree์— ์—ฐ๊ฒฐ

 

์—ฌ๊ธฐ์„œ ์ƒ๊ฐํ•ด์•ผํ•  ๋ถ€๋ถ„์€ 2๊ฐœ์˜ tree์˜ rank๊ฐ€ ๊ฐ™์„ ๋•Œ ๋†’์ด๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž„

=> ๋งŒ์•ฝ tree A์™€ B ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํฐ ๊ฒฝ์šฐ ํ•ฉ์น˜๋ฉด ๋” ํฐ rank๋ฅผ ๋”ฐ๋ผ๊ฐ

 

๋‘ Tree์˜ ๋†’์ด๊ฐ€ ๊ฐ™์„ ๋•Œ๋งŒ ๋†’์ด๊ฐ€ ์ฆ๊ฐ€

 

  • A์˜ ๋†’์ด > B์˜ ๋†’์ด => A์˜ ๋†’์ด

  • A์˜ ๋†’์ด < B์˜ ๋†’์ด => B์˜ ๋†’์ด

  • A์˜ ๋†’์ด = B์˜ ๋†’์ด => (A ๋˜๋Š” B์˜ ๋†’์ด) + 1

 

์œ„ ๊ทธ๋ฆผ์—์„œ ํ•˜๋‚˜ ๋” ์•Œ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์‹ค์€ ๋†’์ด๊ฐ€ ๋Š˜์–ด๋‚  ๋•Œ ๋งˆ๋‹ค ๋…ธ๋“œ๊ฐ€ 2๋ฐฐ์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž„

์ฆ‰, ๋†’์ด๊ฐ€ h์ธ Tree๋Š” ์ตœ์†Œ 2^h ๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€์ง  (n >= 2^h)

 

=> ๋…ธ๋“œ๊ฐ€ n๊ฐœ์ธ Tree์˜ ๋†’์ด๋Š” ์ตœ๋Œ€ logn  (logn >= h)

 

Tree์˜ ๋†’์ด๋ฅผ ๋” ์ค„์ด๋ ค๋ฉด..?

 

Path Compression

 

Find-set(u) ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ๊ฒฝ๋กœ์ƒ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ Root์— ์—ฐ๊ฒฐ

 

 


Complexity Analysis

 

n๋ฒˆ์˜ make-set ์—ฐ์‚ฐ๊ณผ m๋ฒˆ์˜ union/find-set ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋  ๊ฒฝ์šฐ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ์‚ดํŽด๋ณด๋ฉด

 

  • Union by Rank 

    => O(mlogn)

  • Path Compression ์ ์šฉ 

    => O(mlog*n)

log๋ฅผ ๊ณ„์† ์”Œ์› ์„ ๋•Œ 1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์งˆ ๋•Œ์˜ k๊ฐ’์ด log*n์ž„

 

=> log*n์€ ์‚ฌ์‹ค์ƒ ์ƒ์ˆ˜๋ผ๊ณ  ๋ด๋„ ๋  ์ •๋„๋กœ ์ž‘์Œ

๋”ฐ๋ผ์„œ ์‚ฌ์‹ค์ƒ Path Compression์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(m)์ž„!

 

Path Compression ํ•  ๋•Œ ๋‘ ๋ฒˆ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋ ค๋ฉด?

 

Additional Issues

 

 

 

Root๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋Œ€์‹ ์— ์กฐ๋ถ€๋ชจ์— ์—ฐ๊ฒฐ

=> ๊ฒฝ๋กœ์˜ ๊ธธ์ด๊ฐ€ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“œ๋Š” ํšจ๊ณผ

 

Path-halving์˜ ๊ฒฝ์šฐ : ๋ถ€๋ชจ์˜ ์—ฐ๊ฒฐ์„ ๋Š๊ณ  ๊ทธ ์œ„์˜ ์กฐ๋ถ€๋ชจ๋ž‘ ์—ฐ๊ฒฐํ•จ

(์ด ๋•Œ ์—ฐ๊ฒฐ์ด ๋Š๊ธด ๋ถ€๋ชจ๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ ๋ญ˜ ํ•˜์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐ)

 

Path-splitting์˜ ๊ฒฝ์šฐ : ๋ถ€๋ชจ์˜ ์—ฐ๊ฒฐ์„ ๋Š๊ณ  ๊ทธ ์œ„์˜ ์กฐ๋ถ€๋ชจ๋ž‘ ์—ฐ๊ฒฐํ•จ

(์ด ๋•Œ ์—ฐ๊ฒฐ์ด ๋Š๊ธด ๋ถ€๋ชจ๋„ ๊ฐ™์€ ๊ณผ์ •์„ ์‹คํ–‰)

 

 

๊ณตํ†ต ์กฐ์ƒ์ด ์žˆ๋Š” ๋‘ ๋…ธ๋“œ u, v์— ๋Œ€ํ•ด union ์—ฐ์‚ฐ์„ ๋นจ๋ฆฌ ๋๋‚ด๋ ค๋ฉด?

 

 

๊ธฐ์กด find-set(u), find-set(v) ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด Root๊นŒ์ง€ ์—ฐ์‚ฐํ•˜์ง€๋งŒ

 

Rem's Algorithm์€ ๊ณตํ†ต ์กฐ์ƒ์ด ๋‚˜ํƒ€๋‚˜๋ฉด ์—ฐ์‚ฐ ์ข…๋ฃŒ

 

 

1. ๋‚˜์˜ ๋ถ€๋ชจ๊ฐ€ ํ•ญ์ƒ ๋‚˜๋ณด๋‹ค ์ˆซ์ž๊ฐ€ ์ ์€ ์ƒํƒœ๋กœ ๋งŒ๋“  ํ›„

 

2. ๊ฐ leaf์— ํฌ์ธํ„ฐ๋ฅผ ์ง€์ •ํ•ด๋†“๊ณ  ์‹œ์ž‘

3. ๋ถ€๋ชจ๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ถ€๋ชจ์˜ ์ˆ˜๊ฐ€ ๋” ํฐ์ชฝ์œผ๋กœ ํฌ์ธํ„ฐ๋ฅผ ํ•˜๋‚˜ ์˜ฌ๋ฆผ

4. ์ด๋ฅผ ๋ฐ˜๋ณตํ•˜๋‹ค ์–‘์ชฝ ๋ถ€๋ชจ์˜ ์ˆ˜๊ฐ€ ๊ฐ™์•„์ง€๋Š” ์ฆ‰, ๊ณตํ†ต ์กฐ์ƒ์ด ๋‚˜ํƒ€๋‚˜๋ฉด ์—ฐ์‚ฐ ์ข…๋ฃŒ

 

์ด ๋•Œ find-set์„ ์“ฐ์ง€ ์•Š์œผ๋ฏ€๋กœ Path Compression์ด ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— Splicing ๊ธฐ๋ฒ• ์ ์šฉ

 

=> ํฌ์ธํ„ฐ๊ฐ€ ์œ„๋กœ ์˜ฌ๋ผ๊ฐˆ ๋•Œ ์ž๊ธฐ ๋ถ€๋ชจ์™€์˜ ์—ฐ๊ฒฐ์„ ๋Š๊ณ  ์ƒ๋Œ€ ํฌ์ธํ„ฐ์˜ ๋ถ€๋ชจ๋ž‘ ์—ฐ๊ฒฐ

 

 

๋ฐ˜์‘ํ˜•

'๐Ÿ”ฅ Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

L12 - Single Source Shortest Paths  (0) 2024.11.28
L11 - Minimum Spanning Trees  (0) 2024.11.26
L09 - Greedy Algorithms  (1) 2024.11.03
L07 - Selection  (4) 2024.10.13
L06 - Non-comparison Sorting  (2) 2024.10.08