左神算法基础class5—题目6并查集实现

1.介绍:并查集

并查集的作用主要有两点:
①快速查两个元素是同一集合
②合并两个集合。

(1)并查集的结构

当集合中只有一个元素时,这个集合的代表节点即为该元素,该元素的father也是自己。
在这里插入图片描述
当一个集合中有多个节点时,下层节点的father为上层节点,最上层节点的father指向自己,最上层的节点叫做这个集合的代表节点。如下图5,4的father是3,3的father是其自己。
在这里插入图片描述

(2)并查集的原理

①查找:假设查找a,b是否在同一个集合,对a,b查找其代表节点,若他们的代表节点不同则不在同一个集合,相同在同一个集合。如下图,2,5不在同一集合,4,5在同一集合
在这里插入图片描述
②合并
在两个集合不是同一集合的情况下,将长度短集合的代表节点的father指到长度长的代表节点上。

在这里插入图片描述

2.分析

(1)类的设计

并查集使用两个map实现,第一个fatherMap用来查找其father元素,key表示当前节点,value是其father节点。第二个sizeMap用来记录其集合的总长度,key表示当前节点,value是其集合的长度。

class UnionFindSet 
{
   
private:
	hash_map<char,char> fatherMap;
	hash_map<char,int> sizeMap;
public:
	 UnionFindSet(vector<char> data);//构造
	 char findHead(char cur);		//找集合的代表节点
	 bool isameset(char a,char b);	//判断是否是同一个集合
	 void Union(char a,char b);		//合并集合
};

构造函数

UnionFindSet::UnionFindSet(vector<char> data)
{
   
	{
   
		 fatherMap.clear();
		 sizeMap.clear();
		 //将vector的元素各自形成一个集合
		 for(auto var:data)
		 {
   
			 fatherMap.insert(pair<char,char>(var,var));//单个节点father指向自己
			 //sizeMap[var] = 1;
			 sizeMap.insert(pair<char,int>(var,1));//单个节点长度是1
		 }
	 }
}

(2)查找代表节点

代表节点的特点是其father节点是自己,整体思路是通过fatherMap一步步通过当前节点与其father节点是否相同来找代表节点。

//递归版
char UnionFindSet::findHead(char cur)
{
   
	char father = fatherMap[cur];	
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值