CS/Algorithm

์„œ๋กœ์†Œ ์ง‘ํ•ฉ(Disjoint-set)

deo2kim 2020. 9. 29. 20:55
๋ฐ˜์‘ํ˜•

make_set()
find_set and paht compressin

๐Ÿ“” ์„œ๋กœ์†Œ ์ง‘ํ•ฉ(Disjoint-set) ์ด๋ž€

  • ์„œ๋กœ์†Œ ๋˜๋Š” ์ƒํ˜ธ๋ฐฐํƒ€ ์ง‘ํ•ฉ๋“ค์€ ์„œ๋กœ ์ค‘๋ณต ํฌํ•จ๋œ ์›์†Œ๊ฐ€ ์—†๋Š” ์ง‘ํ•ฉ๋“ค( ๊ต์ง‘ํ•ฉ์ด ์—†๋Š” ์ƒํƒœ )
  • ์ง‘ํ•ฉ์— ์†ํ•œ ํ•˜๋‚˜์˜ ํŠน์ • ์›์†Œ๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ์ง‘ํ•ฉ๋“ค์„ ๊ตฌ๋ถ„ ( ์ด๋ฅผ ๋Œ€ํ‘œ์ž๋ผ๊ณ  ํ•จ )
  • ์ƒํ˜ธ ๋ฐฐํƒ€ ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ
      • ๊ฐ™์€ ์ง‘ํ•ฉ์˜ ์›์†Œ๋“ค์€ ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ด€๋ฆฌ
      • ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž์˜ ์›์†Œ๋ฅผ ์ง‘ํ•ฉ์˜ ๋Œ€ํ‘œ๋กœ ํ•œ๋‹ค
      • ๊ฐ ์›์†Œ๋Š” ์ง‘ํ•ฉ์˜ ๋Œ€ํ‘œ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋งํฌ๋ฅผ ๊ฐ–๋Š”๋‹ค
    • ํŠธ๋ฆฌ
      • ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์„ ํŠธ๋ฆฌ๋กœ ํ‘œํ˜„
      • ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉฐ ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๋Œ€ํ‘œ์ž๊ฐ€ ๋จ
  • ์ƒํ˜ธ๋ฐฐํƒ€ ์ง‘ํ•ฉ ์—ฐ์‚ฐ
    • make_set(x)
    • find_set(x)
    • union(x,y)

๐Ÿ“” ์„œ๋กœ์†Œ ์ง‘ํ•ฉ(Disjoint-set) ๊ตฌํ˜„

def make_set(x):
    p[x] = x


def find_set(x):
    if p[x] == x:
        return x
    else:
        p[x] = find_set(p[x])
        return p[x]


def union(x, y):
    # a์™€ b์˜ ๋Œ€ํ‘œ์ž๋ฅผ ์ฐพ์Œ
    px = find_set(x)
    py = find_set(y)
    if rank[px] > rank[py]:
        p[py] = px
    elif rank[py] > rank[px]:
        p[px] = py
    else:
        p[px] = py
        rank[py] += 1


# 1๋ถ€ํ„ฐ 8๊นŒ์ง€ ํ•ด๋ณด์ž
n = 8
p = [0] * (n + 1)
rank = [0] * (n + 1)
for i in range(1, n + 1):
    make_set(i)

union(1, 3)
union(2, 3)
union(5, 6)
union(6, 8)
union(1, 5)
union(6, 7)
print(p)
print(find_set(4))
print(find_set(5))

# ์—ฐ์‚ฐ์˜ ํšจ์œจ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•
# 1. path compression: ๋ชจ๋“  ๋…ธ๋“œ๋“ค์ด ์ง์ ‘ root๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๊ฐฑ์‹ ํ•œ๋‹ค.
# 2. Rank๋ฅผ ์ด์šฉํ•œ Union: ๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹ ์„ ๋ฃจํŠธ๋กœ ํ•˜๋Š” subtree์˜ ๋†’์ด๋ฅผ Rank๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•œ๋‹ค.
# 2-2. ๋‘ ์ง‘ํ•ฉ์„ ํ•ฉ์น  ๋•Œ rank๊ฐ€ ๋‚ฎ์€ ์ง‘ํ•ฉ์„ rank๊ฐ€ ๋†’์€ ์ง‘ํ•ฉ์— ๋ถ™์ธ๋‹ค.

 

๐Ÿ“” ์„œ๋กœ์†Œ ์ง‘ํ•ฉ(Disjoint-set) ํŠน์ง•

  • ํ•ฉ์ง‘ํ•ฉ์„ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉ
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•  ๋•Œ ๋‘๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด์„œ, ์„ ํƒํ•œ ๋‘ ๋…ธ๋“œ๊ฐ€ ์„œ๋กœ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„์— ์†ํ•˜๋Š” ์ง€ ํŒ๋ณ„ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
๋ฐ˜์‘ํ˜•