并查集

举报
花花叔叔 发表于 2022/08/12 23:53:25 2022/08/12
【摘要】 常见两种操作: 第一种方法: 合并两个集合(代码效率不高) merge1(a,b) { i=min(a,b); j=max(a,b); for(i=0;i<=N;i++) { if(s...

常见两种操作:
第一种方法:
合并两个集合(代码效率不高)

merge1(a,b)
{
	i=min(a,b);
	j=max(a,b);
	for(i=0;i<=N;i++)
	{
		if(set[k]==j)
		{
			set[k]=i;
		}
	}
 } 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

对数组的所有元素进行遍历一边,查找数组元素是否为6,若是6,则将数组元素改写为2
查找某元素属于哪个集合

findl(x)
{
	return set[x];
}

  
 
  • 1
  • 2
  • 3
  • 4

第二种方法:(树)

合并两个集合
直接将领导a归附于领导b即可

merge2(a,b)
{
	set[a]=b;
}

  
 
  • 1
  • 2
  • 3
  • 4

查找某元素属于哪个集合(效率不高)

find2(x)
{
	r=x;
	while(set[r]!=r)
	{
		r=set[r];
		return r;
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

优化后的算法:
查找:
解释:每个集合中最小的为树的根,每个节点的父节点是领导(不是最高领导,只是直属领导)

find2(x)
{
	r=x;
	while(set[r]!=r)
	{
		r=set[r];
		return r;
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

合并:

merge3(a,b)
{
	if(height(a)==height(b))
	{
		height(a)==height(a)+1;
		set[b]=a;
	}else if(height(a)<height(b))
	{
		set[a]=b;
	}else 
	{
		set[b]=a;
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

解释:树高的做领导,方框格格里面的(数组元素)用于装着领导

文章来源: blog.csdn.net,作者:花花叔叔,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_52077949/article/details/114536182

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。