최근 수정 시각 : 2016-08-02 16:28:45

Disjoint-set

1. 무엇인가?

집합을 미친듯이 빠르게 구하는 자료구조이다.

2. 시간 복잡도

최악의 경우 O(α(n))O(\alpha(n))이다. (α는 아커만 함수의 역함수)

3. 어떻게 구현하는가?

트리의 노드 x,yx, y에 대해
  • {{{ find-root(x)

    • if u.parent == x then

        return x

      return find(u.parent)
}}}
  • {{{ merge(x, y)

    • z = find-root(x)
      w = find-root(y)
      w.parent = z
}}}
  • {{{ create(u)

    • u.parent = u;
}}}
연산자 정의를 이렇게 하면 트리의 균형이 안 맞아 매우 불완전한 Disjoint-set을 만들 수 있다. 최악의 경우 O(n)O(n)의 시간 복잡도가 된다.

x부터 root까지의 경로를 줄이고
  • {{{ find-root(x)

    • if u.parent == x then

        return x

      return u.parent = find(u.parent) //path compression이라 부른다.
}}}
합병을 O(logn)O(log n)로 좀 더 효율적으로 구현하면
  • {{{ merge(x, y)

    • z = find-root(x)
      w = find-root(y)
      if z.rank == w.rank then

        z.rank = z.rank + 1
        w.parent = z

      else if z.rank > w.rank then

        w.parent = z

      else

        z.parent = w
}}}
O(α(n))O(\alpha(n))만큼의 시간이 걸린다.

4. 출처

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-design-and-analysis-of-algorithms-spring-2012/lecture-notes/MIT6_046JS12_lec16.pdf를 참고함.