并查集
1.什么是并查集
并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题。它可以支持两种操作
(1) 将两个不相交的集合合并
(2) 判断两个元素是否在一个集合中
两种操作的时间复杂度近乎 O ( 1 ) O(1) O(1)。
2.并查集的存储结构
并查集是一种树形结构,换句话说,就是每个集合用一棵树表示。这个集合的编号就是这棵树的树根。我们用一个数组p来存储每个节点的父节点的编号,即 p [ x ] p[x] p[x] 表示编号为 x x x 的结点的父节点的编号为 p [ x ] p[x] p[x] 。
初始化:把每个点所在集合初始化为自己,即 p [ x ] = x p[x] = x p[x]=x 。
3.并查集的两个操作
(1) 判断两个元素是否在同一个集合中
如果两个元素在同一个集合中,表示它们所在的树是同一棵树,也即它们的祖宗结点相同。所以我们可以设计一个 f i n d find find 函数,返回祖宗结点,而祖宗结点的父节点就是它本身,故有 p [ x ] = = x p[x] == x p[x]==x 。
//返回编号为x的结点的祖宗结点编号
int find(int x){
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
(2) 合并两个不相交集合
所谓合并两个集合,其实就是让一棵树的根节点作为另一棵树的子节点。
void union(int[] p, int a, int b){
p[find(a)] = find(b); //a的祖宗结点find(a) 作为 b的祖宗结点find(b)的子节点
}
4.并查集的应用
(1) K r u s k a l Kruskal Kruskal 算法
(2) 实际问题如:若某个家族人员过于庞大,求任意给出的两个人是否具有亲戚关系。
更多Java内容欢迎扫码关注我的公众号ACJavaBear,文章第一时间会发在上面。一起学Java吧