改进路径压缩
如果我们在 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
}