์ž๋ฃŒ๊ตฌ์กฐ/๐Ÿ‘‰์•Œ๊ณ ๋ฆฌ์ฆ˜ - 23

์˜ค๋Š˜ ๋“ค์€ ๊ฐ•์˜ ๋ชฉ๋ก

  1. ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  2. ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ Union Find์˜ ์ฐจ์ด(Union Find ๊ธฐ๋ณธ)

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋Œ€ํ‘œ์ ์ธ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜.

  1. ๋ชจ๋“  ์ •์ ์„ ๋…๋ฆฝ์ ์ธ ์ง‘ํ•ฉ์œผ๋กœ ๋งŒ๋“ ๋‹ค.
  2. ๋ชจ๋“  ๊ฐ„์„ ์„ ๋น„์šฉ์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ณ , ๋น„์šฉ์ด ์ž‘์€ ๊ฐ„์„ ๋ถ€ํ„ฐ ์„ ํƒํ•œ๋‹ค.
  3. ์„ ํƒํ•œ ๊ฐ„์„ ์˜ ์–‘ ๋ ๋…ธ๋“œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์˜ ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋ฅผ ํ™•์ธํ•˜์—ฌ,
    ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฝ์šฐ, ์—ฐ๊ฒฐํ•œ๋‹ค.(์„œ๋กœ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•œ ๊ฒฝ์šฐ, ์—ฐ๊ฒฐํ•˜๋ฉด ์‚ฌ์ดํด์ด ์ƒ๊ธด๋‹ค.)

์ง‘ํ•ฉ์„ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„๊ณ  ํ•ฉ์น˜๋Š”๊ฐ€? ๋ผ๋Š” ์งˆ๋ฌธ๋•Œ๋ฌธ์— ๋ง‰ํžํ…๋ฐ,
์ด๋ฅผ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด Union-Find๋‹ค.

Union Find ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ธฐ์กด Union Find ํฌ์ŠคํŠธ

(Disjoint Set)์„œ๋กœ์†Œ ์ง‘ํ•ฉ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜
Disjoint Set

  • ์„œ๋กœ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„ ์ง‘ํ•ฉ๋“ค๋กœ ๋‚˜๋ˆ ์ง„ ์›์†Œ๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ
    (๊ณตํ†ต ์›์†Œ๊ฐ€ ์—†๋Š” ์ง‘ํ•ฉ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ)
  • Union, Find์—ฐ์‚ฐ ์ด๋ ‡๊ฒŒ ๋‘˜๋กœ ๋‚˜๋‰œ๋‹ค.

Union : ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ๊ฐ ์†ํ•œ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์ง‘ํ•ฉ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์นœ๋‹ค.
Find : ๋…ธ๋“œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์˜ ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค.

Union Find ๊ธฐ๋ณธ๊ตฌํ˜„

from string import ascii_uppercase
parentOf = {v : v for v in ascii_uppercase[:6]}

def Find(node):
    while parentOf[node] != node:
        node = parentOf[node]
    return node

def Union (n1, n2):
    p1 = Find(n1)
    p2 = Find(n2)
    parentOf[p2] = p1 # p1๊ณผ p2๊ฐ€ ๊ฐ™์•„๋„ ์ƒ๊ด€์—†๋‹ค. ์›๋ž˜ ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋Š” ์ž๊ธฐ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ.

Union('D', 'A')
Union('D', 'B')
Union('D', 'F')
Union('E', 'C')
print(parentOf) # ์ขŒ์ธก ๊ทธ๋ž˜ํ”„

Union('C', 'A') # E๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์˜ ์•„๋ฌด ๋…ธ๋“œ, D๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์˜ ์•„๋ฌด ๋…ธ๋“œ
print(parentOf) # ์šฐ์ธก ๊ทธ๋ž˜ํ”„

๊ธฐ๋ณธ

๊ทธ๋ž˜ํ”„

์œ„ ๊ทธ๋ž˜ํ”„๋ฅผ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด์—ˆ๋‹ค.
1๋ฒˆ์งธ ์ค„์ด ์ขŒ์ธก ๊ทธ๋ž˜ํ”„๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ , 2๋ฒˆ์งธ ์ค„์ด ์šฐ์ธก ๊ทธ๋ž˜ํ”„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

Union Find์—์„œ๋Š” ํ˜„์žฌ ๋…ธ๋“œ์—์„œ ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ์•Œ์•„์•ผํ•œ๋‹ค.
๋”ฐ๋ผ์„œ ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณต๊ฐ„์„ ๋งŒ๋“ค์—ˆ๋‹ค.
๋˜ Union์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์•ผํ•˜๋Š”๋ฐ,
์ด ๊ธฐ๋Šฅ์€ Find๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ Find๋ฅผ ๋จผ์ € ๊ตฌํ˜„ํ–ˆ๋‹ค.

Find ๊ตฌํ˜„์€ ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•ด์„œ ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ํƒ€๊ณ  ์˜ฌ๋ผ๊ฐ€๋Š” ๋ฐฉ์‹์ด๋‹ค.
Union ๊ตฌํ˜„์€ Find๋ฅผ ํ†ตํ•ด ๋‘ ๋…ธ๋“œ์˜ ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋ฅผ ์ฐพ๊ณ ,
ํ•œ ์ตœ์ƒ์œ„ ๋…ธ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•œ๋‹ค.
์ด ๋•Œ, ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•ด์„œ ๊ฐ™์€ ์ตœ์ƒ์œ„ ๋…ธ๋“œ๋ฅผ ๊ฐ€์งˆ๋•Œ,
p1 <- p2๊ฐ€ ๋˜๋„๋ก ํ•˜๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
๊ทธ ์ด์œ ๋Š”, ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ๊ฐ ๋…ธ๋“œ๋Š” ๋ถ€๋ชจ๋…ธ๋“œ๋ฅผ ์ž๊ธฐ์ž์‹ ์œผ๋กœ ํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ์ง‘ํ•ฉ์„ ๊ฐ–๋„๋ก ํ•˜๋Š”๋ฐ,
์ตœ์ƒ์œ„ ๋…ธ๋“œ๋Š” ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ€ ์ž๊ธฐ์ž์‹ ์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜๊ณ , ์ดํ›„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Union Find ์ตœ์ ํ™”

๊ธฐ๋ณธ์ ์œผ๋กœ ์งœ์—ฌ์ง„ Union Find๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด,
์ตœ์•…์˜ ๊ฒฝ์šฐ ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ํ•œ์ชฝ์œผ๋กœ ์น˜์šฐ์ณ์ ธ์„œ
๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ํ˜•ํƒœ๊ฐ€ ๋งŒ๋“ค์–ด ์งˆ ์ˆ˜ ์žˆ๋‹ค.
worst

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•๋“ค์ด ์žˆ๋‹ค.

  1. path-compression : ๊ฒฝ๋กœ์••์ถ•
  2. union-by-rank

๋งˆ์ง€๋ง‰

ํฌ์ŠคํŠธ์˜ ๋งจ ๋งˆ์ง€๋ง‰์— ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ,
๊ฐ•์˜์—์„œ๋Š” ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•˜๊ณ , โ€œ์ง‘ํ•ฉ์„ ์–ด๋–ป๊ฒŒ ์ฐพ๊ณ  ํ•ฉ์น˜๋Š”๊ฐ€?โ€๋ผ๋Š” ๋ถ€๋ถ„์—์„œ
Union-Find๋ฅผ ์†Œ๊ฐœํ•˜๊ณ , Union-Find๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์•ฝ๊ฐ„ ํฌ์ŠคํŠธ๋„ ์ˆœ์„œ๊ฐ€ ์„ž์˜€๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ Union-Find๋ฅผ ๋งˆ๋ฌด๋ฆฌ์ง“๊ณ , ํฌ๋ฃจ์Šค์นผ์„ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๊ฒ ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ๋Š” Union-Find๊ฐ€ ์™œ ํ•„์š”ํ•œ๊ฐ€? + Union-Find ๊ธฐ๋ณธ ๊ตฌํ˜„์ •๋„๋กœ๋งŒ ๋ณด๋ฉด ๋˜๊ฒ ๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ