그래프 알고리즘 기초 - 유니온 파인드


그래프 알고리즘 기초 - 유니온 파인드

  • 유니온 파인드 알고리즘(Union-Find)

    여러 노드가 주어 졌을 경우 두개의 노드를 1개의 집합으로 묶는 Union 연산과 같은 집합인지 확인하는 Find 연산으로 구성 되어있다.

1차원 배열을 사용 하여 유니온파인드 알고리즘 구현 방법

      private static int[] graph;
      @Test
      void 그래프변환(){
          graph = new int[5 + 1];  // 노드 개수(N) 만큼 생성
          for(int i = 1; i < graph.length; i++){
              graph[i] = i;  //노드값 초기화
          }
  
          // 예 :  1, 3, 4, 5 는 연결선을 가지고 있다. 
          // 2는 연결선을 가지고 있지 않다.
          union(1, 3);
          union(3, 4);
          union(3, 5);
  
          System.out.println(Arrays.toString(graph)); // 출력 값 : [0, 1, 2, 1, 1, 1]  
                                                      // 1,3,4,5 는 1번을 상위 노드로 하나의 집합이다. 
                                                      //  2는 자기 자신이 상위 노드로 하나의 집합이다.
          System.out.println(find(2)); // 출력 값 : 2
          System.out.println(find(5)); // 출력 값 : 1 // 5 -> 3 -> 1 순으로 상위 노드를 찾는다.
      }
  
      private void union(int x, int y){
          x = find(x); // 입력 받은 X의 상위 노드 찾기
          y = find(y); // 입력 받은 Y의 상위 노드 찾기
  
          if(x == y) return; // 같은 그래프에 속해 있다면 리턴.
          if(x <= y) {       //작은 노드를 업데이트 한다.
            graph[y] = x;
          }else{
            graph[x] = y;
          }
      }
  
      private int find(int x){
          if(graph[x] == x){
              return x;
          }
          return find(graph[x]);  // 재귀를 통해서 상위 노드를 찾아 나간다.
      }

Back to blog