我正在研究有關不相交集合的算法。不相交集查找和聯合操作的複雜性
和Fast FIND Implementation (Quick Find)
的數據結構的章節如下:
例如)
int array[5]
[0] = 3,
[1] = 5,
[2] = 7,
[3] = 1,
[4] = 2,
在[number] = set name
(上面的例子),數量是在該組名稱的元素。
所以,編號0是在該組3,編號1是在該組5,...,等等
要做到聯盟(A,B)(假定是集合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個工會採取爲O(n^2)時間在最壞的情況下。如果有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
我沒有得到「如果有**少** FINDs ,這種複雜性是不可接受的。「 – xaxxon