Java——并查集

article/2025/8/27 0:00:53

概念

当我们将多个元素分配到不同的集合中,这些集合有的是相关的,有的是不相关的。并查集就是用来查找两个元素是否在同一个集合中的

其主要实现方式是:将所有的元素以下标的形式存储在数组中。例如一共有十个人,那么就将这些人编号为0到9,然后用0到9的下标表示这些人,初始数组存储的全是-1
在这里插入图片描述

数组中存储的数据则代表他们之间的关联方式,例如0,6,7,8互相认识,那么他们就是一个集合,而0号是这个集合中的老大,那么0下标就存储这个团体的人的个数的相反数:-4,其他的几个成员6,7,8,则分别存储他们认识的0的下标:0

如果我们还有另两个集合,例如1,4,9是一个集合,1是老大,4和9存储1的下标,那么4和9存储1,1下标存储-3,而2,3,5是另一个集合,2是老大,则3,5存储2下标,2存储-3

在这里插入图片描述
当我们的集合1和集合2的某一位互相认识了,那么根据朋友的传递原理,我们的集合1和集合2就都互相认识了,那么就会变成一个更大的集合,其中如果让0做老大,1隶属于0下标,那么就会形成下面的样子

0下标就存储了这个大集合的人数的相反数:-7,而1则从老大变成了平民,因此存储老大的下标:0,其他的都是不变的
在这里插入图片描述
通过上面这个基本的原理,我们可以自己实现一个并查集

MyUnionFindSet

变量和构造方法

我们的底层数据结构是数组,在创建的时候,需要给数组传递一个创建的大小,并且用Arrays.fill方法,将数组的全部元素置为-1

public int[] elem;public MyUnionFindSet(int n){this.elem = new int[n];Arrays.fill(elem, -1);//初始化数组全为-1
}

寻找根节点

这个方法就是用来找集合中的老大的
通过之前的概念的介绍,我们知道,只有老大存储的是负数,而其他下标则存储其父节点的下标。所以我们可以用一个循环,当这个下标对应的数据不是负数,那么就让x变为这个下标对应的数据,直到找到负数,就返回这个x

在这里插入图片描述
例如我们这个图中,如果我们传递的参数是9,那么elem[9]是1,那么x就变成1,elem[1]是0,那么x就变成0,elem[0]是-7,所以0是根节点,返回0

/*** 查找x下标数据的根节点* @param x* @return 根节点的下标*/
public int findRoot(int x){if(x < 0){throw new ArrayIndexOutOfBoundsException("下标不能是负数");}while(elem[x] >= 0){x = elem[x];}return x;
}

判断两节点是否在同一个集合

当两个节点在同一个集合中,说明他们的根节点一定是相通的,所以我们可以调用findRoot方法,来找到两个节点的根节点,判断是否相同,相同返回true,不同返回false
在这里插入图片描述

/*** 查询x1和x2是否在同一个集合中* @param x1* @param x2* @return*/
public boolean isSameUnionFindSet(int x1, int x2){int index1 = findRoot(x1);int index2 = findRoot(x2);if(index1 == index2){return true;}return false;
}

合并两个集合

通过刚才的图片我们可以知道,当两个节点相连时,如果这两个节点不是根节点,那么就应该找到这两个节点的根节点,如果根节点相同,说明这两个节点已经在同一个集合中了,那么就不用合并了。

而如果根节点不相同,那么就和我们刚才讲的情形类似,就是把0和1相连,这时改变的只有0下标的值和1下标的值,其他的下标的值都是不变的

我们可以看到,0下标的值变成了两个集合的节点数目的总和的相反数,也就是0下标的值加上1下标的值:-7,而1下标的值则是直接改为了0
在这里插入图片描述

在这里插入图片描述
所以,我们就先找到x1,x2的根节点,判断是否相等,相等则直接返回。我们这里实现的逻辑x1是0,x2是1,所以

elem[0] = elem[0] + elem[1]
elem[1] = 0

也就是:

elem[index1] = elem[index1] + elem[index2]
elem[index2] = index1

完整代码如下:

/*** 合并x1,x2所在的两个集合* @param x1* @param x2*/
public void union(int x1, int x2){int index1 = findRoot(x1);int index2 = findRoot(x2);if(index1 == index2){System.out.println("x1和x2已经在同一个集合中了");return;}elem[index1] = elem[index1] + elem[index2];elem[index2] = index1;
}

获取集合的个数

可以看到,集合的个数等于所有老大的个数,等于数组中负数的个数

public int getCount(){int count = 0;for (int x:elem) {if(x < 0){count++;}}return count;
}

打印

public void print(){for (int x:elem) {System.out.print(x + " ");}System.out.println();
}

测试

按照我们上面的图进行合并元素,最终可以得到结果是正确的

public static void main(String[] args) {MyUnionFindSet myUnionFindSet = new MyUnionFindSet(10);System.out.println("合并0和6");myUnionFindSet.union(0,6);System.out.println("合并0和7");myUnionFindSet.union(0,7);System.out.println("合并0和8");myUnionFindSet.union(0,8);System.out.println("合并1和4");myUnionFindSet.union(1,4);System.out.println("合并1和9");myUnionFindSet.union(1,9);System.out.println("合并2和3");myUnionFindSet.union(2,3);System.out.println("合并2和5");myUnionFindSet.union(2,5);myUnionFindSet.print();System.out.println("合并8和1");myUnionFindSet.union(8,1);myUnionFindSet.print();System.out.println("查找是否为同一个集合");System.out.println(myUnionFindSet.isSameUnionFindSet(6,9));System.out.println(myUnionFindSet.isSameUnionFindSet(8,2));
}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/iYrb7g8B.shtml

相关文章

并查集Python版

以下来自于leetcode 使用数据结构&#xff1a;并查集 思路&#xff1a;由于相等关系具有传递性&#xff0c;所有相等的变量属于同一个集合&#xff1b;只关心连通性&#xff0c;不关心距离&#xff0c;因此很容易想到并查集。&#xff08;很容易嘛&#xff0c;反正我想不到&am…

并查集详解

文章目录 并查集一、简介1.定义2. 并查集的实现与优化 二、练习1.合并集合2.连通块中点的数量3. 食物链 三、总结 并查集 一、简介 1.定义 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题&#xff08;即所谓的并、查&#xff09;。比如说&am…

带权并查集

带权并查集需要先理解一般的并查集&#xff0c;不明白的可自行先搜索有关内容 一般的并查集主要记录节点之间的链接关系&#xff0c;而没有其他的具体的信息&#xff0c;仅仅代表某个节点与其父节点之间存在联系&#xff0c;它多用来判断图的连通性&#xff0c;如下图所示&…

并查集,不就一并和一查?

什么是并查集 并查集这种数据结构&#xff0c;可能出现的频率不是那么高&#xff0c;但是还会经常性的见到&#xff0c;其理解学习起来非常容易&#xff0c;通过本文&#xff0c;一定能够轻轻松松搞定并查集&#xff01; 对于一种数据结构&#xff0c;肯定是有自己的应用场景和…

数据结构——并查集

并查集是一种数据结构&#xff0c;是树的一种应用&#xff0c;用于处理一些不交集&#xff08;一系列没有重复元素的集合&#xff09;的合并以及查询问题。并查集支持如下操作&#xff1a; 查询&#xff1a;查询某个元素属于哪个集合&#xff0c;通常是返回集合内的一个“代表…

并查集详解(C/C++)

并查集算法详解&#xff08;C&#xff09; 并查集基础并查集是什么&#xff1f;并查集的作用是什么&#xff1f;并查集的结构合并查询 代码实现优化1&#xff1a;避免退化&#xff08;按秩合并&#xff09;代码优化 优化2&#xff1a;路径压缩代码优化 最终代码实现复杂度分析经…

并查集及其应用

并查集的基本操作: 1.合并两个集合 2.查询两个元素的祖宗节点 扩展: 1.记录每个集合的大小 将集合大小绑定到代表元素节点上 就是并查集的思想 (不是每个元素都是正确的 但是代表元素是正确的) 2.记录每个点到根节点的距离 绑定到每个元素身上 因为每个元素到根节点的距离…

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

文章目录 并查集基础知识定义C实现优化 精选算法题(Java实现)实现并查集交换字符串中的元素最长连续序列 - 字节面试常考连通网络的操作次数最大岛屿数量 (三种解法)省份数量冗余连接冗余连接Ⅱ情侣牵手(困难)移除最多的同行或同列石头等式方程的可满足性 结语 并查集基础知识 …

什么是 “并查集” ?

导语&#xff1a;并查集是一种精巧的算法&#xff0c;本身并不难理解&#xff0c;却很常用&#xff0c;在许多场景下都能找到并查集的身影。 本文作者封承成&#xff0c;年仅12岁&#xff0c;非常感谢他的投稿。 并查集是什么 并查集&#xff0c;是一种判断“远房亲戚”的算法。…

并查集(Disjoint Set)

目录 ❤️什么是并查集&#xff1f; &#x1f3b6;实现方法1 &#x1f414;实现方法2 &#x1f383;题目1 ❤️什么是并查集&#xff1f; 并查集是一种数据结构&#xff0c;用于处理一些不交集&#xff08;Disjoint sets&#xff0c;一系列没有重复元素的集合&#xff09;的…

并查集

参考 https://www.cnblogs.com/asdfknjhu/p/12515480.html https://www.bilibili.com/video/BV13t411v7Fs?p3 https://leetcode-cn.com/problems/number-of-provinces/solution/python-duo-tu-xiang-jie-bing-cha-ji-by-m-vjdr/ 一、基本概念 并查集是一种数据结构 并查集这…

并查集(详细解释+完整C语言代码)

目录 1概论 2.树的表现形式 3.代码实现 3.1创立集合 3.2合并 3.3查询 3.4路径压缩 第一个方法&#xff1a;查找时优化 第二个方法&#xff1a;合并时优化&#xff08;加权标记法&#xff09; 4.完整代码 4.1优化前 4.2优化后 1概论 并查集是一种十分精巧且实用的树形…

时间序列预测的一般步骤

一、ARIMA模型概述 ​​ ARMA模型就是AR和MA的简单结合&#xff0c;同时包含了历史数值项和错误项。由于AR和MA模型都对时间序列有平稳性要求&#xff0c;ARMA模型也存在这个限制&#xff0c;因此我们将其拓展到ARIMA模型&#xff0c;其可以解决非平稳性问题。引入的差分概念是…

时间序列预测算法总结

时间序列算法 time series data mining 主要包括decompose&#xff08;分析数据的各个成分&#xff0c;例如趋势&#xff0c;周期性&#xff09;&#xff0c;prediction&#xff08;预测未来的值&#xff09;&#xff0c;classification&#xff08;对有序数据序列的feature提…

基于深度学习的时间序列预测

# 技术黑板报 # 第十一期 推荐阅读时长&#xff1a;15min 前言 时间序列建模历来是学术和工业界的关键领域&#xff0c;比如用于气候建模、生物科学和医学等主题应用&#xff0c;零售业的商业决策和金融等。虽然传统的统计方法侧重于从领域专业知识层面提供参数模型&#xff0…

预测类问题中的时间序列预测模型

前言&#xff1a;时间序列预测模型适用于含有时间变量的模型预测&#xff0c;对中短期的预测有着较好的结果&#xff0c;对长期预测不适用。本文重点介绍ARIMA模型的原理及代码实现。 其他模型总结&#xff1a;​【Python】Python中的经典时间序列预测模型总结_风度78的博客-C…

Transformer 在时间序列预测中的应用

2017年&#xff0c;Google的一篇 Attention Is All You Need 为我们带来了Transformer&#xff0c;其在NLP领域的重大成功展示了它对时序数据的强大建模能力&#xff0c;自然有人想要把Transformer应用到时序数据预测上。在Transformer的基础上构建时序预测能力可以突破以往的诸…

【推荐收藏】11种比较常用的时间序列预测模型

时间序列及其预测是日常工作中建模&#xff0c;分析&#xff0c;预测的重要组成部分。 本文我们将从0开始介绍时间序列的含义&#xff0c;模型及其分析及其常用的预测模型。 文章目录 交流时间序列定义时间序列预测模型与方法原始数据朴素法简单平均法移动平均法指数平滑法一次…

时间序列预测的20个基本概念总结

1、时间序列 时间序列是一组按时间顺序排列的数据点 比如&#xff1a; 每小时的气压每年的医院急诊按分钟计算的股票价格 2、时间序列的组成部分 时间序列数据有三个主要组成部分。 趋势季节性残差或白噪声 3、趋势 在时间序列中记录的长期缓慢变化/方向。 4、季节性 …

时间序列-预测(Forcasting):时间序列预测算法总结

一、背景介绍 绝大部分行业场景,尤其是互联网、量化行业,每天都会产生大量的数据。金融领域股票价格随时间的走势;电商行业每日的销售额;旅游行业随着节假日周期变化的机票酒店价格等; 我们称这种不同时间收到的,描述一个或多种特征随着时间发生变化的数据,为时间序列…