不相交集找到&工会运作的复杂性

时间:2016-10-06 06:43:50

标签: c algorithm union-find

我正在研究关于不相交集的算法。

Fast FIND Implementation (Quick Find)

的章节

数据结构如下所示:

例如)

int array[5]

[0] = 3,
[1] = 5,
[2] = 7,
[3] = 1,
[4] = 2,

[number] = set name(上例)中,number是集合名称中的元素。

因此,数字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)。无法想象这种复杂性,就像我上面写的代码一样。

1 个答案:

答案 0 :(得分:2)

我们希望尽可能减少所有操作的总体复杂性。

总复杂度=复杂度(FIND)+复杂度(UNION)

正如你所说,如果我们得到一个n - 1联合序列在最坏的情况下花费O(n ^ 2)时间。并且发现平均需要O(1)。

因此,对于n-1联合运算,在不增加大于O(n ^ 2)的总复杂度的情况下,我们可以提供多少找到。

  

答案是O(n ^ 2)可以支持查找操作。

只要FIND的数量是&lt; = O(n ^ 2),UNION的数量是&lt; = O(n)。复杂性保持不变。

一般规则:较重的操作(更耗时)应使用较少的次数,因为较轻的操作重量和较轻的操作应使用重量的次数更重的操作。

我希望这已经足够了。