作者 | P.yh
来源 | 五分钟学算法
什么是并查集
并查集可以看作是一个数据结构,如果你根本没有听说过这个数据结构,那么你第一眼看到 “并查集” 这三个字的时候,脑海里会浮现一个什么样的数据结构呢?
基于我们之前所学的知识来思考并推导一个问题,这相比直接去理解,你会收获得更多。
我们就来逐字拆解一下,并、查、集 这个三个字,其中前面两个字都是动词,第三个字是个名词。
我们先看名词,因为只有知道了这个东西是什么,才能去理解它能干什么。
集就是集合,我们中学时期就学过这个东西,集合用大白话说就是将一堆元素没有顺序地摆放在同一个地方。
现在我们已经知道了其实并查集本质就是集合,那它能做什么呢?这就要看前两个字 - “并” 和 “查”,集合的一些操作想必你肯定记得,例如,交集,并集等等,这里的 “并” 其实就指的是并集操作,两个集合合并后就会变成一个集合,如下所示:
{1,3,5,7} U {2,4,6,8} = {1,2,3,4,5,6,7,8}
那 “查” 又是什么呢?集合本身只是容器,我们最终还是要知道里面存的是什么元素,因此这里的 “查” 是对于集合中存放的元素来说的,我们不仅要查找这个元素在不在集合中,我们还要确定这个元素是在哪个集合中,对于前一个操作,Java 中普通的 set 就可以做到,但是对于后一个操作,仅仅使用一个 set,比较难做到。
好了,现在你应该知道并查集是什么,以及它能干什么了,总结下来就是:
并查集可以进行集合合并的操作(并)
并查集可以查找元素在哪个集合中(查)
并查集维护的是一堆集合(集)
知道了这些后,并查集的概念就清楚了。
并查集的实现
仅仅靠嘴说,还是差点意思,作为程序员,必然是要将我们了解的东西用代码的形式呈现出来。
相信通过上面的表述,你已经知道,并查集维护的是一堆集合而不是一个集合,用什么样的数据结构表示并查集?set 吗?这里有两个东西我们是必须要知道的,元素的值,集合的标号,一个元素仅可能同时存在于一个集合中,元素对集合是多对一的关系,这么看来我们可以用一个健值对的结构来表示并查集,Map 是肯定可以,但是如果对元素本身没有特定要求的话,我们可以使用数组,这样速度更快,使用起来也更加简单,可以看看下面的例子:
{
0}, {
1}, {
2}, {
3}, {
4}, {
5} =&g