๊ด€๋ฆฌ ๋ฉ”๋‰ด

Dionysus

[์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿงฉ] Union-Find (Disjoint-sets) ๋ณธ๋ฌธ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[์•Œ๊ณ ๋ฆฌ์ฆ˜๐Ÿงฉ] Union-Find (Disjoint-sets)

Gogumiing 2024. 9. 10. 11:42

๋ชฉ์ฐจ

๐Ÿ’ฌ ์„œ๋กœ์†Œ ์ง‘ํ•ฉ (Disjoint-sets)

 


๐Ÿ’ฌ ์„œ๋กœ์†Œ ์ง‘ํ•ฉ(Disjoint-sets)

๋”๋ณด๊ธฐ
๐Ÿ’ก ์„œ๋กœ์†Œ ์ง‘ํ•ฉ(Disjoint-sets)

์„œ๋กœ์†Œ ๋˜๋Š” ์ƒํ˜ธ๋ฐฐํƒ€ ์ง‘ํ•ฉ๋“ค๋กœ, ๊ต์ง‘ํ•ฉ์ด ์—†๋Š” ์ง‘ํ•ฉ๋“ค์„ ์˜๋ฏธํ•œ๋‹ค.
์ง‘ํ•ฉ์— ์†ํ•œ ํ•˜๋‚˜์˜ ํŠน์ • ๋ฉค๋ฒ„๋ฅผ ํ†ตํ•ด ์ง‘ํ•ฉ๋“ค์„ ๊ตฌ๋ถ„ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ๋Œ€ํ‘œ์ž(representative)๋ผ๊ณ  ํ•œ๋‹ค.

 

  • ์ƒํ˜ธ๋ฐฐํƒ€ ์ง‘ํ•ฉ ํ‘œํ˜„ ๋ฐฉ๋ฒ•
    • ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ
    • ํŠธ๋ฆฌ
  • ์ƒํ˜ธ๋ฐฐํƒ€ ์ง‘ํ•ฉ ์—ฐ์‚ฐ
    • Make - Set(x)
      ์œ ์ผํ•œ ๋ฉค๋ฒ„ x๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒˆ๋กœ์šด ์ง‘ํ•ฉ์„ ์—ฐ์‚ฐํ•˜๋Š” ์—ฐ์‚ฐ

    • Find - Set(x)        return {representative}
      x๋ฅผ ํฌํ•จํ•˜๋Š” ์ง‘ํ•ฉ์„ ์ฐพ๋Š” ์—ฐ์‚ฐ

    • Union(x, y)
      x์™€ y๋ฅผ ํฌํ•จํ•˜๋Š” ๋‘ ์ง‘ํ•ฉ์„ ํ†ตํ•ฉํ•˜๋Š” ์—ฐ์‚ฐ
๐Ÿ“Œ ์ƒํ˜ธ๋ฐฐํƒ€ ์ง‘ํ•ฉ์˜ ์˜ˆ

 

 

โœ… ์ƒํ˜ธ ๋ฐฐํƒ€ ์ง‘ํ•ฉ ํ‘œํ˜„ - ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ

๊ฐ™์€ ์ง‘ํ•ฉ์˜ ์›์†Œ๋“ค์„ ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž ์›์†Œ๊ฐ€ ๋Œ€ํ‘œ ์›์†Œ(representative)๊ฐ€ ๋œ๋‹ค.
  • ๊ฐ ์›์†Œ๋Š” ์ง‘ํ•ฉ์˜ ๋Œ€ํ‘œ์›์†Œ(representative)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋งํฌ๋ฅผ ๊ฐ€์ง„๋‹ค.
  •  Find-Set(e)                 return a
  • Find-Set(f)                   return b
  • Union(a, b)

 

 

โœ… ์ƒํ˜ธ ๋ฐฐํƒ€ ์ง‘ํ•ฉ ํ‘œํ˜„ - ํŠธ๋ฆฌ

ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ(a disjoint set)์„ ํ•˜๋‚˜์˜ ํŠธ๋ฆฌ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๋Œ€ํ‘œ์ž(representative)๊ฐ€ ๋œ๋‹ค.

 

  • Make-Set(a) ~ Make-Set(f)
  • Union(c, d), Union(e, f)
  • Union(d, f)
Find-Set(d) = Find-Set(e) = return c
๐Ÿ“Œ ์ƒํ˜ธ ๋ฐฐํƒ€ ์ง‘ํ•ฉ ์—ฐ์‚ฐ(ํŠธ๋ฆฌ)์˜ ๋ฌธ์ œ์ 

ํŠธ๋ฆฌ์˜ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜๋ฉด Union(x, y) ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฃจํŠธ ํ•˜๋‚˜์˜ ์ •๋ณด๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง„๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฐ์‚ฐ์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ž˜๋ชปํ•˜๋ฉด ํŠธ๋ฆฌ๊ฐ€ ํ•œ์ชฝ์œผ๋กœ ๊ธฐ์šธ์–ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

โ–ท ํŠธ๋ฆฌ์˜ ๋†’์ด๊ฐ€ h๊ฐ€ ๋˜๋ฉด Union()์—ฐ์‚ฐ๊ณผ Find-Set() ์—ฐ์‚ฐ ๋ชจ๋‘ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(h)๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฌ๋ฉฐ, ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํšจ์œจ์ด ๋” ๋‚˜๋น ์ง„๋‹ค.


โ–ถ ํ•ด๊ฒฐ(์ตœ์ ํ™”) ๋ฐฉ์•ˆ

- Rank๋ฅผ ํ™œ์šฉํ•œ Union (๋žญํฌ์— ์˜ํ•œ ํ•ฉ์น˜๊ธฐ ์ตœ์ ํ™”)
๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹ ์„ ๋ฃจํŠธ๋กœ ํ•˜๋Š” subtree์˜ ๋†’์ด๋ฅผ ๋žญํฌ(rank)๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ ์ง‘ํ•ฉ์„ ํ•ฉ์น  ๋•Œ rank๊ฐ€ ๋‚ฎ์€ ์ง‘ํ•ฉ์„ rank๊ฐ€ ๋†’์€ ์ง‘ํ•ฉ์— ๋ถ™์ธ๋‹ค.
p[x]: ๋…ธ๋“œ x์˜ ๋ถ€๋ชจ ์ €์žฅ
rank[x]: ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ x์ธ ํŠธ๋ฆฌ์˜ ๋žญํฌ ๊ฐ’ ์ €์žฅ


Make_Set(x):
	p[x] = x
    rank[x] = 0
    

Find_Set(x):
	# x๊ฐ€ ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ
	if x != p[x]:
    	p[x] = Find_Set(p[x])
    return p[x]
    

Union(x, y):
	Link(Find_Set(x), Find_Set(y))


Link(x, y):
	# rank๋Š” ํŠธ๋ฆฌ์˜ ๋†’์ด
	if rank[x] > rank[y]:
    	p[y] = x
    else
    	p[x] = y
        if rank[x] == rank[y]:
        	rank[y] += 1

 

→ Find_Set() ์—ฐ์‚ฐ์€ ํŠน์ • ๋…ธ๋“œ์—์„œ ๋ฃจํŠธ๊นŒ์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๊ฐ€๋ฉด์„œ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ์ •๋ณด๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.


- Path Compression (๊ฒฝ๋กœ ์••์ถ•)
Find-Set์„ ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋งŒ๋‚˜๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋“ค์ด ์ง์ ‘ root๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํฌ์ธํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.