【数据结构】并查集

并查集:是一种树型的数据结构,时间复杂度近似O(1),用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。其特点是看似不复杂,但数据量极大,使用正常的数据结构会导致占用的空间过大,即使占用空间不成问题,但它的时间复杂度也是极高

常见应用场景:在一些有N个元素的集合应用问题中,通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。

基本操作:

  1. 初始化:在开始将每个元素单独化成一个集合,其集合的标志/代表为元素本身
  2. 查询:找到查询元素所在的集合的标志/代表
  3. 合并:将两个集合合在一个大集合,即两个集合的一个集合标志/代表成为另一个集合标志/代表的子结点

基本原理:将每个集合用一棵树来表示。根节点的编号就是整个集合的编号,每个节点都存储它的父节点,例:p[x] 代表的是 x 的父节点

int p[N];//存放节点i的父节点

编写中产生的问题及解决方案:

问题编号问题描述解决方案
问题一如何判断树根if ( p[x] == x)
问题二如何求x的集合编号while ( p[x] != x){ x = p[x]}
问题三如何合并两个集合p[x] = y,y表示另一个集合的树根

如何降低时间复杂度?

 答:路径压缩,在查询父节点的过程中,当集合中的元素查询过自己的树根后,会将自己以及查询经过元素的父节点都直接指向根节点。

查询代码:

//查找父节点并返回 + 路径压缩
int find(int x){
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

合并代码:

p[find(a)] = find(b);

例题: 合并集合(并查集)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏大橙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值