集合的查找与合并-数据结构

集合的表示

集合运算:交、并、补、差、判定一个元素是否属于某一集合

并查集:集合并、查某元素属于什么集合

并查集问题中集合存储如何实现?
可以用树结构表示集合、树的每一个结点代表一个结合元素,树根代表这个集合

采用数组存储形式表示
在这里插入图片描述

查找集合

查找某个元素所在的集合(用根结点表示)

int Find (SetType S[] ,ElementType X)
{
/*在数组S中查找值为X的元素所属的集合*/
/*MaxSize是全局变量,为数组S的最大长度*/
int i;
for(i=0;i<MaxSzie&&S[i].Data!=X;i++)
if(i>=MaxSize) return -1;/*未找到X,返回-1*/
for(;S[i].Parent>=0;i=S[i].Parent);
return i;/*找到 X所属集合,返回树根结点在数组S中的下标*/

}

集合的并运算

分别找到X1和X2两个元素所在集合树的根结点
如果它们不同根,则将其中一个根结点的父结点指针设置成另外一个根结点的数组下标。

void Union( SetType S[],ElementType X1,ElementType X2)
{
	int Root1,Root2;
	Root1=Find(S,X1);
	Root2=Find(S,X2);
	if(Root1!=Root2) S[Root2].Parent=Root1;

}

在这里插入图片描述
①为了改善合并后查找性能,可以采用将小的集合合并到相对大的集合中去(修改Union函数),修改数组中Parent的值
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值