【问题标题】:union find set algorithm return parent[v] = find_set(parent[v]); meansunion find set 算法 return parent[v] = find_set(parent[v]);方法
【发布时间】:2020-09-25 19:46:37
【问题描述】:
int find_set(int v) {
if (v == parent[v])
    return v;
return parent[v] = find_set(parent[v]); }

这是disjoin set算法的一段代码 请问return parent[v] = find_set(parent[v]);的意义和目的是什么? 通常返回的是整数、布尔值或其他数据类型。

【问题讨论】:

    标签: disjoint-sets disjoint-union


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 实际上该行是将两行压缩为一个(将根设置为当前节点的父节点并返回根),仅在 C 系列等少数语言中可用。如果你不包括返回,那么你的函数将是无效的。您希望始终返回根,路径压缩是第一个 (parent[v] = find_set(parent[v])),find_set 代码是第二个(返回根 -> 由于路径压缩,它是 parent[v])
    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2016-05-03
    • 2011-05-22
    相关资源
    最近更新 更多