并查集基础中的基础(包括优化,适合初学者)

并查集基础

1.并查集是一种使用的数据结构,主要处理一些不相交集合的合并问题。经典的例题有连通子图,最小生成树Kruskal算法和最近公共祖先等问题。

2.听上去还是有点高端的,但是在书上有个例子,帮派,可以很好的解释并查集。

例:假如1,2是朋友,1,3是朋友,那么通过并查集处理,1,2,3是朋友,然后分析完后,题目会问,有几队朋友,或者这队朋友有几人等等。

3.当然,还有一些进阶题,会把并查集和一些STL容器组合,具体的在力扣上的并查集问题上有体现。

现在我们讲一下并查集基础,即模板,以及它的优化方法。

这个是洛谷并查集模板题。
并查集基础中的基础(包括优化,适合初学者)_第1张图片

先贴基础代码

并查集基础中的基础(包括优化,适合初学者)_第2张图片

首先,定义一个父亲数组,存储每个结点的父亲

*在这里插入图片描述
在这里插入图片描述

这个先声明,刚开始每个人都是自己祖先(我习惯把找父亲称为找祖先,因为找父亲函数用找祖先表达更加清晰明了)

当每个人都是祖先时,我们可以开始找祖先了,所以下一步是找祖先

在这里插入图片描述
这里我刚开始有点绕的,后来换成找祖先,就通了,我通俗一点讲,father[x]表示x的父亲,find(x)表示找x的祖先(不是找父亲)

有2个状态,分别是 x等于father[x] 和 x不等于father[x] ,下面注意看

1.如果x和father[x]相等,表示我就是祖先,因为x没有father,所以自然就是祖先
2.如果不相等,那么我们find(father[x]),为什么?我不是祖先,那说明我肯定有个father,所以,我要调用find看看我父亲是不是祖先,如果是,那就是第一个情况,如果不是,那么我们在看父亲的父亲是不是祖先,依次往后推,直到找到祖先为止。

下面是认祖归宗,找到祖先了,肯定得认祖归宗啊,不然找他干嘛

并查集基础中的基础(包括优化,适合初学者)_第3张图片
这里的x1是x的祖先,y1是y的祖先,用if判断,如果两个人祖先不一样,我们就随便让一个人是另一个人祖先(因为这里是基础,后面优化后,那么就不是随便了,谁家子孙多,谁才配做个祖先)

主要代码块,用于根据题意合并祖先

这个看代码就可以看懂,else后面的是题目要求。

并查集基础中的基础(包括优化,适合初学者)_第4张图片

代码超时,找祖先不够快

并查集基础中的基础(包括优化,适合初学者)_第5张图片
这个是测试结果,看出来有几个超时了,那么,我们需要优化我们的找祖先程序了,我们现在的找祖先程序有点慢,找完所有祖先,估摸着祖先都可能狗带了,所以要快速找祖先

上面我们讲过一个人做祖先最好得子孙多,高度高,才有权力做,那我们现在定义一个height来表示子孙数量

并查集基础中的基础(包括优化,适合初学者)_第6张图片
刚开始,每个人都是祖先,所以子孙数量为0。
下面的注释直接卸载代码里了,方便观看
并查集基础中的基础(包括优化,适合初学者)_第7张图片
并查集基础中的基础(包括优化,适合初学者)_第8张图片
这个找祖先方法还不错,比原来的快点了

别着急走啊,还有个找祖先的方法呢,上面的优化是对祖先,那么这里的优化便是子孙了,子孙是干嘛的,找祖先的,那么我们优化找祖先方法

并查集基础中的基础(包括优化,适合初学者)_第9张图片

这边还是循环,不过有些人还是不懂,解释一下。
.假如x等于father[x],好,那么我是我自己祖先,if语句不执行—》不用再find祖先,不用再递归-—》执行return father[x],这时候x等于father的,就说明我们返回的是一个祖先。我们往前推导,find找到了祖先,返回了给了father[x],表示**x的父亲是祖先!!**再依次往前推导,你会得到

这个家族的所有子孙的父亲都是那一位祖先,这样我们找祖先就省去了很多步骤。

再次AC

你们仔细看,样例2的时间比上面找祖先的多,但是样例9,10时间少

为啥呢?

时间多,那是因为我们把子孙的父亲归为祖先时,用了点时间,但是如果族里面就2个人,一共10000个族,那么我们每次都要让子孙的父亲再归为祖先(因为2个人,那个父亲自然是祖先),我们多操作了一步。

时间少,那是因为如果我们找祖先时,直接找到了,而不用一层层往上寻找
并查集基础中的基础(包括优化,适合初学者)_第10张图片

慢着,你以为这就够了?当你子孙足够多的时候,你用find找祖先,即递归找祖先,不怕爆栈吗,下面是循环找祖先,不递归,防止空间爆栈

并查集基础中的基础(包括优化,适合初学者)_第11张图片

ok,如果你认真看完这一篇,那么并查集的基础你已经牢牢找我了,以后便是要并查集与STL,DFS等融合了,加油。

你可能感兴趣的:(力扣+AcWing基础题解,编程语言,visual,studio,算法)