并查集(Disjoint-set):维护若干不相交集合,支持合并与判定同属一集合,近似常数时间(反阿克曼函数级)。
Description: Disjoint-set data structure. Time:
-
结构与字段(据实现)
- 结构体 UF 含成员
vi e,长度为 n;根结点存储为负数,其绝对值表示该集合大小;非根结点存父指针索引。 - 构造:
UF(int n) : e(n, -1)初始化 n 个独立元素,各自为根且大小为 1。
- 结构体 UF 含成员
-
接口与语义
int find(int x):路径压缩查找,若e[x] < 0则 x 为根;否则递归并将e[x]直接挂到根(e[x] = find(e[x]))。bool sameSet(int a, int b):判断find(a) == find(b)。int size(int x):返回-e[find(x)],即 x 所在集合的当前大小。bool join(int a, int b):按大小合并(按e[a]与e[b]的数值比较,注意更“小”的负数表示更“大”的集合):- 若已同集合返回 false;
- 否则保证 a 为更大的根,执行
e[a] += e[b]; e[b] = a;,返回 true。
-
复杂度
- 采用路径压缩与按大小合并,单次操作的摊还复杂度为 O(α(N))。