联合查找集算法返回parent [v] = find_setparent [v];手段

问题描述

int find_set(int v) {
if (v == parent[v])
    return v;
return parent[v] = find_set(parent[v]); }

这是不相交集算法的代码片段 我可以问一下return parent [v] = find_set(parent [v]);的含义和目的是什么? 通常返回的是整数,布尔值或其他数据类型。

解决方法

这行代码(parent[v] = find_set(parent[v]);)是一种启发式优化,称为路径压缩,这是一种简单而高效的启发式方法。路径压缩使find_set路径上的每个节点都直接指向根。之前在路径中任何节点上对find_set的进一步调用将非常快。这种启发式方法的时间复杂度如下所示。

如《算法简介》(Cormen,第571-572页)第三版中所述:

单独按等级合并会产生运行时间 的 O(m log n)的范围,这个界限很严格。 尽管我们不会在这里证明它,但是对于n个MAKE-SET操作的序列 (因此最多是 n-1 个UNION操作)和f个FIND-SET操作, 仅路径压缩启发式给出的最坏情况运行时间为 O(n + f *(1 + log 2 + f / n n))

>

当我们同时使用等级压缩和路径压缩并集时,最坏情况下的运行 时间是 O(mα(n)),其中α(n)是一个非常缓慢的增长函数,我们定义 在第21.4节中。在任何不相交集数据结构的可能应用中, α(n)≤4 ;因此,在所有实际情况下,我们都可以在 m 中将运行时间视为线性。严格来说,它是超线性的。

您可以通过阅读该书来了解更多信息。