Java高阶数据结构-----并查集(详解)
目录
🧐一.并查集的基本概念&实例:
🤪二.并查集代码:
😂三:并查集的一些习题:
A.省份数量
B.等式方程的可满足性
🧐一.并查集的基本概念&实例:
并查集概念:将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set)。
有了上面的一定了解,我们再来看一个实例:
比如:某公司今年校招全国总共招生10人,西安招4人,成都招3人,武汉招3人,10个人来自不同的学校, 起先互不相识,每个学生都是一个独立的小团体,现给这些学生进行编号:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 给以下 数组用来存储该小集体,数组中的数字代表:该小集体中具有成员的个数。(负号下文解释)
毕业后,学生们要去公司上班,每个地方的学生自发组织成小分队一起上路,于是: 西安学生小分队s1={0,6,7,8},成都学生小分队s2={1,4,9},武汉学生小分队s3={2,3,5}就相互认识了,10个 人形成了三个小团体。假设右三个群主0,1,2担任队长,负责大家的出行。
一趟火车之旅后,每个小分队成员就互相熟悉,称为了一个朋友圈。
在公司工作一段时间后,西安小分队中8号同学与成都小分队1号同学奇迹般的走到了一起,两个小圈子的学生相互介绍,最后成为了一个小圈子:
现在0集合有7个人,2集合有3个人,总共两个朋友圈,负数的个数就是集合的个数
注意事项:
我们一般将数组中的元素初始化为-1
(数组的下标:) 数组的下标对应集合中元素的编号
(数组的值array[i]:) 数组中如果为负数,负号代表根,数字代表该集合中元素个数
(数组的值array[i]:)数组中如果为非负数,代表该元素双亲在数组中的下标
并查集能干的事:
-
查找元素属于哪个集合 沿着数组表示树形关系以上一直找到根(即:树中中元素为负数的位置)
-
查看两个元素是否属于同一个集合 沿着数组表示的树形关系往上一直找到树的根,如果根相同表明在同一个集合,否则不在
-
将两个集合归并成一个集合 将两个集合中的元素合并 将一个集合名称改成另一个集合的名称
🤪二.并查集代码:
import java.util.*;
public class UnionFindSet {public int[] elem;public UnionFindSet(int n){this.elem = new int[n];Arrays.fill(elem,-1);}//查询x的根节点,返回根节点的下标public int findRoot(int x){if(x < 0){throw new IndexOutOfBoundsException("下标不合法,是负数");}//一直等到数组里面的值为负数时,才找到一个根while(elem[x] >= 0){x = elem[x];}return x;}//查询x1和x2是否是同一个集合public boolean isSameUnionFindSet(int x1,int x2){int index1 = findRoot(x1);int index2 = findRoot(x2);if(index1 == index2) return true;return false;}//这是合并操作public void union(int x1,int x2){int index1 = findRoot(x1);int index2 = findRoot(x2);if(index1 == index2){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;}
}
那我们趁热打铁,来做两道题练习一下:
😂三:并查集的一些习题:
-
A.省份数量
- 题目链接:. - 力扣(LeetCode)
思路:我们初始化一个一维数组表示并查集(数组大小为城市的个数),遍历这个二维数组(isConnected[i][j] 表示 i , j 两个城市相连),用并查集将相连接的城市合并到一个集合中,最后统计集合中元素的个数,就是要求的省份个数
class Solution {//A.省份数量public int findCircleNum(int[][] isConnected) {int n = isConnected.length;UnionFindSet ufs = new UnionFindSet(n);//将连接在一起的城市合并for(int i = 0;i < isConnected.length;i++){for(int j = 0;j < isConnected[0].length;j++){if(isConnected[i][j] == 1){ufs.union(i,j);}}}//查找连接在一起的城市,即省份的个数,直接返回return ufs.getCount();}
}
/* 并查集的实现*/
class UnionFindSet {public int[] elem;public UnionFindSet(int n){this.elem = new int[n];Arrays.fill(elem,-1);}//查询x的根节点,返回根节点的下标public int findRoot(int x){if(x < 0){throw new IndexOutOfBoundsException("下标不合法,是负数");}while(elem[x] >= 0){x = elem[x];}return x;}//查询x1和x2是否是同一个集合public boolean isSameUnionFindSet(int x1,int x2){int index1 = findRoot(x1);int index2 = findRoot(x2);if(index1 == index2) return true;return false;}//这是合并操作public void union(int x1,int x2){int index1 = findRoot(x1);int index2 = findRoot(x2);if(index1 == index2){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;}}
运行结果:
-
B.等式方程的可满足性
- 题目链接:. - 力扣(LeetCode)
思路:我们将具有相同属性的元素放入一个集合中,接着再遍历一遍字符串数组,如果字符串中对应的元素是!,说明不是一个集合,再从上述并查集中查找, 如果是一个集合的(矛盾了),返回false;遍历完成后也没有返回false,那么这个等式方程组就满足条件
class Solution {//B.等式方程的可满足性public boolean equationsPossible(String[] equations) {UnionFindSet ufs = new UnionFindSet(26);//将具有相同属性的元素放入一个集合中for(int i = 0;i < equations.length;i++){if(equations[i].charAt(1) == '='){ufs.union(equations[i].charAt(0) - 'a',equations[i].charAt(3) - 'a');}}//如果字符串中对应的元素是!,说明不是一个集合,再从上述并查集中查找, (矛盾了)如果是一个集合的,返回false;for(int i = 0;i < equations.length;i++){if(equations[i].charAt(1) == '!'){//查找根节点的下标位置int index1 = ufs.findRoot(equations[i].charAt(0) - 'a');int index2 = ufs.findRoot(equations[i].charAt(3) - 'a');if(index1 == index2) return false;}}return true;}
}
/* 并查集的实现 */
class UnionFindSet {public int[] elem;public UnionFindSet(int n){this.elem = new int[n];Arrays.fill(elem,-1);}//查询x的根节点,返回根节点的下标public int findRoot(int x){if(x < 0){throw new IndexOutOfBoundsException("下标不合法,是负数");}while(elem[x] >= 0){x = elem[x];}return x;}//查询x1和x2是否是同一个集合public boolean isSameUnionFindSet(int x1,int x2){int index1 = findRoot(x1);int index2 = findRoot(x2);if(index1 == index2) return true;return false;}//这是合并操作public void union(int x1,int x2){int index1 = findRoot(x1);int index2 = findRoot(x2);if(index1 == index2){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;}
}
运行结果:
结语: 写博客不仅仅是为了分享学习经历,同时这也有利于我巩固知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力!
相关文章:
Java高阶数据结构-----并查集(详解)
目录 🧐一.并查集的基本概念&实例: 🤪二.并查集代码: 😂三:并查集的一些习题: A.省份数量 B.等式方程的可满足性 🧐一.并查集的基本概念&实例: 并查集概念&…...
GitLab教程(三):多人合作场景下如何pull代码和处理冲突
文章目录 1.拉取别人同步的代码到本地的流程2.push冲突发生场景情景模拟简单的解决方法 在这一章中,为了模拟多人合作的场景,我需要一个人分饰两角。 执行git clone xx远端仓库地址 xx文件夹命令,在clone代码时指定本地仓库的文件夹名&#…...
模版偏特化之std::enable_if
1 SFINAE。 2 条件特化。可用作额外的函数参数(不可应用于运算符重载)、返回类型(不可应用于构造函数与析构函数),或类模板或函数模板形参。 函数参数: #include <iostream> #include <type_tra…...
好用的Web数据库管理工具推荐(ChatGPT的推荐)
在现代数据管理和开发中,Web数据库管理工具变得越来越重要。这些工具不仅提供了直观的用户界面,还支持跨平台操作,方便用户在任何地方进行数据库管理。 目录 1. SQLynx 2. phpMyAdmin 3. Adminer 4. DBeaver 5 结论 以下是几款推荐的Web…...
encoding Token和embedding 傻傻分不清楚?
encoding 编码 “encoding” 是一个在计算机科学和人工智能领域广泛使用的术语,它可以指代多种不同的过程和方法。核心就是编码:用某些数字来表示特定的信息。当然你或许会说字符集(Unicode)更理解这种概念,编码更强调这种动态的过程。而字符…...
一个公用的数据状态修改组件
灵感来自于一项重复的工作,下图中,这类禁用启用、审核通过不通过、设计成是什么状态否什么状态的场景很多。每一个都需要单独提供接口。重复工作还蛮大的。于是,基于该组件类捕获组件跳转写了这款通用接口。省时省力。 代码如下:…...
[python]yfinance国内不能使用
yfinance国内不能使用,可以使用tushare、akshare代替 import yfinance as yf# 输入股票代码 stock_symbol AAPL # 替换为你想要查询的股票代码# 获取股票数据 data yf.download(stock_symbol)# 打印实时数据 print(data) pip install akshare import akshare …...
Frontiers旗下期刊,23年分区表整理出炉!它还值得投吗?
本周投稿推荐 SSCI • 中科院2区,6.0-7.0(录用友好) EI • 各领域沾边均可(2天录用) CNKI • 7天录用-检索(急录友好) SCI&EI • 4区生物医学类,0.5-1.0(录用…...
基于JSP的毕业生就业信息管理系统
开头语: 你好,我是专注于信息系统开发的学长猫哥。如果您对毕业生就业信息管理或相关技术感兴趣,欢迎联系我交流。 开发语言: JSP 数据库: MySQL 技术: JSP技术 SSM框架 工具: Eclips…...
CDN、CNAME、DNS
CDN、CNAME、DNS 域名解析是将域名转换为IP地址的过程。当用户在浏览器中输入域名时,计算机需要在DNS系统中找到对应的IP地址,以便能够访问该网站。 CDN(Content Delivery Network,内容分发网络)是一种用于加速网站访…...
直播商城源码-PC+APP+H5+小程序现成源码
随着电商行业的不断演进,直播商城已成为连接消费者和商品的新兴桥梁。直播商城源码提供了一个完整的解决方案,使得企业能够迅速搭建起一个覆盖PC、APP、H5和小程序的全渠道电商平台。本文将探讨直播商城源码的优势、关键功能以及如何选择适合的现成源码。…...
16. 《C语言》——【牛客网BC124 —— BC130题目讲解】
亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能,成为一名优…...
Docker 国内镜像源更换
实现 替换docker 镜像源 前提要求 安装 docker docker-compose 参考创建一键更换docker国内镜像源 Docker 镜像代理DaoCloud 镜像站百度云 https://mirror.baidubce.com南京大学镜像站...
python07
__init__.py from . import p1 from . import p2 # 理解:import p2 先导入 p2 文件, 然后该文件的内容全要 from . # # 告诉调用者,哪些文件需要使用 p1.py def sum(a,b):print(a b) p2.py def max(a,b):if a > b:print(a)else:pri…...
【CTS】android CTS测试
android CTS测试 1.硬件准备2. 软件准备3. 下载 CTS3.1 cts3.2 解压 CTS 包: 4 配置adb fastboot5 检查 Java 版本6 安装aapt26.1 下载并安装 Android SDK6.2 找到 aapt2 工具6.3 配置环境变量 7. 准备测试设备8. 运行 CTS 测试8.1 启动 CTS: 9. 查看测试…...
【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【08】【商品服务】Object划分_批量删除
持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【08】【商品服务】Object划分_批量删除 Object划分批量删除/添加参考 Object划分 数据库中对于一张表的数据,由于拥有隐私字段、多余字段、字段过少等原因,不应该直…...
JAVA开发 PDF文件生成表格,表格根据内容自动调整高度
1、展示效果 2、相关功能实现 JAVA开发 使用Apache PDFBox库生成PDF文件,绘制表格 3、实现代码 import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.ap…...
OSINT技术情报精选·2024年6月第1周
OSINT技术情报精选2024年6月第1周 2024.6.11版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 1、经合组织:《2024数字经济展望:第1卷,拥抱技术前沿》 经合组织近日发布《2024数字经济展望》报告第一卷,…...
惊艳的短视频:成都科成博通文化传媒公司
惊艳的短视频:瞬间之美,震撼心灵 在数字化时代,短视频以其短小精悍、内容丰富的特点,迅速占领了我们的屏幕和时间。而在这个浩如烟海的视频海洋中,总有一些短视频能够脱颖而出,以其惊艳的视觉效果、深刻的…...
消费增值模式引领业绩飙升与用户活跃
大家好,我是吴军,致力于为您揭示私域电商领域的独特魅力与机遇。 今日,我很高兴与大家分享一个激动人心的成功案例。我们的客户在短短一个月的时间里,业绩就飙升至上百万级别,其用户活跃度更是居高不下,日…...
二叉树从入门到AC(3)完全二叉树与堆
完全二叉树与堆 前言优先队列:堆向下调整维护堆向上调整维护堆堆的作用 前言 本文算是补充之前的系列,在前文中,讲了二叉树的基本结构与应用 二叉树从入门到AC(1)构建和前中后序遍历 二叉树从入门到AC(2&a…...
AI写作:如何让创作过程更流畅?
写作这件事一直让我们从小学生头痛到打工人,初高中时期800字的作文让我们焦头烂额,一篇作文里用尽了口水话,拼拼凑凑才勉强完成。 大学时期以为可以轻松顺利毕业,结果毕业前的最后一道坎拦住我们的是毕业论文,苦战几个…...
2024中国海洋装备展暨航海装备大会(福州海峡国际会展中心)
关于邀请参加2024中国海洋装备博览会的函 为加快推动海洋强国建设。在福建省人民政府的大力支持下,第二届中国海洋装备博览会将于2024年11月15-18日在福州举办。 博览会将进一步聚焦产业链和供应链协同创新,着力推动现代海洋产业体系建设,促进海洋科技…...
CyberDAO:引领Web3时代的DAO社区文化
致力于Web3研究和孵化 CyberDAO自成立以来,致力于推动Web3研究和孵化,吸引了来自技术、资本、商业、应用与流量等领域的上千名热忱成员。我们为社区提供多元的Web3产品和商业机会,触达行业核心,助力成员捕获Web3.0时代的红利。 目…...
测试面试点
在面试PC端测试人员时,你可以提出以下具体问题来深入了解候选人的技能、经验和思维方式: 1. 技术能力与基础知识 你能解释一下什么是黑盒测试和白盒测试吗?你在过去的工作中是如何应用这两种测试方法的? 答案:黑盒测…...
Nginx配置详细解释:(4)高级配置
目录 1.网页的状态页 2.Nginx第三方模块(echo) 3.变量 4.自定义访问日志 5.Nginx压缩功能 6.https功能 7.自定义图标 Nginx除了一些基本配置外,还有一些高级配置,如网页的状态,第三方模块需要另外安装,支持变量,…...
OceanBase 4.3 特性解析:列存技术
在涉及大规模数据的复杂分析或即时查询时,列式存储是支撑业务负载的关键技术之一。相较于传统的行式存储,列式存储采用了不同的数据文件组织方式,它将表中的数据以列为单位进行物理排列。这种存储模式允许在分析过程中,查询计算仅…...
ARM32开发--PWM与通用定时器
知不足而奋进望远山而前行 目录 文章目录 前言 学习目标 学习内容 PWM pwm原理 需求 开发流程 初始化PWM PWM占空比控制 main函数修改duty 输出通道 关心的内容 重要的关键词 周期 分频 占空比 总结 前言 在微控制器开发中,理解和掌握PWM&#x…...
debugger(七):栈帧(backtrace)
〇、前言 在前面已经详细得介绍了栈帧,这里实现 backtrace。 一、backtrace 思路是遍历 stack,搜索 stack pointer,逐个打印栈帧信息,一直打印到 main 函数。 void Debugger::print_backtrace() {auto output_frame [frame_n…...
kafka-重试和死信主题(SpringBoot整合Kafka)
文章目录 1、重试和死信主题2、死信队列3、代码演示3.1、appication.yml3.2、引入spring-kafka依赖3.3、创建SpringBoot启动类3.4、创建生产者发送消息3.5、创建消费者消费消息 1、重试和死信主题 kafka默认支持重试和死信主题 重试主题:当消费者消费消息异常时&…...
.net怎么做网站/精准引流的网络推广
随机显示矩阵已经完成了,接下来就是怎么根据输入移动数字 1.首先需要一个issort函数,判断是否排序完成,如果否,则printf输入需要移动的数字,然后根据输入找到要移动的数字,找到下划线的位置,判断…...
网站开发语言学习/搜索引擎优化的七个步骤
在小程序开发中,var that this的声明很常见。举个例子,代码如下! 示例代码1 //index.js Page({ data: { toastHidden: true, }, loadData: function () { var that this//这里声明了that;将this存在that里面 wx.request…...
外贸网站建设软件/推广网站的方法有哪些
一、实验目的 熟悉关系的性质,掌握求判断关系性质的方法二、实验内容 定义1 设R是集合X上的二元关系,对任意的x∈X,都满足<x,x>∈R,则R是自反的。 定义2 设R是集合X上的二元关系,对任意的x∈X,都满…...
江门企业自助建站系统/18款禁用软件黄app免费
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#includemain(){int n,q,p,m,k1,sum0,s[99999]{2},t[99999];//n是输入的数;q和p分别代表两个数组的工作下标scanf("%d",&n); //k是用来取小于n数的数组工作下标for(int i3;i<n;i2) //去所有小于n的数&…...
dedecms wap网站模板下载/全国最好网络优化公司
在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段ÿ…...
wordpress把文章标题放进url/上海sem
目录概念特征选择ID3 算法C4.5 算法CART 算法剪枝概念 决策树算法采用树形结构,使用层层推理来实现最终的分类 决策树是一个包含根节点、内部节点和叶节点的树结构,其根节点包含样本全集,内部节点对应特征属性测试,叶节点则代表…...