์๋ฃ๊ตฌ์กฐ/๐์๊ณ ๋ฆฌ์ฆ - 23
์ค๋ ๋ค์ ๊ฐ์ ๋ชฉ๋ก
- ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
- ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ๊ณผ Union Find์ ์ฐจ์ด(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๋ฅผ ํ๋ค๋ณด๋ฉด,
์ต์
์ ๊ฒฝ์ฐ ์๋ ์ฌ์ง์ฒ๋ผ ํ์ชฝ์ผ๋ก ์น์ฐ์ณ์ ธ์
๋จ๋ฐฉํฅ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ ํํ๊ฐ ๋ง๋ค์ด ์ง ์ ์๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ต์ ํ ๊ธฐ๋ฒ๋ค์ด ์๋ค.
- path-compression : ๊ฒฝ๋ก์์ถ
- union-by-rank
๋ง์ง๋ง
ํฌ์คํธ์ ๋งจ ๋ง์ง๋ง์ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋๋ฐ,
๊ฐ์์์๋ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ํ๊ณ , โ์งํฉ์ ์ด๋ป๊ฒ ์ฐพ๊ณ ํฉ์น๋๊ฐ?โ๋ผ๋ ๋ถ๋ถ์์
Union-Find๋ฅผ ์๊ฐํ๊ณ , Union-Find๋ก ๋์ด๊ฐ๊ธฐ ์์ํ๋ค.
๊ทธ๋์ ์ฝ๊ฐ ํฌ์คํธ๋ ์์๊ฐ ์์๋ค.
๋ค์ ํฌ์คํธ์์ Union-Find๋ฅผ ๋ง๋ฌด๋ฆฌ์ง๊ณ , ํฌ๋ฃจ์ค์นผ์ ๋ค์ ์ ๋ฆฌํ๊ฒ ๋ค. ์ด๋ฒ ํฌ์คํธ๋ Union-Find๊ฐ ์ ํ์ํ๊ฐ? + Union-Find ๊ธฐ๋ณธ ๊ตฌํ์ ๋๋ก๋ง ๋ณด๋ฉด ๋๊ฒ ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ