并查集算法

并查集是一种树型数据结构,用于处理不相交集合的合并与查询。基本操作包括Find和Union。通过路径压缩和按秩合并优化,提高查询效率。本文介绍了并查集的原理、操作及实现。
摘要由CSDN通过智能技术生成

并查集(Disjoint-Set)是一种可以动态维护若干个不重叠的集合,并支持合并与查询两种操作的一种数据结构

并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。

并查集有两个基本操作:

  • Find: 查找元素所属子集
  • Union:合并两个子集为一个新的集合

可以使用树这种数据结构来表示集合,不同的树就是不同的集合,并查集中包含了多颗树,表示并查集中不同的子集,树的集合是森林,所有并查集属于森林。

基础操作

初始化:

//使用fa[i]用来存储每个元素的父节点,初始化时,每个元素的父节点为其自身。
int fa[MAXN];
void init(int n){
    for(int i = 0; i < n; i++)
        fa[i] = i;
}

查询:

//使用递归的算法实现对元素的逐层向上查询,一层层地往上访问父节点,直至根节点
int find(int x){
    if(fa[x] == x)
        return x;
    else
        return find(fa[x]);
}

合并:

//合并操作也很简单,先找到两个集合的代表元素,然后将前者的父节点设置为后者即可
void merge(int i,int j){
    fa[find[i]] = find[j];
}

压缩路径

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值