并查集(union-find sets)也称不相交集合数据结构(disjoint-set data structure),它保持一组不相交的动态集合S = { S1,S2,…Sk }.每个集合通过一个代表来识别,该代表是集合中的某个成员.并查集能够实现较快地合并集合和判断元素所在集合的操作.
用有根数表示集合实现并查集:
通过引用两种启发式策略(按秩合并和路径压缩)就可以达到渐进意义上最快的不相交集合数据结构.
它的三种操作如下所示:
1.make_set(x)建立一个新的集合,其中集合只有唯一的一个元素x
2.union_set(x,y) 按秩合并x,y所在的集合
3.find_set(x)返回x所在的集合的代表
用有根数表示集合实现并查集:
static int MAXN = 100; /*结点数目上线*/
int pa[MAXN]; /*p[x]表示x的父节点*/
int rank[MAXN]; /*rank[x]是x的秩:x的高度的一个上界*/
public void make_set(int x) { /*创建一个单元集*/
pa[x] = x;
rank[x] = 0;
}
public int find_set(int x) { /*带路径压缩的查找*/
if(x != pa[x]) {
pa[x] = find_set(p[x]);
}
return pa[x];
}
/*按秩合并x,y所在的集合*/
void union_set(int x, int y) {
x = find_set(x);
y = find_set(y);
if(rank[x] > rank[y]) /*让rank比较高的作为父结点*/
pa[y] = x;
else {
pa[x] = y;
if(rank[x] == rank[y])
rank[y]++;
}
}
本文详细介绍了一种高效的数据结构——并查集(Union-Find Sets),包括其基本概念、实现方式及核心操作。并查集利用有根树表示集合,通过按秩合并和路径压缩策略优化性能。
425

被折叠的 条评论
为什么被折叠?



