Skip to content

Union find โ€‹

  • disjoint-set ์ด๋ž€?
  • union-find ๊ตฌํ˜„

Disjoint-Set ์ด๋ž€? โ€‹

  • ์„œ๋กœ์†Œ ๋˜๋Š” ์ƒํ˜ธ๋ฒ ํƒ€ ์ง‘ํ•ฉ๋“ค์€ ์„œ๋กœ ์ค‘๋ณต ํฌํ•จ๋œ ์›์†Œ๊ฐ€ ์—†๋Š” ์ง‘ํ•ฉ๋“ค์ด๋‹ค. => ๊ต์ง‘ํ•ฉ์ด ์—†๋‹ค.
  • ์ง‘ํ•ฉ์— ์†ํ•œ ํ•˜๋‚˜์˜ ํŠน์ • ๋ฉค๋ฒ„๋ฅผ ํ†ตํ•ด ๊ฐ ์ง‘ํ•ฉ๋“ค์„ ๊ตฌ๋ถ„ํ•œ๋‹ค. ์ด๋ฅผ ๋Œ€ํ‘œ์ž๋ผ๊ณ  ํ•œ๋‹ค.
  • ์ƒํ˜ธ๋ฒ ํƒ€ ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ
    • ํŠธ๋ฆฌ (ํšจ์œจ์ )
  • ์ƒํ˜ธ๋ฒ ํƒ€ ์ง‘ํ•ฉ ์—ฐ์‚ฐ
    • make-set(x) : [์ดˆ๊ธฐํ™” ๋‹จ๊ณ„], ์œ ์ผํ•œ ๋ฉค๋ฒ„ x๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒˆ๋กœ์šด ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ
    • find-set(x) : [๋Œ€ํ‘œ์ž ์ฐพ๊ธฐ], x๋ฅผ ํฌํ•จํ•˜๋Š” ์ง‘ํ•ฉ์„ ์ฐพ๋Š” ์˜คํผ๋ ˆ์ด์…˜
    • union-set(x,y) : [ํ•ฉ์น˜๊ธฐ], x์™€ y๋ฅผ ํฌํ•จํ•˜๋Š” ๋‘ ์ง‘ํ•ฉ์„ ํ†ตํ•ฉํ•˜๋Š” ์˜คํผ๋ ˆ์ด์…˜

Union-find ๊ตฌํ˜„ โ€‹

์ฐธ๊ณ 

javascript
const makeSet = (arr) => arr.fill().map((_, i) => i)

const findSet = (arr, x) => (arr[x] === x ? x : (arr[x] = findSet(arr[x])))

const unionSet = (arr, x, y) => {
  x = findSet(arr, x)
  y = findSet(arr, y)
  if (x === y) return
  arr[y] = x
}

let arr = Array(8)
arr = makeSet(arr)
console.log(arr)

// group 1
unionSet(arr, 2, 0)
unionSet(arr, 2, 1)

// group 2
unionSet(arr, 4, 3)
unionSet(arr, 4, 6)
unionSet(arr, 4, 7)
unionSet(arr, 5, 4)

// group 1 + group 2
unionSet(arr, 5, 2)

console.log(arr)

/**
 * [ 0, 1, 2, 3, 4, 5, 6, 7 ]
 * [ 2, 2, 5, 4, 5, 5, 4, 4 ]
 */