Union Find알고리즘은 Heap과같이 기준을 바탕으로 우선순위를 두고 Tree형태로 데이터를 관리할 자신과 연결된 노드들의 집합에 한해서 우선순위가 가장높은 부모노드를 O(1) 찾을 있게하는 알고리즘이다.

 

1. 초기화

특정한 배열에 대하여 처음 초기화를 때는 모든 노드가 서로 연결되어있지 않으므로 자기 자신이 루트 노드가 된다.

때문에

자신(index) 루트 노드를 나타내는 배열 tree 존재한다면

tree[5] = {0, 1, 2, 3, 4}

와같이 자기자신이 루트임을 나타내는 배열 형태를 있다.

 

 

2. find

Find함수는 말그대로 특정 인덱스에 대하여 연결된 노드 루트 노드가 무엇인지 찾아가는 function이다.

여러 개의 노드들과 연결되어있는 경우를 커버하기 위해 재귀를 통해서 find(index) 재귀함수로 구현한다.

재귀함수를 통해 최종적으로 해당 노드와 연결된 그룹 가장 상위 노드의 index값을 있다.

 

 

3. Union

union구조는 서로 연결되어있지 않은 노드들을 연결해주는 function이다.

구현에 따라 min, max, 처음 오는 파라미터 parent 되는 기준을 적용시켜 union작업을 진행한다.

 

먼저 합치고자하는 각각의 노드가 어느 그룹에 속해져있을 있기 때문에 각각 노드들의 최상위 index값을 찾아준다.

그리고 찾은 index값에 대하여 tree[] 배열에 업데이트를 해줌으로써 노드간의 연결은 종료된다.

 

 

4. 구현



#include <iostream>
using namespace std;
const int32_t MAX_SIZE = 32;
int32_t tree[MAX_SIZE];
void inits(void) {
    for (int32_t i=0; i<MAX_SIZE; i++) {
        tree[i] = i;
    }
}
int32_t find(int32_t i) {
    if (tree[i] == i) {
        return i;
    }
    int32_t y = find(tree[i]);
    tree[i] = y;
    return y;
}
void unions(int32_t parent, int32_t child) {
    int32_t x = find(parent);
    int32_t y = find(child);
    tree[find(y)] = x;
}
int32_t main (void) {
    inits();
    cout<<find(5)<<endl;
    unions(2,5);
    cout<<find(5)<<endl;
    unions(1,2);
    cout<<find(5)<<endl;
    return 0;
}

'Algorithm > Samsung Expert' 카테고리의 다른 글

[Algorithm] 2-SUM 알고리즘  (0) 2022.10.10
[Algorithm] Trie(트라이) 알고리즘  (0) 2022.08.31
[Algorithm] 구간 질의  (0) 2022.08.31
[Tree] Red-Black 트리  (0) 2022.08.19
[삼성 알고리즘] Merge 알고리즘  (0) 2021.01.29

+ Recent posts