2010-02-13 3 views
5

방금 ​​분해 된 세트 데이터 구조를 연구했고 "조합 찾기 데이터 구조"라고도하며 조합과 찾기가이 데이터 구조의 두 가지 주요 작업이라는 것을 알고 있습니다. 분리 된 세트에서 결합을 수행 할 수 있으며 마찬가지로 찾기 연산을 수행 할 수 있습니다. 저는 union과 find를 제외한 disjoint set에서 수행 할 수있는 다른 연산을 알고 싶습니다.분리 된 세트에서 수행 할 수있는 조작은 무엇입니까?

답변

3

분리 세트 구조는 "공용 구조 찾기"라고도합니다. 따라서 union, findMakeSet 작업을 지원해야합니다. 다른 작업은이 구조가 무엇인지에 관한 것이 아니며 지원 여부는 구현 및 목표에 달려 있습니다. 때로는 프로젝트의 추가 작업 요구에 맞게 특정 구현을 구체적으로 선택해야 할 수도 있습니다.

다른 기본 세트 관련 작업을 지원하면 좋을 것입니다. 그들을 열거하자 :

  • 교차 2 세트. 세트가 서로 섞이지 않기 때문에이 두 세트가 일치하지 않으면 항상 비어 있습니다.
  • 노조 두 세트 - 상자에서 지원됩니다.
  • 세트에서을 얻으십시오 - 지원 가능성은 대체로 find입니다.
  • 요소 집합을에서 삭제 - 구현에 따라 다름 세트가 포리스트로 구현되는 경우 까다 롭고 느린 추가 작업이 필요합니다. 세트가 링크 된 목록으로 구현되면 간단합니다.
  • 집합을 열거합니다. 즉, 주어진 집합의 각 요소를 반복합니다. 이것은 구현에 따라 달라집니다. 연결 목록의 경우 간단하지만 포리스트와 유사한 구현을 위해서는 추가 구조가 필요합니다.
2

바닐라 공용 구조체 찾기 데이터 구조를 사용하면 실제 집합을 열거 할 수 없으므로 많은 집합 연산을 사용할 수 없습니다. 이것은 바닐라 버전에서는 포인터가 한 방향으로 만 있기 때문입니다. 아래 그림에서 모든 대각선은 위쪽 화살표에 해당하고 루트 (위쪽 줄)는 집합의 루트 객체입니다.

 o [set1]   o [Set2] 
    /\    \ 
    o o    o 
/
o 

따라서 집합 1의 모든 개체를 찾을 방법이 없습니다. 예를 들어 루트 노드에서 경로를 추적 할 수 없습니다. 포인터도 아래쪽으로 가질 수 있지만 데이터 구조에 오브젝트가 임의의 수의 부모를 가질 수 있기 때문에 데이터 구조가 상당히 복잡해집니다.

그래서 다음과 같은 작업을 위해 정말 대부분의 :

  • 대답 : 수행 내 개체 A와 B가 동일한 세트에 속하거나하지? 세트의 모든 오브젝트는 이제

이 정교한 동일한 세트에 속하는 것으로 간주되도록

  • 합치기 S1과 S2를 설정 유니온 세트의 데이터 구조를 지원하는 동작을 아주 낮은 시간 복잡도를 갖는다 ; 병합 집합과 동일한 집합 질의에 응답하는 것은 상환 시간을 상각합니다 (O (1)). 이 시간 복잡성 때문에 모든 세트 작업을 지원할 수 없습니다.예를 들어, 표준 집합 표현은 [binary] 탐색 트리에 의한 것입니다. 여기서 대부분의 연산은 O (log n) 복잡도를가집니다.

  • 0

    union-find disjoint set 구조의 요점은 질문과 다른 응답자가 제안하는 것처럼 기본 설정 작업을 수행하는 것에 그다지 중요하지 않습니다. 대신 특정 알고리즘에 필요한 구조를 매우 효율적으로 구현하는 것입니다. 특히 연결된 구성 요소와 최소 스패닝 트리를 찾는 것이 가장 효율적인 구현을 union-find disjoint set 위에 구축합니다.