改进路径压缩

如果我们在 union-find 数据结构上做了很多 merge 操作,parent 指针所代表的路径可能会很长。如理论部分所述,路径压缩是一种缓解此问题的简单方法。

我们可能会尝试在每次第 k 次合并操作或类似操作之后对整个数据结构进行路径压缩,但是这样的操作可能具有相当大的运行时间。

因此,路径压缩主要仅用于结构的一小部分,特别是我们走过的路径以找到一组的代表。这可以通过在每个递归子查询之后存储 find 操作的结果来完成:

size_t find(size_t i) const {
    if (parent[i] == i)          // If we already have a representative
        return i;                // return it
    parent[i] = find(parent[i]); // path-compress on the way to the representative
    return parent[i];            // and return it
}