코딩성장스토리

유니온 파인드(union find) 본문

자료구조

유니온 파인드(union find)

까르르꿍꿍 2022. 1. 18. 15:11

유니온 파인드

두 노드가 같은 그래프에 있는지 찾는 방법

그래프 알고리즘의 일종으로서 상호 배타적 집합, Disjoint-set

  1. Find -노드 x 가 어느 집합에 포함되어 있는지 찾는 연산
  2. Union-노드 x가 포함된 집합과 노드 y가 포함된 집합을 합치는 연산

 

 

parent[i]는 i의 부모가 무엇인지 나타내는 것,

parent[i] =i 는 i가 루트 노드임을 나타냄(부모가 본인이므로)

 

 

find함수 구현

int find(int x){
  if (x==parent[x]){
    return x;
  }
  else {
    return find[parent[x]];
  }
}

루트를 찾아 반환  하지만 이 함수의 문제점은 한쪽방향으로 치우칠 수 있다.(트리의 장점 소실)

이를 고치기 위해 오른쪽노드를 모두 루트노드에 연결하게 구현

int find(int x){
  if (x==parent[x]){
    return x;
  }
  else{
    int y = find(parent[x]);
    parent[x] = y;
    return y;
  }
}

유니온 함수 구현

union(x,y)- y의 parent를 x로 삼는다

ex)union(1,2) 라는 함수는 2의 노드가 1의 노드 자식으로 붙게 됨을 의미

void union(int x,int y){
  x = find(x);
  y = find(y);
  parent[y] = x;
}

'자료구조' 카테고리의 다른 글

set ,그리고 iterater 반복자  (0) 2022.01.26
순열  (0) 2022.01.12
브루트 포스(Brute force search):완전탐색  (0) 2021.10.19
트리  (0) 2021.10.11
그래프  (0) 2021.10.01