计算机基础--->数据结构(9)【并查集】

文章目录

  • 并查集的概述
  • 并查集的主要用途
  • 并查集的实现
    • 创建和初始化集合
    • 查找当前元素的集合根节点
    • 判断两个元素是否处于同一集合
    • 合并两个集合
    • 对节点的路径进行压缩

并查集的概述

并查集是一种用于解决集合合并和查询问题的数据结构,主要用于实现有关集合的操作,它有两种主要操作,合并(union)和查找(find)。

  1. 查找(Find):用来确定元素属于哪个集合。它接受一个元素作为参数,并返回这个元素所属集合的代表元素。通过查找操作,可以判断两个元素是否属于同一个集合。
  2. 合并(Union):用于将两个集合合并成一个集合。它接受两个元素作为参数,并将这两个元素所属的集合进行合并。合并操作可以将两个不相交的集合合并成一个集合。

并查集由一组集合构成,其中每个集合标识了一个由元素组成的不相交的子集。每个集合有一个代表元素,通常是集合中的某个元素,代表元素可以用来唯一标识一个集合。

并查集的主要用途

  1. 可以判断两个元素是否属于同一集合:可以解决连接性问题,比如判断网络中两个节点之间是否存在连通路径
  2. 判断图中是否有环存在:逐条遍历图中的边,不断执行合并操作,如果尝试合并两个已经在同一个集合中的元素,则说明存在环路
  3. 求连通分量
  4. 图的最小生成树算法
  5. 动态等价关系:判断社交网络中两个人是否是朋友关系

并查集的实现

创建和初始化集合

在这里插入图片描述

    private int[] ids;// 集合public UnionFind1(int[] arr) {int length = arr.length;ids = new int[length];for (int i = 0; i < length; i++) {ids[i] = i;}}

查找当前元素的集合根节点

    public int findParent(int index) {// 递归终止条件if (index == this.parent[index]) {return this.parent[index];}return findParent(parent[index]);}

判断两个元素是否处于同一集合

    public boolean isConnected(int p, int q) {return findParent(p) == findParent(q);}

合并两个集合

在这里插入图片描述

将节点少的树合并到节点多的树

    public void union(int p, int q) {int pFather = findParent(p);int qFather = findParent(q);if (pFather != qFather) {if (sz[pFather] > sz[qFather]) {this.parent[qFather] = pFather;sz[pFather] = sz[qFather];} else {this.parent[pFather] = qFather;sz[qFather] = sz[pFather];}}}

将高度小的树合并到高度大的树

    public void union(int p, int q) {int pFather = findParent(p);int qFather = findParent(q);if (pFather != qFather) {if (rank[pFather] > rank[qFather]) {this.parent[qFather] = pFather;} else if (rank[pFather] < rank[qFather]) {this.parent[pFather] = qFather;} else{this.parent[pFather] = qFather;rank[qFather] += 1;}}}

对节点的路径进行压缩

在这里插入图片描述

    // 压缩方式一public int findParent(int index) {// 递归终止条件if (index == this.parent[index]) {return this.parent[index];}parent[index] = parent[parent[index]];return findParent(parent[index]);}// 压缩方式二public int findParent(int index) {// 递归终止条件int curIndex = index;while (curIndex != parent[curIndex]) {curIndex = parent[curIndex];}parent[index] = curIndex;return curIndex;}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 配置 openjdk,jre

使用 idea 配置 zip 版本的 openjdk 和 jre&#xff0c;我使用的时 redhat 提供的 jdk 和 jre。 一、下载 idea、jdk 和 jre 红帽下载地址为&#xff1a; jdk 和 jre 安装地址根据个人配置&#xff0c;我的配置如下&#xff1a; 下划线的分别为我的 jdk 和 jre 保存路径 二…

【力扣刷题 | 第十八天】

目录 前言&#xff1a; 1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 134. 加油站 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; 前言&#xff1a; 今天随机刷题&#xff0c;不对题型做具体的要求 1005. K 次取反后最大化的数组和 …

【2023,学点儿新Java-33】字符型变量char | 布尔类型变量 boolean:true、false

前情提要&#xff1a; 【2023&#xff0c;学点儿新Java-32】Java基础小练习&#xff1a;根据圆周率与半径求圆的面积 | 温度转换 | 计算矩形面积 | 判断奇偶数 | 年龄分类【2023&#xff0c;学点儿新Java-31】测试&#xff1a;整型和浮点型变量的使用 | 附&#xff1a;计算机存…

2.zabbxi操作和设置

文章目录 zabbxi操作和设置添加zabbix-agent客户端web端添加客户端 自定义监控模板&#xff08;面试&#xff09;监控模板下载地址案例1案例2 设置邮件报警自动注册和自动发现自动发现&#xff08;对于agent是被动模式&#xff09;自动注册&#xff08;对于agent是主动模式&…

PROFINET转TCP/IP网关TCP/IP协议的含义是

大家好&#xff0c;今天要和大家分享一款自主研发的通讯网关&#xff0c;远创智控YC-PN-TCPIP。这款网关可是集多种功能于一身&#xff0c;PROFINET从站功能&#xff0c;让它在通讯领域独领风骚。想知道这款网关如何实现PROFINET和TCP/IP网络的连接吗&#xff1f;一起来看看吧&…

虚拟化容器化与docker

虚拟化容器化与docker 基本概念虚拟化分类虚拟化实现主机虚拟化实现容器虚拟化实现命名空间namespace空间隔离 控制组群cgroup资源隔离 LXC(Linux Container) docker与虚拟机 基本概念 物理机&#xff1a; 实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理…

DSP开发软件css(10)使用基础(汉化、工程导入、设置目标配置文件、选择仿真器和芯片型号、添加文件|库路径、编译下载等操作)

DSP开发软件css(10)使用基础(汉化、工程导入、设置目标配置文件、选择仿真器和芯片型号、添加文件|库路径、编译下载等操作&#xff09; 文章目录 DSP开发软件css(10)使用基础(汉化、工程导入、设置目标配置文件、选择仿真器和芯片型号、添加文件|库路径、编译下载等操作&#…

【软件设计师暴击考点】操作系统知识高频考点暴击系列【一】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

Ext4文件系统介绍 - 理论篇

Overview ext4文件系统分割成多个block groups&#xff0c;为了解决碎片化问题&#xff0c;block allocator尽量将一个文件的block放在一个group中。block groups的size通过sb.s_blocks_per_group指定&#xff0c;同样也可以通过8*block_size_in_bytes计算得到。block默认大小…

每个前端开发者都应知道的10个实用网站

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势&#xff0c;学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录&#xff0c;有一线大厂面试完整考点、资料以及我的系列文章。 快来免费体验ChatGpt plus版本的&#xff0c;我们出的钱 体验地…

吐血整理,Jmeter分布式性能压测-常见问题+解决(详细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 安装常见问题 问题…

面试题更新之-什么是响应式设计?响应式设计的基本原理是什么?如何兼容低版本的IE?css实现响应式设计的方案

文章目录 什么是响应式设计&#xff1f;响应式设计的基本原理是什么如何兼容低版本的IE&#xff1f;css实现响应式设计的方案媒体查询&#xff08;Media Queries&#xff09;&#xff1a;弹性单位&#xff08;Flexible Units&#xff09;&#xff1a;Flexbox布局&#xff1a;Gr…