๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜/ETC

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

Amenable 2023. 3. 1. 11:48

1. ์„œ๋กœ์†Œ ์ง‘ํ•ฉ์˜ ๊ฐœ๋… ๋ฐ ์ดํ•ด ๐Ÿ›บ

1. ๊ฐœ๋…

  • ์„œ๋กœ์†Œ ์ง‘ํ•ฉ์ด๋ž€ ์„œ๋กœ ์ค‘๋ณต ํฌํ•จ๋œ ์›์†Œ๊ฐ€ ์—†๋Š” ์ง‘ํ•ฉ์„ ๋งํ•œ๋‹ค.
  • ๊ต์ง‘ํ•ฉ์ด ์—†๋Š”(null) ์ง‘ํ•ฉ์ด๋‹ค.

2. ๋Œ€ํ‘œ์ž

  • ์ง‘ํ•ฉ์— ์†ํ•œ ํ•˜๋‚˜์˜ ํŠน์ • ๋ฉค๋ฒ„๋ฅผ ๋Œ€ํ‘œ์ž๋ผ๊ณ  ํ•œ๋‹ค.
  • ์ด๋Š” ์ง‘ํ•ฉ์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

3. ์˜ˆ์‹œ

  ๋น ๋ฅธ ์ดํ•ด๋ฅผ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž. 5๋ช…์˜ ํ•™์ƒ(A, B, C, D, E)์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

{A}, {B}, {C}, {D}, {E}

  ์•„๋ž˜์™€ ๊ฐ™์€ ์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

A - B
B - C
D - E

  ์นœ๊ตฌ ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด์„œ 2๊ฐœ์˜ ์ง‘ํ•ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

G1 = {A, B, C}
G2 = {D, E}

  ์„œ๋กœ ์ค‘๋ณต ํฌํ•จ๋œ ์›์†Œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ด๋Š” ์„œ๋กœ์†Œ ์ง‘ํ•ฉ์ด๋‹ค. (ํ•œ ์‚ฌ๋žŒ์ด ๋ถ„์‹ ์ˆ ์„ ์จ์„œ ์–‘์ชฝ ์ง‘ํ•ฉ์— ํฌํ•จ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋‹น์—ฐํ•œ ๊ฒฐ๊ณผ์ด๋‹ค.)

 

2. ํ‘œํ˜„ ๋ฐฉ๋ฒ• 2๊ฐ€์ง€ ๐Ÿšœ

1. Linked list (์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)

  • ๊ฐ™์€ ์ง‘ํ•ฉ์˜ ์›์†Œ๋“ค์€ ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.
  • ๊ฐ ๋ฆฌ์ŠคํŠธ์˜ ํ—ค๋“œ(head) ๋ถ€๋ถ„์ด ํ•ด๋‹น ์ง‘ํ•ฉ์˜ ๋Œ€ํ‘œ์ž์ด๋‹ค.
  • ๋…ธ๋“œ์— ํ—ค๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ํฌํ•จ์‹œํ‚จ๋‹ค. (์ด์ „ ์›์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒŒ ์•„๋‹Œ ๋ฐ”๋กœ ํ—ค๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ด์œ ๋Š” ๋’ค์—์„œ ๋‚˜์˜ค๋Š” Path Compression์˜ ๋ฐฉ๋ฒ•์„ ๋ณด๋ฉด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.)

2. Tree (ํŠธ๋ฆฌ)

  • ๋‘ ๊ฐœ์˜ ์š”์†Œ๊ฐ€ ๊ฐ™์€ ํŠธ๋ฆฌ์— ์กด์žฌํ•œ๋‹ค๋ฉด ๊ฐ™์€ ์ง‘ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๋Œ€ํ‘œ์ž๊ฐ€ ๋œ๋‹ค.
    (์นœ๊ตฌ๊ด€๊ณ„์˜ ์˜ˆ์‹œ์—์„œ B์™€ C๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œ C๊ฐ€ A์— ๋ถ™์€ ์ด์œ ๋Š” ๋’ค์— ๋‚˜์˜ค๋Š” ๋‚ด์šฉ์„ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.)

 

3. ์—ฐ์‚ฐ 3๊ฐ€์ง€ ๐Ÿš™

  ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•œ ํŠธ๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ดํŽด๋ณด์ž. ์•„๋ž˜ ๋‘ ๊ฐ€์ง€๋ฅผ ์ž˜ ๊ธฐ์–ตํ•˜๋ฉด์„œ ์ง„ํ–‰ํ•ด๋ณด์ž.

  1. ๋Œ€ํ‘œ์ž๋Š” ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. 
    parents[i] = i
  2. ์ž์‹ ์„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์œผ๋ฉด ํŠธ๋ฆฌ๋ฅผ ํƒ€๊ณ  ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๋Œ€ํ‘œ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. 

1. makeSet()

  ์ž๊ธฐ ์ž์‹ ์ด ๋Œ€ํ‘œ์ž๋กœ ํ•˜๋Š” ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•œ๋‹ค.

static void makeSet() {

    parents = new int[N];

    for(int i = 0; i < N; i++) {
        parents[i] = i;
    }
}

2. findSet(a)

  a๋ฅผ ํฌํ•จํ•˜๋Š” ์ง‘ํ•ฉ์˜ ๋Œ€ํ‘œ์ž๋ฅผ ์ฐพ๋Š”๋‹ค.

static int findSet(int a) {

    if(parents[a] == a) {
        return a;
    }
    else {
        return findSet(parents[a]);
    }
}

3. union(a, b)

  a์™€ b๋ฅผ ํฌํ•จํ•˜๋Š” ๋‘ ์ง‘ํ•ฉ์„ ํ†ตํ•ฉํ•œ๋‹ค.

static void union(int a, int b) {
    int aRoot = findSet(a);
    int bRoot = findSet(b);

    // ์ด๋ฏธ ๊ฐ™์€ ์ง‘ํ•ฉ์ธ ๊ฒฝ์šฐ
    if(aRoot == bRoot) {
        return;
    }

    parents[bRoot] = aRoot;
}

 

4. ๊ฐœ์„ ์  ๐Ÿš›

  ๋Œ€ํ‘œ์ž๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด find๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ํŠธ๋ฆฌ์˜ ํ•˜๋‹จ๋ถ€์— ์žˆ์„์ˆ˜๋ก ๋” ๋งŽ์€ ํƒ์ƒ‰์ด ์š”๊ตฌ๋œ๋‹ค.(๋…ธ๋“œ๋ฅผ ํƒ€๊ณ  ๊ณ„์† ์˜ฌ๋ผ๊ฐ€์•ผ ํ•œ๋‹ค.) ์ฆ‰, ํŠธ๋ฆฌ์˜ ๋†’์ด์— ์˜ํ–ฅ์„ ๋งŽ์ด ๋ฐ›๊ฒŒ ๋œ๋‹ค.
  ํŠธ๋ฆฌ์˜ ๋†’์ด๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด(ํšจ์œจ์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ์œ„ํ•ด) 'Path Compression'๊ณผ 'Union By Rank'๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

1. Path Compression

  ์ด ๋ฐฉ๋ฒ•์€ ๋Œ€ํ‘œ์ž๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ํŠธ๋ฆฌ๋ฅผ ํƒ€๊ณ  ์˜ฌ๋ผ๊ฐ€๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฐ”๋กœ ๋Œ€ํ‘œ์ž๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋Š” find๋ฉ”์„œ๋“œ์—์„œ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

static int findSet(int a) {

    if(parents[a] == a) {
        return a;
    }
    else {
        // ๊ธฐ์กด
        // return findSet(parents[a]);

        // ๋ณ€๊ฒฝ (Path Compression)
        return parents[a] = findSet(parents[a]);   
    }
}

2. Union By Rank

  Union By Rank๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ rank[]๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๋‹ค. rank[i]๋Š” i๋ฅผ ๋ฃจํŠธ๋กœ ํ•˜๋Š” ์„œ๋ธŒํŠธ๋ฆฌ์˜ ๋†’์ด๋‹ค. ๋‘ ์ง‘ํ•ฉ์„ ํ•ฉ์น  ๋•Œ rank๊ฐ€ ๋‚ฎ์€ ์ง‘ํ•ฉ์ด rank๊ฐ€ ๋†’์€ ์ง‘ํ•ฉ ์•„๋ž˜๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.

static void union(int a, int b) {
    int aRoot = findSet(a);
    int bRoot = findSet(b);

    // ๊ฐ™์€ ์ง‘ํ•ฉ์ธ ๊ฒฝ์šฐ
    if(aRoot == bRoot) {
        return;
    }

    int aRank = rank[aRoot];
    int bRank = rank[bRoot];

    if(aRank < bRank) {
        parents[aRank] = bRank;
    }
    else if(aRank > bRank) {
        parents[bRank] = aRank;
    }
    else {
        parents[aRank] = bRank;
        rank[aRank]++;

        // ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ”๋„ ์ƒ๊ด€์—†์Œ
        // parents[bRank] = aRank; 
        // rank[bRank]++;
    }
}

 

5. ์‹œ๊ฐ„๋ณต์žก๋„ & ๊ณต๊ฐ„๋ณต์žก๋„ ๐ŸšŽ

1. ์‹œ๊ฐ„๋ณต์žก๋„

  • makeSet์„ ์ด์šฉํ•˜์—ฌ n๊ฐœ์˜ ์›์†Œ๋กœ ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ : O(n)
  • findSet ๋˜๋Š” union์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ : O(log n)

  ⇒  ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(n + log n)

2. ๊ณต๊ฐ„๋ณต์žก๋„

n๊ฐœ์˜ ์š”์†Œ๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ O(n)

 

 


[์ฐธ๊ณ ์ž๋ฃŒ]

 

Disjoint Set Data Structures - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org