并查集简单讲解+示例封装

并查集简介

并查集(Union-Find)是一种高效的数据结构,用于处理动态连接问题,如社交网络中的朋友关系或图论中的连通分量管理。它主要
包含两个操作:合并(Union)和查找(Find),并通过路径压缩和按秩合并等优化提高效率。

核心概念

  1. 树结构:每个元素由父节点指向另一个节点,最终指向根节点。
  2. 查找操作:寻找一个元素的根,并可能进行路径压缩以加速后续查询。
  3. 合并操作:将两个集合连接,通常根据某种策略(如按大小或秩)决定合并方式。

优化

  • 路径压缩:在查找时调整父指针,使后续查询更快。

实现要点

  • 使用数组存储父节点和大小信息。
  • 初始化每个元素为自身父节点。
  • 合并操作优化树结构以减少查找深度。

应用场景

适用于需要频繁处理连通性问题的场景,如动态管理数据连接关系。

并查集通过高效的合并和查找操作,在保持低时间复杂度方面表现出色,使其成为许多算法中的关键工具。

示例代码

这里,我写了一个简单的并查集封装,用于处理简单并查集,可以用bingchaji 你的并查集名称,使用名称.init(n)初始化并查集,其中n为并查集中最高的项数,名称.find(x)查找元素的祖先,其中x为需要查找祖先的节点的编号。名称.join(x,y)来将两个项的关系加入并查集,两个项目的顺序根据题目要求来。如果没有顺序的问题,则可以直接按任意顺序加入。

class bingchaji{
private:
	int fa[500005];
public:

	int find(int x){
		if(fa[x]==x){
			return x;
		}
		return find(fa[x]);
	}
	void join(int x,int y){
		fa[find(x)]=find(y);
	}
	void init(int n){
		for(int i=1;i<=n;i++){
			fa[i]=i;
		}
	}
};

点个赞吧 :waving_hand:

4 个赞

数组可以改成vector<int>