并查集概念

并查集单看名字大家也能猜到这个算法的作用,是用来对集合进行合并和查找操作

并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。——来自百度百科

就是将原本不一样的集合,但是由于某种关系有了联系,把他合并成同一个集合,就是实现一个这样的功能。

基本操作

并查集是一种非常简单的数据结构,(我是说它的算法实现简单)它主要涉及两个基本操作,分别为:
A.合并: 合并两个不相交集合
B.查找: 去判断两个元素是否属于同一个集合
接下来,我会用并查集的图形解释来看下如何实现这两个基本操作。
1.可以看到这里有六个小球,他们代表六个不一样的元素,用数组来表示他们,给他们附上值,来代表不一样的集合

2.现在我来给他们一些联系,然后可以根据联系进行集合的一个合并,随机得到一个树状结构

只要是能通过关系串联起来的,不管是直接联系还是间接联系,元素通过两两之间的关系串联起来,把他们都归到同一个集合。那么如何判断两个元素是否属于一个集合呢?

我们可以在每个集合内确定一个祖宗节点,你们可以认为是一个特殊点,作为参照。这样,两个集合只要互相确认自己的祖宗节点是不是同一个,就可以确定关系了。

但是还有问题啊,目前我们只知道直接的联系,那么我们就需要对集合进行操作,形成树状结构,祖宗节点就是根节点,下面分别是二级、三级…。每个人只要记住自己的上级是谁就行了。那么判断是否属于同一个集合,只要一层层向上查找,直到最高层,就可以在短时间内确定了。由于我们关心的只是两个元素是否在同一个集合的,至于他们是如何通过关系相关联的,以及每个圈子内部的结构是怎样的,甚至祖宗节点是谁,都不重要了,就可以随机确定上下级关系
3.我们最终经过处理,实现的是如图所示

接下来是对代码实现的一个讲解

一般来说,一个并查集代码实现对应三个重要步骤:初始化+查找根结点函数+合并集合函数

【初始化】

这个集合的类别pre(其实就是一个指针,用来指示这个集合属于那一类,合并过后的集合,他们的pre指向的最终值一定是相同的)
初始化的时候,每一个集合的pre都是这个集合自己的标号。没有跟它同类的集合,那么这个集合的源头只能是自己了。

int pre[max];   //集合index的类别,或者用parent表示
//初始化集合
void init()
{    for(int i=1;i<=n;i++)pre[i]=i;   //一个集合的pre都是这个集合自己的标号。没有跟它同类的集合,那么这个集合的源头只能是自己了。
}

【查找函数】

就是找到pre指针的源头,可以把函数命名为find,如果集合的pre等于集合的编号(即还没有被合并或者没有同类),那么自然返回自身编号。 如果不同(即经过合并操作后指针指向了源头(合并后选出的rank高的集合))那么就可以调用递归函数,如下面的代码:

//查找集合i(一个元素是一个集合)的源头(递归实现)
int Find(int i)
{//如果集合i的父亲是自己,说明自己就是源头,返回自己的标号if(pre[i]==i)return pre[i];//否则查找集合i的父亲的源头return  Find(pre[i]);
}

递归,这个已经讲过很多次,这里就不再多讲,大家可以结合浏览器的后退功能,如果你想追溯源头,你就一直回溯,就能找到。

【合并】

将两个元素所在的集合合并为一个集合。
通常来说,合并之前,应先判断两个元素是否属于同一集合,这可用上面的"查找"操作实现。那么我们如何合并两个不相交集合(Union(x,y))
合并操作很简单:先设置一个数组pre[x],表示x的“父亲”的编号。那么,合并两个不相交集合的方法就是,找到其中一个集合祖宗节点,将另外一个集合的祖宗节点的父亲指向它。

int gets(int a,int b){int x=Find(a);int y=Find(b);if(x!=y)pre[y]=x;}

算法描述总结

关键特征:
①用集合中的某个元素来代表这个集合~~,该元素称为集合的代表元;~~
②构成了一个以代表元素为根的树形结构;
③对于每一个元素 pre[x]指向x在树形结构上的父亲节点。如果x是根节点,则令pre[x] = x;
④对于查找操作,假设需要确定x所在的的集合,也就是确定集合的代表元。可以沿着pre[x]不断在树形结构中向上移动,直到到达根节点。
判断两个元素是否属于同一集合,只需要看他们的代表元是否相同即可。
用途:
1、维护无向图的连通性。支持判断两个点是否在同一连通块内,和判断增加一条边是否会产生环。
2、用在求解最小生成树的Kruskal算法里。
如果还有哪里我讲的不清楚,或是有疑问,欢迎私聊我,我会为你们解答。

贴上其他博客讲解并查集的1 2 3 4

并查集+基础知识点详解相关推荐

  1. 并查集(Union-Find) (图文详解)

    文章目录 并查集基础知识 定义 C++实现 优化 精选算法题(Java实现) 实现并查集 交换字符串中的元素 最长连续序列 - 字节面试常考 连通网络的操作次数 最大岛屿数量 (三种解法) 省份数量 ...

  2. POJ 2492 并查集,带权或带偏移量并查集 【例题详解】

    分析这道题,我们可以得出,假如a,b,c三只虫子,a和b可以交配,b和c也可以交配,那么a和c一定是同行,因为他们和同一个异性交配了.所以我们可以把关系抽象成图,在ab之间,bc之间各连一条线长度为1 ...

  3. 【26天高效学完Java编程】Day02:开发利器之IDEA的安装使用、Java标识符、字符串及运算符等基础知识点详解

    本专栏将从基础开始,循序渐进,由浅入深讲解Java的基本使用,希望大家都能够从中有所收获,也请大家多多支持. 专栏地址:26天高效学完Java编程 相关软件地址:链接地址 所有代码地址:链接地址 如果 ...

  4. 食物链(经典种类并查集问题)---详解

    动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形. A吃B, B吃C,C吃A. 现有N个动物,以1-N编号. 每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用 ...

  5. java 二进制运算_java二进制运算基础知识点详解|chu

    一.二进制位运算 1. 按位与(&) 位运算实质是将参与运算的数字转换为二进制,而后逐位对应进行运算. 按位与运算为:两位全为1,结果为1,即1&1=1,1&0=0,0& ...

  6. 学习电气自动化PLC编程最基础的十大知识点详解

    这篇文章其实是学习PLC自动化过程中必须要理解的基础问题,不管是西门子PLC还是三菱PLC,抑或欧姆龙PLC,以及国产品牌的PLC,这些问题都必须理解透,才能更好的开始自动化编程.不然指令学完了梯形图 ...

  7. Elastic search入门到集群实战操作详解(原生API操作、springboot整合操作)-step1

    Elastic search入门到集群实战操作详解(原生API操作.springboot整合操作)-step2 https://blog.csdn.net/qq_45441466/article/de ...

  8. 阿里云DDoS基础防护详解防护阈值黑洞时间详细说明

    阿里云DDoS基础防护是免费赠送给用户的,每台实例都可以免费试用DDoS基础防护,护云盾分享DDoS基础防护的详细说明,包括防护阈值.防护流量.安全信誉及黑洞时间等: DDoS基础防护详解 阿里云免费 ...

  9. 基于Kubernetes构建Docker集群管理详解

    from: 基于Kubernetes构建Docker集群管理详解 Kubernetes是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.动 ...

最新文章

  1. java svn插件_Eclipse安装SVN插件
  2. 年轻的LeCun、吴恩达长啥样?升级版StyleGAN告诉你
  3. Android maps应用
  4. 自定义维护视图变量(Maintenance view variant)
  5. 《数据库系统实训》实验报告——视图
  6. 头发剪短了要快速生发_怎样生发效果最好最快?四个方法快速长出头发!
  7. 详析 Kubernetes 在边缘计算领域的发展
  8. 计算机启动硬盘响,电脑开机时硬盘响个不停是什么原因?原因分析与解决方法介绍...
  9. 【Elasticsearch】ELASTICSEARCH集群节点的扩容(移除与添加)
  10. 使用tSQLt创建SQL单元测试实用程序过程
  11. 2020-06-24 电子书网站http://www.itjiaocheng.com/mianfei/
  12. swift python 性能_Swift 性能探索和优化分析
  13. codevs1026 逃跑的拉尔夫
  14. 第十三次CCF CSP认证(2018年3月)真题棋局评估
  15. Cat8八类网线是什么?与Cat5、Cat6、Cat7网线的区别?
  16. java数字转大写_java实现数字转大写的方法
  17. 小波神经网络的基本原理,小波神经网络算法原理
  18. 使用微博自动记录俯卧撑个数
  19. Python变量与字符串
  20. OCR技术3-大批量生成文字训练集

热门文章

  1. Android之如何解决ScrollView起始位置不是最顶部的解决办法
  2. Andorid之BINDSERVICE的使用方法总结
  3. 不同步节点在线使用Remix开发以太坊Dapp及solidity学习入门 ( 一 ):智能合约HelloWorld
  4. 中英文标点符号切换的组合键_易混标点符号:一字线(—)、短横线(-)、浪纹线(~)...
  5. bootstrap tabale 点击_jquery+bootstrap实现tab切换, 每次切换时都请求数据, 点击提交分别向不同的地址提交数据...
  6. 霍金竟然亲口承认自己是个赌徒!明明失败了不止一次,“菜鸡”却成了神话!...
  7. 有这些好习惯,可以让你悄悄变优秀
  8. 用“谬论”指挥研究方向数十年,是谁让“老年痴呆”至今仍是绝症?
  9. 有哪些经济学理论可以用在谈恋爱上?
  10. 学习 Python 编程的 19 个资源