并查集

什么是并查集

并查集是一种管理数据所属集合的数据结构,用于处理不相交集合之间的合并(Union)和查询(Find)操作。

  • 合并(Union):合并两个元素所属集合。通常是将一个元素的根节点连接到另一个元素的根节点上来实现。
  • 查询(Find):查询某个元素所属集合,即查询某个元素的根节点。通常用来判断两个元素是否属于同一个集合。

初始化

初始的时候,每个元素都位于单独的集合,用元素自己作为根节点的父亲。

点击查看代码
int n;
vector<int> set(n);
for(int i = 0;i<n;i++)set[i] = i;

查询

当元素的根节点的父亲为自己时,找到查询元素所在集合的根节点。

点击查看代码
int find(int x)
{
	while(set[x]!=x)
		x = set[x];
	return x;
}

合并

执行合并操作,需要将一个元素所在集合的根节点连接到另一个元素的根节点上。

点击查看代码
void unite(int a, int b)
{
	if(find[a]==find[b])return;
	set[find(a)] = find(b);
}

优化

为了提高效率,并查集通常会使用两种优化技术。

路径压缩

在查找的过程中,将经过的节点都连接到当前集合的根节点。
image
在需要频繁查找的场景下,路径压缩可以大大提高效率,但会造成节点大量修改。

点击查看代码
int find(int x)
{
	if(set[x]!=x)
		set[x] = find(set[x]);
	return set[x];
}

启发式合并

合并时,选择节点较少的树或深度较小的树连接到另一颗树。

点击查看代码
void unite(int x, int y)
{
	x = find(x),y = find(y);
	if(x == y)return;
	if(size[x] < size[y]) swap(x,y);
	set[y] = x;
	size[x] += size[y];
}
posted on 2025-03-02 18:37  愚鱼遇渔  阅读(12)  评论(0)    收藏  举报