๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜-์ด๋ก ] 09 ์ง‘ํ•ฉ์˜ ์ฒ˜๋ฆฌ

by Wonit 2019. 11. 23.

์ง‘ํ•ฉ์˜ ์ฒ˜๋ฆฌ

 

์ƒํ˜ธ ๋ฐฐํƒ€์ ์ธ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ง‘ํ•ฉ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ์œ„ํ•œ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ธ ์ง‘ํ•ฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ•˜๋‹ค.

 

์ง‘ํ•ฉ์˜ ๊ด€๋ฆฌ์—์„œ ํ•„์š”ํ•œ ์—ฐ์‚ฐ์€ ์ž„์˜์˜ ์›์†Œ๊ฐ€ ์–ด๋Š ์ง‘ํ•ฉ์— ์†ํ•˜๋Š”์ง€ ์•Œ๋‚˜๋‚ด๋Š” ์—ฐ์‚ฐ๊ณผ ๋‘ ์ง‘ํ•ฉ์„ ํ•ฉํ•˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค.

 

์—ฌ๊ธฐ์„œ ๋ง ํ•˜๋Š” ์ƒํ˜ธ ๋ฐฐํƒ€์ ์ธ ์ง‘ํ•ฉ์€ ์„œ๋กœ์˜ ๊ต์ง‘ํ•ฉ์ด ๊ณต์ง‘ํ•ฉ์ธ ๊ฒฝ์šฐ๋ฅผ ๋œปํ•œ๋‹ค.

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ์ง‘ํ•ฉ์˜ ์ฒ˜๋ฆฌ

 

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ํ‘œํ˜„์€ ์‰ฝ๊ณ  ์ง๊ด€์ ์ด๋‹ค. ++๊ฐ ์›์†Œ๋‹น ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋“ค์„ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค++

๋…ธ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ์™€ ์›์†Œ๋ฅผ ๊ฐ–๋Š” ํ•œ ๊ฐœ์˜ ํ•„๋“œ๋กœ ์ด๋ฃจ์–ด ์ง„๋‹ค.

๋‹ค์Œ ์›์†Œ ํฌ์ธํ„ฐ -> ๋‹ค์Œ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ. ๊ฐ ์ง‘ํ•ฉ์—๋Š” ๋งˆ์ง€๋ง‰ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” tail์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋‘”๋‹ค.
๋Œ€ํ‘œ ์›์†Œ ํฌ์ธํ„ฐ -> ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž์— ์žˆ๋Š” ์›์†Œ.

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋…ธ๋“œ

)

์ƒํ˜ธ ๋ฐฐํƒ€์  ์ง‘ํ•ฉ์˜ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ++์„ธ ๊ฐ€์ง€ ์—ฐ์‚ฐ++

Make-Set(x)

  • ์›์†Œ x๋กœ๋งŒ ๊ตฌ์„ฑ๋œ ์ง‘ํ•ฉ์„ ๋งŒ๋“ ๋‹ค.

Find-Set(x)

  • ์›์†Œ x๋ฅผ ๊ฐ€์ง„ ์ง‘ํ•ฉ์„ ์•Œ์•„๋‚ธ๋‹ค.

Union(x, y)

  • ์›์†Œ x๋ฅผ ๊ฐ€์ง„ ์ง‘ํ•ฉ๊ณผ ์›์†Œ y๋ฅผ ๊ฐ€์ง„ ์ง‘ํ•ฉ์„ ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ•ฉ์นœ๋‹ค.

์ž‘์—…์˜ ๊ฐœ์š”

์‹ค์ œ์ ์œผ๋กœ ์—ฐ์‚ฐ์„ ํ•ด๋ณด์ž.

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์ง‘ํ•ฉ a

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ง‘ํ•ฉ a์™€ a = {a,b,c}

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์ง‘ํ•ฉ b

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ง‘ํ•ฉ b๋ฅผ ํ•ฉ์นœ๋‹ค๊ณ  ํ•˜์ž! b = {d,e,f,g,h}
  1. Union(a, b);

    Union์ด ์ด๋ฃจ์–ด์ง„๋‹ค๋ฉด. ๋Œ€ํ‘œ ์›์†Œ๋ฅผ ๋ฐ”๊ฟ”์„œ ์ด์–ด์ค€๋‹ค.

1์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ union

์ด๋ ‡๊ฒŒ ํ–‰๋ ฌ a = {a,b,c}์˜ ๋Œ€ํ‘œ ์›์†Œ๋ฅผ a๊ฐ€ ์•„๋‹Œ d๋กœ ์—ฐ๊ฒฐ์„ ์‹œ์ผœ์ค€๋‹ค.

๋ฌด๊ฒŒ๋ฅผ ๊ณ ๋ คํ•œ Union^Weighted_Union^

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ํ‘œํ˜„์—์„œ Make-Set์€ ํ•˜๋‚˜์˜ ์›์†Œ๋กœ ๋œ ์ง‘ํ•ฉ์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด ๋“ ๋‹ค. ๋˜ํ•œ Find-Set๋„ ์ƒ์ˆ˜ ์‹œ๊ฐ„์ด ๋“œ๋Š”๋ฐ, ์ด ์ค‘ ์ƒ์ˆ˜ ์‹œ๊ฐ„์„ ์ดˆ๊ณผํ•˜๋Š” ๊ฒƒ์€ Union ๋ฟ์ด๋‹ค.

ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๋‘ ์ง‘ํ•ฉ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

A = {1, 3, 5}

B = {2, 4, 6, 8, 10}

Union(A, B)๋ฅผ ํ–ˆ์„ ๋•Œ ๋Œ€ํ‘œ ์›์†Œ๋ฅผ ๋Š๋Š” ๊ฒฝ์šฐ๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. A์˜ ๋Œ€ํ‘œ ์›์†Œ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ.
  2. B์˜ ๋Œ€ํ‘œ ์›์†Œ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ.

1๋ฒˆ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” 1, 3, 5์˜ ์›€์ง์ž„ (3๋ฒˆ) , 2๋ฒˆ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” 2, 4, 6, 8, 10์˜ ์›€์ง์ž„ (5๋ฒˆ)์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋‘ ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๋Š” ๊ฒƒ์„ ๋ฌด๊ฒŒ๋ฅผ ๊ณ ๋ คํ•œ Union์ด๋ผ๊ณ  ํ•œ๋‹ค.

์ˆ˜ํ–‰ ์‹œ๊ฐ„.

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„๋˜๋Š” ๋ฐฐํƒ€์  ์ง‘ํ•ฉ์—์„œ ๋ฌด๊ฒŒ๋ฅผ ๊ณ ๋ คํ•œ Union์„ ์‚ฌ์šฉํ•  ๋•Œ, M๋ฒˆ์˜ Make-Set, Union, Find-Set์ค‘ n๋ฒˆ์ด Make-Set์ด๋ผ๋ฉด ์ด๋“ค์˜ ์ด ์ˆ˜ํ–‰ ์‹œ๊ฐ„์€?
  • n๋ฒˆ์˜ Make-Set์„ ํฌํ•จํ•˜๋ฏ€๋กœ ์›์†Œ์˜ ์ด ์ˆ˜๋Š” n๊ฐœ๋‹ค.

  • Make-Set๊ณผ Find-Set์€ ๊ฐ๊ฐ O(1)์˜ ์‹œ๊ฐ„์ด ๋“ค๊ณ  ์ด๋“ค์„ ํ•ฉํ•ด๋„ m๋ฒˆ์„ ๋„˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๋“ค๋กœ ์ธํ•œ ๋ถ€๋‹ด์€ O(m)์ด๋‹ค.

  • ๊ฒฐ๊ตญ ๋ฌธ์ œ๋Š” Union์ด๊ณ , Union์—์„œ ์‹œ๊ฐ„์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ๋Œ€ํ‘œ ๋…ธ๋“œ๋กœ ํฌ์ธํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์ž‘์—…์ด๋‹ค.

    Union์—์„œ ์ง‘ํ•ฉ์— x๋ผ๋Š” ๊ฐ’์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž, ์ด x๊ฐ’์€ ๋˜ํ•œ Unionํ•จ์ˆ˜์— ์˜ํ•ด์„œ ๋งŒ๋“ค์–ด ์กŒ์œผ๋ฏ€๋กœ ์‹์€
    Union(n/2, n/2)์ด ๋œ๋‹ค. ๋˜ํ•œ n/2๋„ Union(n/4, n/4)๋กœ ์ด๋ฃจ์–ด ์ ธ ์ ์  1 -> 2^2^ -> 2^3^ -> 2^4^ ์˜ ๋น„์œจ๋กœ ์ปค์ง„๋‹ค.
    ํ•˜์ง€๋งŒ ์›์†Œ์˜ ์ด ์ˆ˜๋Š” n์ด๋ฏ€๋กœ ๋ชจ๋“  ์›์†Œ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค๋ฉด ๊ธฐ๊ปํ•ด์•ผ nLog(2^n^)์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ „์ฒด ์‹œ๊ฐ„์€

O(m+nlogn) ์ด๋‹ค.

ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•œ ์ง‘ํ•ฉ์˜ ์ฒ˜๋ฆฌ

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ Union ์—์„œ๋Š” ๊ฒฐ๊ตญ ๋‘ ๋ฒˆ์˜ ํฌ์ธํ„ฐ ๊ฐฑ์‹ ์ด ํ•„์š”ํ•œ๋ฐ ์ด ๋งˆ์ €๋„ ํšจ์œจ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•œ ์ง‘ํ•ฉ์˜ ์ฒ˜๋ฆฌ์ด๋‹ค.

๊ธฐ๋ณธ ์›๋ฆฌ

ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ์˜ ๊ฒƒ ์ฒ˜๋Ÿผ ๋‘ ๋ฒˆ์˜ ๊ฐฑ์‹ ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ง€ ๋ฃจํŠธ ๋…ธ๋“œ์˜ ์œ„์น˜๋งŒ ๋ฐ”๊ฟ”์ค€๋‹ค๋ฉด ํ•œ ๋ฒˆ์— Union์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด ๋‘ ๊ฐ€์ง€์˜ ํŠน์ง•์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

ํŠธ๋ฆฌ์˜ ๋‘ ๊ฐ€์ง€ ํŠน์ง•

  • ์ž์‹ ๋…ธ๋“œ๊ฐ€ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ๋ฅผ ์ง‘ํ•ฉ์˜ ๋Œ€ํ‘œ ์›์†Œ๋กœ ์‚ผ๋Š”๋‹ค.

์ง๊ด€์ ์ธ ๊ทธ๋ฆผ์œผ๋กœ ๋ณด์ž.

ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•œ ์ง‘ํ•ฉ์˜ ์ฒ˜๋ฆฌ

a๋Š” ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค.

c๋Š” ์ž๊ธฐ ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๋˜๋ฉฐ ์ž์‹ ๋…ธ๋“œ b์™€ h๊ฐ€ ํ–ฅํ•˜๊ณ  ์žˆ๋‹ค.

ํŠธ๋ฆฌ์˜ Union

ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•œ ํ‘œํ˜„์—์„œ ๋‘ ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๋Š” ์ž‘์—…์€ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋ฐฉ๋ฒ• ๋ณด๋‹ค ์•„์ฃผ ๊ฐ„๋‹จํ•˜๋‹ค.

๋‘ ์ง‘ํ•ฉ ์ค‘ ํ•œ ์ง‘ํ•ฉ์  ใ…œํŠธ๊ฐ€ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์˜ ๋ฃจํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํฌ์ธํ„ฐ ํ•˜๋‚˜๋งŒ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค๋ฉด ๋!

ํŠธ๋ฆฌ ์œ ๋‹ˆ์˜จ

ํ•˜๋‚˜์˜ ์›์†Œ๋กœ ๊ตฌ์„ฑ๋œ ์ง‘ํ•ฉ์€ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ์ด ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ ์ž์‹ ์ด ๋˜๋„๋ก ํฌ์ธํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋†“์œผ๋ฉด ๋œ๋‹ค.


// ๋ถ€๋ชจ ๋…ธ๋“œ : p[x]

// ๋…ธ๋“œ x๋ฅผ ์œ ์ผํ•œ ์›์†Œ๋กœ ํ•˜๋Š” ์ง‘ํ•ฉ์„ ๋งŒ๋“ ๋‹ค.
Make_Set(x){
    p[x] <- x;
}

// ๋…ธ๋“œ x๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ๊ณผ ๋…ธ๋“œ y๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ํ•ฉ์นœ๋‹ค.
Union(x, y){
    p[Find_Set(y)] <- Find_Set(x);
}

// ๋…ธ๋“œ x๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ์•Œ์•„๋‚ธ๋‹ค. ๋…ธ๋“œ x๊ฐ€ ์†ํ•œ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.
Find_Set(x){
    if(x=p[x]) then return x;
    else return Find_Set(p[x])
}

์—ฐ์‚ฐ์˜ ํšจ์œจ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•

 

๋žญํฌ๋ฅผ ์ด์šฉํ•œ Union

  • ๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹ ์„ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด๋ฅผ Rank๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•œ๋‹ค.
  • ๋‹จ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ๋œ ํŠธ๋ฆฌ์˜ ๋†’์ด๋Š” 0์ด๋ผ๊ณ  ์ •์˜ํ•œ๋‹ค.
  • ๋ฃจํŠธ ๋…ธ๋“œ์˜ ๋žญํฌ๊ฐ€ ํ•ด๋‹น ์ง‘ํ•ฉ์˜ ๋žญํฌ๊ฐ€ ๋œ๋‹ค.

 

๊ฒฝ๋กœ ์••์ถ•

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

 

๋Œ“๊ธ€