高阶数据结构------并查集

并查集

在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个集合,然后按照一定的规律将归于同一组的元素集合合并。在此过程中要反复用到查询某一个元素归属于哪一个集合的运算。适合于描述这类问题的抽象数据结构类型成为并查集(UnionFindSet)。

比如:亲戚关系,朋友敌人关系,食物链关系。

比如:给定10个人,5对关系,没对关系描述两个人,表示这两个人是亲戚,最后问你某两个人之间是否是亲戚关系。

再比如:给定10个人,5对关系,没对关系描述两个人,表示这两个人之间的关系(朋友或者敌人),最后问你某两个人之间的关系。

…………

上述问题就可以使用并查集这一数据结构来解决。

接下来实现并查集这一数据结构

以一个简单的列子为例:

某公司今年校招全国总共招生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担任队长,负责大家的出行。

一:初始化

起初时,我们可以创建一个数组,数组下标表示元素的编号,数组中的值全部初始化为-1,表示该元素最初子集单独为一个集合(自己就是父亲)。

二:Find操作

该操作的目的是判断某个元素属于哪个集合(找到该元素所属集合的代表元素(通俗来说就是向上找跟操作))。

该操作可以通过循环来实现,不断去找自己的父亲,不断向上走,知道最终的元素没有父亲(值为-1)为止。

三:Union操作

已知两个元素之间存在关系要合并这两个元素,本质是将这两个元素所属的集合进行合并,这很好理解,朋友的朋友还是朋友。因此要先进行找两个元素所属集合的根节点,最终将这两个集合合并(一个集合的根节点认另一个集合的根节点为父亲)

顺便可以统计一下合并后集合共有多少元素(abs(_ufs[root1]))

四:ISsame操作

给定两个元素,判断这两个元素是否属于同一个集合。

只需要判断这两个集合的祖先是否相同就可以了。

五:SetCount操作

判断当前一共有多少个集合(有多少个大家庭)

只需要遍历一遍数组,判断有多少值为-1就可以了。

并查集优化操作

一般来说并查集实现成上面的样子已经可以了,但是当数据量比较庞大的时候,效率(性能)

就会有所下降,因此要考虑进行优化。

一:优化Union操作

在上面实现的并查集中,采用的方法是将下标大的元素向下标小的元素合并,极端情况下经过一系列合并后集合会成为一个链表结构(一条线),再进行Find操作时时间复杂度就会是O(n)。

因此,我们改变合并思路,我们每次进行合并操作时,都将元素数量少的集合向元素数量多的集合合并,这样就可以很好的控制集合这一树形结构的高度,性能就会有所提升。

二:路径压缩

并查集只是要在某一个集合中找出一个代表元素,并不在意找出哪一个,因此对于不是根的结点,

认谁为父亲都是可以的,因此我们在Find操作的过程中就可以进行路径压缩,将所有遍历到的结点

的父亲都修改成root,这样可以大大降低树的高度,查找的时间复杂度近似为O(1),性能就会提升。

路径压缩也可以实现成递归的形式(代码短,好写),但是不太推荐,递归怕的就是层数太深,

如果数据量非常大的情况下递归很可能是不可行的。

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

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

相关文章

OWASP Top 10 是什么?

OWASP(Open Web Application Security Project,开放Web应用安全项目)是一个致力于提高软件安全性的国际非营利组织。其发布的 ​OWASP Top 10​ 是最具影响力的Web应用安全风险清单,每3-4年更新一次,帮助开发人员、安全…

如何在IIS上部署net系统(安装iis参考上一篇)

1.对后端项目打包,我使用的时rider 2.打包前端 npm run build 3.在iis上部署 网站-添加网站 4.选择之前打包的后端文件,设置端口 5.安装对应net环境插件:主要是runtime和sdk插件以及dotnet-hosting-2.2.0-win,具体版本看自己项…

Docker可视化管理工具Portainer安装部署

1、安装Portainer 编写docker compose文件,使用docker compose文件完成Portainer的安装,首先需要在服务器上编写的名为portainer.yaml的文件,内容如下: [rootserver ~]# cat portainer.yaml services: portainer: image:…

ai之RAG本地知识库--基于OCR和文本解析器的新一代RAG引擎:RAGFlow 认识和源码剖析

目录标题 RAG本地知识库问答——基于OCR和文本解析器的新一代RAG引擎:RAGFlow 认识和源码剖析RAGflow 主要功能: 一、RAGflow 简介1.1 允许用户上传并管理自己的文档(文档类型可以是任意类型)1.2 RAGFlow的4个特色1.2.1 AI 模型的智能文档处理系统1.2.2 …

[面试] 手写题-new

function mynew(Func, ...args) {// 1.创建一个空对象const obj {}// 2.新对象隐式原型指向构造函数的显式原型obj.__proto__ Func.prototype// 3.将构建函数的this指向新对象let result Func.apply(obj, args)// 4.返回objreturn result instanceof Object ? result : obj…

设计模式精讲 Day 20:状态模式(State Pattern)

【设计模式精讲 Day 20】状态模式(State Pattern) 文章标签 设计模式, 状态模式, Java开发, 面向对象设计, 软件架构, 设计模式实战, Java应用开发 文章简述 状态模式是行为型设计模式中的重要一员,用于管理对象在不同状态下的行为变化。在…

桥岛隧大型工程 3D 可视化监测平台

深中通道作为“桥、岛、隧、水下互通”一体化跨海集群工程,其复杂结构带来高强度监测难题。借助图扑软件 HT 实现深中通道的建设与运营的数字化升级,为交通基建行业迈向高效、智能的未来提供了有力支撑。 图扑自主研发的 HT for Web 产品搭建深中通道-桥…

基于SpringBoot和Leaflet的区域冲突可视化系统(2025企业级实战方案)

摘要 在全球地缘冲突与应急事件频发的2025年,区域态势可视化系统成为政府及企业的决策刚需。本文提出基于​​SpringBoot 3.2​​后端与​​Leaflet 1.9.5​​前端的冲突可视化解决方案,融合多源异构数据(卫星影像、舆情热力、设施状态&…

[密码学实战]国密TLCP协议报文解析代码实现(三十)

[密码学实战]国密TLCP协议报文解析代码实现(三十) 本文将深入解析国密TLCP协议报文结构,提供完整的Java实现代码,帮助开发者理解TLCP协议在国密环境下的通信机制和安全性设计。 一、国密TLCP协议概述 TLCP(Transport Layer Cryptographic Protocol)是基于国密算法(SM2/…

[Python] -基础篇5-玩转Python内置数据结构:列表、元组、字典与集合

Python 是一门以简洁优雅著称的编程语言,其中内置的数据结构为日常编程提供了强大支持。本文将系统介绍 Python 中四大核心数据结构:列表(list)、元组(tuple)、字典(dict)与集合(set),并配以实用示例,帮助读者全面掌握其用法及适用场景。 一、列表(List):可变序…

技术突破与落地应用:端到端 2.0 时代辅助驾驶TOP10 论文深度拆解系列【第八篇(排名不分先后)】

HiP-AD: Hierarchical and Multi-Granularity Planning with Deformable Attention for Autonomous Driving in a Single Decoder GitHub地址:​https://github.com/nullmax-vision/HiP-AD​ 在自动驾驶技术飞速发展的今天,端到端自动驾驶(E…

transformer位置编码研究相关的综述、论文

一、权威综述 《利用位置编码实现长度外推》 (腾讯云开发者社区, 2024) 系统分析绝对/相对位置编码(APE/RPE)在长序列外推中的技术演进,涵盖RoPE、Alibi、Xpos等优化方案,讨论位置插值、NTK-aware缩放等扩展…

垂直领域AI智能体开发指南:用Bright Data MCP接入智能体攻克数据难关

垂直领域AI智能体开发指南:用Bright Data MCP接入智能体攻克数据难关 一、智能体时代的数据困局1.1 AI智能体的爆发式增长1.2 开发者遭遇的"数据瓶颈" 二、Bright Data MCP:智能体的数据引擎2.1 重新定义数据获取方式2.2 支持的核心场景2.3 四…

Stable Diffusion 项目实战落地:从0到1 掌握ControlNet 第三篇: 打造光影字形的创意秘技-文字与自然共舞

上一篇,我们一起玩转了 野外光影字,是不是被那种自然和光影交织的效果惊艳到啦? 如果你错过了那篇文章,别担心,赶紧点这里补课:Stable Diffusion 项目实战落地:从0到1 掌握ControlNet:打造光影文字 第二篇 - 野外光影字。 今天,我们将一起做一个 生成的嵌入式文字【…

CppCon 2018 学习:Feather: A Modern C++ Web Development Framework

你这段内容罗列的是 Web 开发中的几个基础概念和组成模块,下面我逐一用中文进行解释,并理清它们之间的关系: 基础概念说明 1. HTTP Server(HTTP服务器) 是一个监听 HTTP 请求并返回响应的程序。主要功能&#xff1a…

武汉大学机器人学院启航:一场颠覆性的产教融合实验,如何重塑中国智造未来?

当百年学府按下“产业加速键”,教育革命的号角已经吹响 2025年7月,武汉大学一纸公告震动教育界与科技圈——成立机器人学院,携手小米、宇树等硬科技领军企业,聘请10位产业教授入驻。这绝非一次常规的校企合作,而是一场…

QT记事本4——下拉框修改值后解决乱码问题

下拉框修改值后解决乱码问题 void Widget::onCurrentIndexChanged(int index) {qDebug()<<index;//索引从0开始qDebug()<<ui->comboBox->currentText();//切换编码时&#xff0c;首先清空当前的文本框ui->textEdit->clear();if(file.isOpen()){//仅在…

““ ‘‘ C++

在C中&#xff0c;"" 和 的含义完全不同&#xff0c;只有""是空字符串&#xff0c;而既不是空字符串&#xff0c;也不能表示空字符&#xff0c;具体区别如下&#xff1a; 1. 双引号 ""&#xff1a;空字符串字面量 类型&#xff1a;const char…

电脑远程控制另一台电脑无法连接怎么办

电脑远程控制另一台电脑无法连接怎么办&#xff1f;远程桌面连接是远程管理另一台计算机时比较常用的方式&#xff0c;在进行电脑远程控制时&#xff0c;无法连接是常见的问题&#xff0c;以下将从多个方面分析原因并提供解决方法。如果涉及无公网IP目标主机需要远程桌面连接的…

springboot3.2/3.4+rocketmq5.3.3测试程序的基本例子

想测试下springboot新版中与rocketmq5.3.3的配置使用&#xff0c;今天尝试了下&#xff0c;记录如下&#xff1a; 1、首先springboot使用3.2.7&#xff0c;rocketmq使用5.3.3&#xff0c;且使用docker部署rocketmq。 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/do…