并查集

并查集是一种高效处理集合查询与合并的数据结构,常用于判断元素是否属于同一集合及集合合并。其核心操作find和union支持O(1)时间复杂度,通过路径压缩优化可达到近乎常数时间。路径压缩通过一次查找过程中改变连接关系,减少后续查找的复杂度。并查集在图论、树结构等问题中广泛应用,如判断图中节点是否连通、计数等。常见操作包括元素集合归属查询、集合合并,以及衍生的元素个数查询和集合总数查询等。
摘要由CSDN通过智能技术生成

并查集

并查集,简单来说,是一种用来解决集合查询合并的数据结构。支持支持O(1)查询(find),和O(1)合并(union)。

1. 并查集可以干什么

  1. 判断两个值是否在同一集合(find 操作)
  2. 将两个集合合并(union 操作)

2. 并查集的时间复杂度

上面说find和union是O(1)的,但准确来说是logn,注意这个和logn是不一样的,这logn大家可以查一下,它在n很大很大的时候,它仍然很小很小。所以我们才说是O(1)。

3. 查询find和合并union的模板(C++)

int find(int x) {
	if (x == father[x]) {
		return x;
	}
	return father[x] = find(father[x]);//压缩路径的写法
}

void Union(int a, int b) {
	int root_a = find(a);
	int root_b = find(b);
	if (root_a != root_b) {
		father[root_a] = root_b;
	}
}

这里有一个路径压缩的概念,是这样的:比如1->2->3->4->5…->n("->"代表两点相连),此时要找n时,那先找1,在通过1找到2,以此类推找到n,如果每次find时,都进行这样的操作的话,这时find的操作就会是O(n)的。而路径压缩指的是,你第一次find时,寻找n的过程中,改变连接关系,使得第一次寻找完之后,连接关系变为1->n,2->n,3->n,4->n,5->n,以此类推,也就是说,所有点在第一次操作之后都连向同一个“父亲”节点。上面father[x] = find(father[x]);语句,就可以实现这个。
如果不进行路径压缩的话,那朴素的find方法如下:

int find(int x) {
	if (x == father[x]) {
		return x;
	}
	return find(father[x]);//朴素方法 O(n)的
}

4. 并查集的操作

4.1 并查集原生操作:

  1. 查询两个元素是否在同一个集合内
  2. 合并两个元素所在的集合
    例题:https://www.jiuzhang.com/solutions/connecting-graph/

4.2 并查集的派生操作:

  1. 查询某个元素所在集合的元素个数
    例题:http://www.jiuzhang.com/solutions/connecting-graph-ii/
  2. 查询当前集合的个数
    例题:
    (1)http://www.jiuzhang.com/solutions/connecting-graph-iii/
    (2)【并查集】Leetcode 547.省份数量
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值