数据结构之并查集(Java实现)

一、引言

在数据结构中,并查集是一种处理不相交集合的合并与查询问题的数据结构。它在解决动态连通性问题等场景中有着广泛的应用,比如判断网络中节点的连通性、解决最小生成树问题(如 Kruskal 算法中就会用到并查集)等。本文将详细介绍并查集的数据结构以及如何用 Java 实现它。

二、并查集的基本概念

2.1 什么是并查集

并查集主要支持两种操作:

  • 合并(Union):将两个不相交的集合合并为一个集合。
  • 查找(Find):确定某个元素属于哪个集合,通常通过查找元素所在集合的代表元素来实现。

2.2 并查集的实现思路

通常用一个数组来表示并查集。数组中的每个元素代表一个节点,其值表示该节点的父节点。对于根节点(集合的代表元素),其值可以是自身。例如,如果parent[i]=i,则i是一个根节点。

三、并查集的 Java 实现

以下是一个简单的并查集 Java 代码实现:

class UnionFind {private int[] parent;// 初始化并查集,每个元素的父节点初始化为自身public UnionFind(int n) {parent = new int[n];for (int i = 0; i < n; i++) {parent[i] = i;}}// 查找元素 x 所在集合的代表元素(根节点)public int find(int x) {if (parent[x] == x) {return x;}return find(parent[x]); // 路径压缩,将节点直接指向祖父节点}// 合并元素 x 和 y 所在的集合public void union(int x, int y) {int rootX = find(x);int rootY = find(y);if (rootX!= rootY) {parent[rootX] = rootY;}}
}

3.1 初始化操作

UnionFind类的构造函数中,我们创建了一个大小为n的数组parent,并将每个元素的parent值初始化为自身,这意味着一开始每个元素都自成一个集合。

3.2 查找操作(find方法)

  • 首先判断当前元素xparent[x]是否等于x。如果相等,说明x就是根节点,直接返回x
  • 否则,递归地调用find(parent[x])。这里还可以进行路径压缩优化,即在查找的过程中,将当前节点直接指向其祖父节点,这样可以减少后续查找的时间复杂度。

3.3 合并操作(union方法)

  • 首先通过find方法找到元素xy所在集合的根节点rootXrootY
  • 如果rootXrootY不相等,说明xy属于不同的集合,将rootX的父节点设置为rootY,从而完成两个集合的合并。

四、并查集的时间复杂度分析

  • 在没有路径压缩的情况下,查找操作的时间复杂度最坏为 O ( n ) O(n) O(n),其中n是集合中元素的数量。因为在最坏情况下,可能需要遍历整个树的高度来找到根节点。
  • 合并操作的时间复杂度在简单实现下是 O ( 1 ) O(1) O(1),因为只是改变一个节点的父节点指针。
  • 当使用路径压缩优化后,查找操作的平均时间复杂度可以近似为 O ( α ( n ) ) O(α(n)) O(α(n)),其中α(n)是阿克曼函数的反函数,其增长速度非常慢,在实际应用中可以认为是常数时间复杂度。这使得并查集在处理大规模数据时依然高效。

五、总结

并查集是一种简单而强大的数据结构,用于处理不相交集合的合并和查询问题。通过合理的实现和优化,如路径压缩,可以在处理动态连通性等相关问题时表现出良好的性能。在 Java 中的实现相对简洁,理解并掌握并查集对于解决一些复杂的算法问题,特别是图相关的算法问题有着重要的意义。希望本文的讲解和代码示例能帮助读者更好地理解和应用并查集。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/13579.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

性能测试|JMeter接口与性能测试项目

前言 在软件开发和运维过程中&#xff0c;接口性能测试是一项至关重要的工作。JMeter作为一款开源的Java应用&#xff0c;被广泛用于进行各种性能测试&#xff0c;包括接口性能测试。本文将详细介绍如何使用JMeter进行接口性能测试的过程和步骤。 JMeter是Apache组织开发的基…

嵌入式硬件电子电路设计(五)MOS管详解(NMOS、PMOS、三极管跟mos管的区别)

引言&#xff1a;在我们的日常使用中&#xff0c;MOS就是个纯粹的电子开关&#xff0c;虽然MOS管也有放大作用&#xff0c;但是几乎用不到&#xff0c;只用它的开关作用&#xff0c;一般的电机驱动&#xff0c;开关电源&#xff0c;逆变器等大功率设备&#xff0c;全部使用MOS管…

如何优化开放数据湖仓一体的性能

数据湖仓一体架构由 Apache Hudi、Apache Iceberg 和 Delta Lake 等开放表格式提供支持&#xff0c;提供了一种开放且经济高效的方式来管理组织不断增长的数据和分析需求。它提供了在同一数据存储上运行并发事务的可靠性&#xff0c;从而提高了效率。数据湖仓一体支持关键功能&…

比较基因组分析

比较基因组分析&#xff08;Comparative Genomics Analysis&#xff09;是一门通过比较不同物种或个体的基因组序列来研究其相似性与差异性的科学方法。它有助于揭示物种间的进化关系、基因功能、生物适应性及潜在的疾病机制。近年来&#xff0c;随着高通量测序技术的发展&…

leetcode 148. 排序链表 中等

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5]示例 3&#xff1a; …

基于单片机的智能小车(论文+源码)

1系统整体方案 此次多功能智能小车的设计系统&#xff0c;其整个控制电路的框架如下图所示。整个系统采用STM32单片机为控制器其中&#xff1a;LCD液晶负责显示当前信息,蜂鸣器负责特殊情况下进行报警提醒,红外遥控模块方便用户进行远程操作小车,电机模块拟采用前驱的方式&…

基于matlab的CNN食物识别分类系统,matlab深度学习分类,训练+数据集+界面

文章目录 前言🎓一、数据集准备🎓二、模型训练🍀🍀1.初始化🍀🍀2.加载数据集🍀🍀3.划分数据集,并保存到新的文件夹🍀🍀4.可视化数据集🍀🍀5.模型构建🍀🍀6.数据增强🍀🍀7.设置训练参数🍀🍀8.训练与测试🎓三、模型测试🍀🍀1.初始化�…

UCSD:LLM通过工具使用解决科学问题

&#x1f4d6;标题&#xff1a;Adapting While Learning: Grounding LLMs for Scientific Problems with Intelligent Tool Usage Adaptation &#x1f310;来源&#xff1a;arXiv, 2411.00412 &#x1f31f;摘要 &#x1f538;大型语言模型&#xff08;LLMs&#xff09;在解…

【时间之外】IT人求职和创业应知【34】-人和机器人,机器人更可靠

目录 新闻一&#xff1a;人形机器人产业持续高速增长&#xff0c;2026年中国市场规模将突破200亿元 新闻二&#xff1a;AI技术驱动设备厂商格局变化&#xff0c;部分厂商市占率快速提升 新闻三&#xff1a;华为与江淮汽车携手打造超高端品牌“尊界”&#xff0c;计划于明年春…

MyBatis及相关文件配置

MyBatis是一款优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。以下是对MyBatis的详细讲解&#xff1a; 一、MyBatis的起源与发展 MyBatis最初是Apache的一个开源项目iBATIS&#xff0c;2010年迁移到Google Code并改名为MyBatis&#xff0c;2013年11月又…

【FastAPI】1-url参数

fastapi的核心功能是提供HTTP请求接口 “幂等”和“非幂等” 幂等&#xff08;idempotent&#xff09;&#xff1a;如果一个方法重复执行多次&#xff0c;产生的效果是一样的&#xff0c;那么这个方法就是幂等的 “Methods can also have the property of “idempotence” in …

CentOS Stream 9设置静态IP

CentOS Stream 9设置静态IP CentOS Stream 9作为CentOS Stream发行版的下一个主要版本&#xff0c;已经发布有一段时间&#xff0c;但与目前广泛使用的CentOS7有较大区别。安装试用Stream 9的过程中&#xff0c;就发现设置静态IP的方式和CentOS7/8差别较大&#xff0c;在此记录…

机器人学 雅可比矩阵

雅可比矩阵&#xff08;Jacobian Matrix&#xff09;是机器人学中一个非常重要的工具&#xff0c;广泛应用于分析机器人末端执行器的速度和力学&#xff08;静力&#xff09;关系。理解雅可比矩阵的速度和静力作用对于机器人运动控制、动力学分析以及优化设计具有重要意义。 一…

【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最小的数

CL13 最小的数(20 分) 输入一个有 n 个无重复元素的整数数组 a&#xff0c;输出数组中最小的数。提示&#xff1a;如使用排序库函数 sort()&#xff0c;需要包含头文件#include 。输入&#xff1a; 第一行一个正整数 n(2<n<20)&#xff1b; 第二行 n 个不重的整数 a[i]…

python数据写入excel文件

主要思路&#xff1a;数据 转DataFrame后写入excel文件 一、数据格式为字典形式1 k e &#xff0c; v [‘1’, ‘e’, 0.83, 437, 0.6, 0.8, 0.9, ‘好’] 1、这种方法使用了 from_dict 方法&#xff0c;指定了 orient‘index’ 表示使用字典的键作为行索引&#xff0c;然…

制作自己的刷题小题库,提高刷题效率

日常刷题 乱序/背题多种模式 组队刷题 查看小组的刷题统计 在线考试 创建考试多人同时答题 ----这是一条分割线----- 土著刷题&#xff0c;是一款可以导入题库的在线刷题学习小&#x1f34a;序&#xff0c;提供一套以【搭建题库-组建小组-刷题练习-在线考试】为中心的完整服务…

在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5

在 Oracle Linux 8.9 上安装Oracle Database 23ai 23.5 1. 安装 Oracle Database 23ai2. 连接 Oracle Database 23c3. 重启启动后&#xff0c;手动启动数据库4. 重启启动后&#xff0c;手动启动 Listener5. 手动启动 Pluggable Database6. 自动启动 Pluggable Database7. 设置开…

springboot线下培训机构集中管理和推荐平台-计算机毕业设计源码48919

摘 要 该论文研究了一种线下培训机构集中管理和推荐平台的设计与实现。该平台旨在解决传统线下培训机构管理和推荐过程中存在的诸多问题&#xff0c;包括信息不对称、资源分散、推荐不精准等。通过系统性的需求分析和技术调研&#xff0c;设计了一套基于Spring Boot和Vue的前后…

Jmeter中的监听器(一)

监听器 1--查看结果树 用途 调试测试计划&#xff1a;查看每个请求的详细信息&#xff0c;帮助调试和修正测试计划。分析响应数据&#xff1a;查看服务器返回的响应数据&#xff0c;验证请求是否成功。检查错误&#xff1a;识别和分析请求失败的原因。 配置步骤 添加查看结果…

机器学习—多个输出的分类(Optional)

有一种不同类型的分类问题&#xff0c;称为多标签分类问题&#xff0c;与每个图像相关联的地方可能有多个标签。 如果你正在制造一辆自动驾驶汽车或者驾驶辅助系统&#xff0c;然后给你一张车前的照片&#xff0c;你可能想问&#xff0c;比如有没有一辆车或者至少有一辆车还是…