问题描述
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 中将运行时间视为线性。严格来说,它是超线性的。
您可以通过阅读该书来了解更多信息。