<
Union-Find Algorithm
>
🌠다음 포스팅🌠

Mutex VS Semaphore
☄이전 포스팅☄

2021-06-12-CODE-REVIEW
Graph Algorithm Essential Theory

2021-06-13-Algo-REVIEW

Graph Algo?

  Graph Tree
방향성 방향 그래프 혹은 무방향 방향 그래프
순환성 순환 혹은 비순환 비순환
루트 노드 존재 여부 루트 노드 없읍 루트 노드 존재
노드간 관계성 부모와 자식 관계가 없음 부모와 자식 관계
모델의 종류 네크워크 모델 계층 모델
  Memory space Time
인접 행렬 O(V2) O(1)
인접 리스트 O(E) O(V)

서로소 집합 (Disjoints Sets)

1. Union

 private static void union(int a, int b){
        a=find(a);
        b=find(b);
        if(a<b) parent[b]=a;
        else parent[a]=b;
    }

2. Find

[비대칭 트리구조]
private static int find(int x){
        if(x==parent[x]) return x; // 자기 자신의 루트 노드 라는 의미
        return find(parent[x]);
    }

비대칭 트리구조 형태일 경우 연결 리스트 형태로 구성되어 배열로 구현하는 방식보다 시간 복잡도가 O(N) 이 되어 비효율적인 구성이 된다.

비대칭 트리구조

시간 복잡도를 개선하기위해서는 리스트 형태의 트리 구조를 경로압축 과정을 통해 시간복잡도가 O(lonN) 인 균형있는 트리 구조로 개선해야한다.

[대칭 트리구조]
private static int find(int x){
        if(x==parent[x]) return x; // 자기 자신의 루트 노드 라는 의미
        return parent[x]=find(parent[x]);
    }

대칭 트리구조



Union-Find 알고리즘의 무한 순회

  boolean cycle = false;
  
  for(int i=1; i<=e; i++){
  int a= sc.nextInt();
  int b = sc.nextInt();
  if(find(a)==find(b)){
   cycle = true;
   break;
   }
   else
  union(a,b);
  }

최소한의 비용으로 모든 노드를 순회(Kruskal Algorithm)

크루스칼 알고리즘은 신장트리 자료구조를 기반으로 하며 작은 비용으로 모든 노트를 순회를 목적으로 한다. 이때 시간 복잡도는 O(ElogE) 이다.

( 신장트리 : 하나의 크래프가 존재할 때 모든 노드를 포함하면서 사이클이 존재하지 않는 그래프)

  1. 간선의 크기에 따라 오름차순 정렬
  2. 간선을 하나씩 확인하며 현재의 간선이 사이클을 발생하는지 판단(Union-Find Algorithm)
  3. 모든 간선에 대해 2번의 과정을 반복

🙆‍♂ 예시 코드 링크

🧾 Reference

Top
Foot