불연속 집합에 대한 알고리즘을 연구 중입니다. 불연속 집합 찾기 및 결합 연산의 복잡성
그리고Fast FIND Implementation (Quick Find)
데이터 구조의 제는 다음과 같다 : 예
) 실시 예 상술 [number] = set name
에서
int array[5]
[0] = 3,
[1] = 5,
[2] = 7,
[3] = 1,
[4] = 2,
(), 숫자 세트 이름의 원소이다.
그래서, 숫자 0 등 번호 1 세트 5, ...로하고, 세트 3에
연합 (a, b) (a가 세트 I 및 B는 것을 가정 수행 집합 j에 있음), O (n) 연산이 필요합니다. 나는이 사실을 알고. 그 이유는 다음과 같습니다 (의사 코드) : 책에
void Union(a, b) {
int set1 = Find(a); /* set 1 will be 'i' */
int set2 = Find(b); /* set 2 will be 'j' */
if(set 1 != set2)
for(int i = 0; i < sizeof(array); i++) { /* O(n) operation */
if(array[i] == set1)
array[i] = set2;
}
}
그러나, 나는 이것을 이해할 수 없다 :
이N의 순서 - 1 개 노조 (N^2) 시간이 O를 가지고 최악의 경우. O (n^2) FIND 연산이있는 경우 각 UNION 또는 FIND 연산에 대한 평균 시간 복잡도가 O (1)이므로이 성능이 좋습니다. FIND가 적 으면이 복잡성이 허용되지 않습니다.
나는이 문장의 의미가 무엇이고 왜 복잡성이 O (n^2)인지 이해할 수 없다. 위에서 작성한 코드처럼이 복잡성을 상상할 수는 없습니다.
왜 n-1 조합 연산은 O (n^2)를 필요로합니까? – allen
@allen '원인으로 인해 하나의 공용체가 O (n) 시간 걸리고 (n-1) * O (n) = O (n^2) – v78
"** 더 적은 ** FIND가있는 경우 이 복잡성은 받아 들일 수 없다. " – xaxxon