并查集基础

并查集是一种树型的数据结构,用于处理一些不相交集合的合并问题。
用集合中的某个元素来代表这个集合,该元素称为集合的 代表元
一个集合内的所有元素组织成以代表元为根的树形结构。
对于每一个元素 parent[x]指向x在树形结构上的父亲节点。如果x是根节点,则令parent[x] = x。
对于查找操作,假设需要确定x所在的的集合,也就是确定集合的代表元。可以沿着parent[x]不断在树形结构中向上移动,直到到达根节点。

判断两个元素是否属于同一集合,只需要看他们的代表元是否相同即可。
为了加快查找速度,查找时将x到根节点路径上的所有点的parent设为根节点,该优化方法称为压缩路径。
使用该优化后,平均复杂度可视为Ackerman函数的反函数,实际应用中可粗略认为其是一个常数。


并查集的主要操作有:

1-合并两个不相交集合      

2-判断两个元素是否属于同一个集合       

3-路径压缩

并查集的两种优化方法:路径压缩与按秩合并。

int pre[100],rank[100];//pre为其父节点,rank是当前元素所在集合的大小

//初始化
int init()
{
	for(int i=0;i<100;i++)
	{
		pre[i]=i;
		rank[i]=1;
	}
}

//带路径压缩的非递归找根结点
int Find(int x)
{
	int r=x;
	//循环找到根节点
	while(r!=pre[r])
		r=pre[r];
	int i=x,j;
	//把每一个节点的pre设置为根节点
	while(i!=r)
	{
		j=pre[i];
		pre[i]=r;
		i=j;
	}
	return r;
}

//带路径压缩的递归找根节点
int Find(int x)
{
	if(pre[x]!=x)
		pre[x]=Find(pre[x]);
	return pre[x];
}

//按秩合并,元素少的集合的根节点指向元素多的集合的根节点
void Union(int x,int y)
{
	x=Find(x);
	y=Find(y);
	if(x==y)
		return;
	if(rank[x]>=rank[y])
	{
		pre[y]=x;
		rank[x]+=rank[y];
	}
	else
	{
		pre[x]=y;
		rank[y]+=rank[x];
	}
}




















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值