먼저 두 가지 경로 압축 사진을 살펴 보겠습니다.
Union-Find 세트는 매우 섬세하고 실용적인 데이터 구조로, 주로 일부 비립 세트의 병합 문제를 처리하는 데 사용됩니다. 일부 일반적인 용도로는 서브 그래프 연결, 최소 스패닝 트리를 찾기위한 Kruskal 알고리즘 및 LCA (Little Common Acesters)가 포함됩니다.
세트를 사용하고 찾을 때, 먼저, 정수를 사용하여 세트의 요소를 나타내는 정수를 사용하는 일련의 분리 된 동적 세트 세트가 있습니다.
각 세트에는 하나 이상의 요소가 포함될 수 있으며 세트의 요소는 대표자로 선택됩니다. 각 세트에 어떤 요소가 포함되어 있는지 관리하는 것은 중요하지 않으며, 어떤 요소가 대표자로 선택되는지 관리하는 것은 중요하지 않습니다. 우리가 관심을 갖는 것은 주어진 요소의 경우이 요소가 위치한 세트 (표현)를 빠르게 찾을 수 있고 두 요소가 위치한 세트를 병합하고 이러한 작업의 시간 복잡성이 일정하다는 것입니다.
확인 및 수집을위한 세 가지 기본 작업이 있습니다.
Makeset : 단일 요소 세트가 포함 된 새 및 검색 세트를 만듭니다.
유니온 세트 (x, y) : 요소 X와 요소 Y가 위치한 세트를 병합하고 X와 Y가 위치한 세트가 교차하지 않아야하며 교차하는 경우 병합되지 않습니다.
찾기 (x) : 요소 X가있는 세트의 대표자를 찾으십시오. 이 작업을 사용하여 두 요소가 동일한 세트에 있는지 여부를 결정할 수도 있습니다. 각자의 대표자를 비교하십시오.
패키지 com.datrastructure.union_find; // 우리의 다섯 번째 판은 Union-FindPublic Class UnionFind5 {// rank [i]는 후속 코드에서 i //에 의해 루팅 된 세트로 표현 된 트리의 층 수를 나타냅니다. 순위의 반의 반응을 유지하지 않을 수도 있습니다. 깊이. 비교 개인 int [] 순위의 표준 일뿐입니다. 개인 int [] 부모; // 부모 [i]는 i-th 요소 private int count에 의해 가리키는 부모 노드를 나타냅니다. // 데이터 수 // 생성자 public UnionFind5 (int count) {rank = new int [count]; 부모 = new int [count]; this.count = count; // 초기화, 각 부모 [i]는 자체를 가리키며, 각 요소는 자체 세트를 형성 함을 나타냅니다 (int i = 0; i <count; i ++) {parent [i] = i; 순위 [i] = 1; }} // 검색 프로세스, 요소 p // o (h) 복잡성에 해당하는 설정 번호를 찾으십시오. // 경로 압축 1 while (p! = parent [p]) {parent [p] = parent [parent [p]]; p = 부모 [p]; } 반환 p; // 경로 압축 2, 재귀 알고리즘 // if (p! = parent [p]) // parent [p] = find (parent [p]); // parent [p]; } // 요소 P와 요소 Q가 세트에 속하는지 확인 // o (h) 복잡성, h는 나무의 높이인지 public boolean isconnected (int p, int q) {return find (p) == 찾기 (q); } // 요소 P와 요소 Q가 속한 세트를 병합 // o (h) 복잡성, h는 트리의 높이 공개 void union elements (int p, int q) {int proot = find (p); int qroot = find (q); if (proot == qroot) 반환; // 두 요소가 위치하는 트리의 다른 수의 요소를 기준으로 병합 방향을 판단하십시오. // 요소가 적은 요소가있는 세트를 더 많은 요소가있는 세트에 합병하십시오. } else if (rank [qroot] <rank [proot]) {parent [qroot] = proot; } else {// rank [proot] == rank [QROOT] 부모 [proOT] = QROOT; 순위 [QROOT] += 1; // 현재 순위의 값을 유지합니다}}}요약
위의 내용은 Java 프로그래밍 구현 및 수집에 대한이 기사에서 경로 압축 코드에 대한 자세한 설명입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!