并查集Java代码模板

并查集

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吧
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值