Skip to content

Latest commit

Β 

History

History
71 lines (47 loc) Β· 2.35 KB

DisjointSet.md

File metadata and controls

71 lines (47 loc) Β· 2.35 KB

μ„œλ‘œμ†Œ 집합 (Disjoint Set, Union-Find)

  • μ„œλ‘œμ†Œ 집합 (Disjoint Set) : ꡐ집합이 μ—†λŠ”, 즉 κ³΅ν†΅λ˜λŠ” μ›μ†Œκ°€ μ—†λŠ” 집합을 λ§ν•œλ‹€.
  • Union-Find : μ„œλ‘œμ†Œ 집합을 ν‘œν˜„ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€. μ„œλ‘œμ†Œ μ§‘ν•©μ˜ 정보λ₯Ό 확인(Find)ν•˜κ³  μ‘°μž‘(Union)ν•œλ‹€.

Union-Find μ—°μ‚°

Union μ—°μ‚°

  • 두 μ›μ†Œ a, b에 λŒ€ν•΄μ„œ union(a, b)λŠ” 각 μ›μ†Œκ°€ μ†ν•œ 집합을 ν•˜λ‚˜λ‘œ ν•©μΉœλ‹€.
  • 일 λ•Œ, union(a, b)λŠ” 이닀.

Find μ—°μ‚°

  • μ–΄λ–€ μ›μ†Œ a에 λŒ€ν•΄μ„œ find(a)λŠ” aκ°€ μ†ν•œ μ§‘ν•©μ˜ λŒ€ν‘œ 번호(루트 λ…Έλ“œ)λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • 에 λŒ€ν•΄μ„œ, find(a)λŠ” 집합 A의 λŒ€ν‘œ 번호(루트 λ…Έλ“œ) 이닀.

μ„œλ‘œμ†Œ μ§‘ν•©μ˜ ν‘œν˜„

스ᄏᅒᆫᄒᅑᆫ α„‘α…¦α„‹α…΅α„Œα…΅ (2)-4

μ„œλ‘œμ†Œ μ§‘ν•©μ˜ κ΅¬ν˜„

μ΄ˆκΈ°ν™” _initialize

parent 배열에 i μ›μ†Œμ˜ λΆ€λͺ¨ λ…Έλ“œ 번호λ₯Ό μ €μž₯ν•œλ‹€. i μ›μ†Œκ°€ 루트 λ…Έλ“œλΌλ©΄, 자기 μžμ‹ μ˜ 번호λ₯Ό μ €μž₯ν•œλ‹€.

function initialize()
  for i : 1 ~ N
    parent[i] = i

Union _union(a, b)

a의 루트 λ…Έλ“œκ°€ b의 루트 λ…Έλ“œλ₯Ό λΆ€λͺ¨λ‘œ μ‚Όκ²Œλ” ν•œλ‹€.

function union(a, b)
  aRoot = find(a)
  bRoot = find(b)
  parent[aRoot] = bRoot

Find _find(a)

a μ›μ†Œμ˜ 루트 λ…Έλ“œ 번호λ₯Ό λ°˜ν™˜ν•œλ‹€.

function find(a)
  if (parent[a] == a) return a
  else return find(parent(a))

이 λ•Œ, parent κ°€ N개일 경우 일렬둜 μ­‰ λ”°λΌκ°€κ²Œ 되기 λ•Œλ¬Έμ— O(N) 의 μ‹œκ°„ λ³΅μž‘λ„κ°€ λ‚˜μ˜¨λ‹€.

λ”°λΌμ„œ a μ›μ†Œμ˜ 루트 λ…Έλ“œλ₯Ό 찾을 λ•Œλ§ˆλ‹€ κ·Έ λΆ€λͺ¨ λ…Έλ“œλ₯Ό 루트 λ…Έλ“œ κ°’μœΌλ‘œ μΉ˜ν™˜ν•΄μ£Όλ©΄ 훨씬 νš¨μœ¨μ μ΄λ‹€. O(logN)

function find(a)
  if (parent[a] == a) return a
  else return parent[a] = find(parent[a])

스ᄏᅒᆫᄒᅑᆫ α„‘α…¦α„‹α…΅α„Œα…΅ (2)-5

κ΄€λ ¨ 문제 풀어보기