我正在研究关于不相交集的算法。
和章节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 组中,等等。
要进行 Union(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 个联合需要 O(n^2) 时间。如果有 O(n^2) 次 FIND 操作,则此性能很好,因为每个 UNION 或 FIND 操作的平均时间复杂度为 O(1)。如果 FIND 较少,则这种复杂性是不可接受的。
我不明白这些句子的含义是什么,为什么复杂度是 O(n^2)。无法想象我上面写的代码这样的复杂性。