ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니온 파인드 최적화
    Problem Solving 2024. 8. 11. 13:55

    여러 최적화 방법이 있겠지만 내가 배운 최적화 3가지 작성

     

    1. find에서 수장 지정하면서 재귀

    당연하게 사용하고 있는 방법

     

    int find(int x) {
        return u[x]<0?x:u[x]=find(u[x]);
    }

     

    u[x] 에 내가 찾은 수장을 지정하면서 복귀한다.

     

     

    2. 합치는 연산 uni 최적화

    트리의 높이를 저장하는 rank 배열을 하나 더 만들고 트리가 낮은 집합을 큰 집합 아래로 가게 한다

    만약 크기가 같다면 rank를 +1 한다

     

    이러면 find 시에 최악에 O(n)을 피할 수 있음

     

    if(rank[u] > rank[v]) swap(u, v);

    parent[u] = v;

    if (rank[u] == rank[v]) ++rank[v];

     

     

    3. 집합의 크기를 음수로 저장하기

     

    유니온파인드 

    -1로 두고

     

    수장은 음수 이면서 집합의 크기를 담기 위해

    u[a]+=u[b] 로 해주고

    부하들은 u[b]=a 로 양수로 표현해준다

     

    그리고 find 할땐

    int find(int x){return u[x]<0?x:u[x]=find(u[x]);}

     

    로 음수면 수장이니 수장 번호 리턴

    아니면 수장 찾아가기

    'Problem Solving' 카테고리의 다른 글

    그래프 알고리즘 정리  (0) 2024.09.08
    트라이, 아호 코라식  (0) 2024.08.11
    세그먼트 트리, 펜윅 트리  (0) 2024.08.11
    Z 알고리즘  (0) 2024.02.10
    LCA 구현 (Lowest Common Ancestor)  (0) 2023.10.07
Designed by Tistory.