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 ]
*/