Data Structures for Disjoint Sets

각각 다른 원소들을 서로 겹치지 않는 집합으로 나눈다.
각 set에서 그 set에 포함된 원소 중 하나가 대표를 맡는다.
union & find 의 기능이 있다.

n개의 원소가 있을 때 맨 처음에 n번의 make-set을 한다.
그다음부터는 union을 할 때마다 set의 수를 하나씩 감소시키므로 union은 최대 n-1번 할 수 있다.

Linked-list를 이용한 구현
각각의 원소들은 그 원소가 포함된 set의 대표에도 연결돼있고 next node도 가리킨다.
make-set은 그냥 하나의 list를 만드는 거니까 O(1)의 시간이 걸린다.
find-set은 대표 포인터를 반환하므로 O(1)이 걸린다.
union은 첫번째의 tail을 두번째의 head와 연결하면 되지만 합쳐지는 list에서 대표로 가는 포인터를 업데이트 해야 하므로 linear time만큼 걸린다.
따라서 n번의 make-set과 n-1번의 union을 하면 O(N^2)이 걸린다.

Weighted-Union Heuristic
단순히 첫번째꺼에 두번째꺼를 연결하는 것이 아니라 각 리스트의 길이를 알고 있어서 짧은 리스트를 긴 리스트에 연결한다.

Forest 방식의 구현
각 멤버는 자기의 부모만 가리킨다.
각 트리가 하나의 set이고 각 루트는 대표이다. 대표는 부모 대신 자기 자신을 가리킨다.
make-set은 하나의 노드가 있는 트리를 만드는 것이다.
find-set은 그 트리의 높이만큼 시간이 걸린다.
union에서 시간이 절약된다. 단순히 한 트리의 루트가 다른 트리의 루트를 가리키면 된다.

Union by Rank
union 할 때 작은 rank를 갖고 있는 루트가 큰 rank를 갖고 있는 루트를 가리키도록 한다.

Path Compression
find를 하고 나면 그 원소가 원래는 부모를 따라서 루트로 올라가야 했는데 루트까지 올라갔으므로 부모를 바로 루트로 설정한다.





댓글

이 블로그의 인기 게시물

논문 정리 - MapReduce: Simplified Data Processing on Large Clusters

논문 정리 - The Google File System

kazoo: Using zookeeper api with python