当前位置: 首页 > news >正文

24考研数据结构-并查集

目录

    • 5.5.2 并查集(双亲表示法)
      • 1. 并查集的存储结构
      • 2. 并查集的代码实现
        • 初始化
        • 并查
        • 时间复杂度
        • union操作的优化(不要瘦高的树)
        • 并查集的进一步优化(find的优化,压缩路径)
        • 优化总结
    • 数据结构:并查集(Disjoint-Set)
      • 并查集的基本操作
      • 并查集的实现
        • 1. 数组实现并查集
        • 2. 普通树结构实现并查集
        • 3. 优化的树结构实现并查集
      • 原理
      • 应用场景
      • 代码实现
      • 结论

5.5.2 并查集(双亲表示法)

1. 并查集的存储结构

在这里插入图片描述
在这里插入图片描述

2. 并查集的代码实现

初始化

在这里插入图片描述

并查

在这里插入图片描述

时间复杂度

在这里插入图片描述

union操作的优化(不要瘦高的树)

在这里插入图片描述
在这里插入图片描述

并查集的进一步优化(find的优化,压缩路径)

在这里插入图片描述
在这里插入图片描述

优化总结

在这里插入图片描述
在这里插入图片描述

数据结构:并查集(Disjoint-Set)

在计算机科学中,并查集是一种用于处理集合合并与查询问题的数据结构。它主要用于解决一些实际问题中的集合合并和查询问题,如网络连接问题、社交网络中的好友关系、图论中的连通性问题等。并查集是一种高效的数据结构,能够在常数时间内执行合并和查询操作。

并查集的基本操作

并查集主要包含以下两个基本操作:

  1. 查找(Find):查找操作用于确定元素所属的集合,即查找元素所在的根节点(代表元素)。如果两个元素的根节点相同,则表示它们属于同一个集合。

  2. 合并(Union):合并操作用于将两个集合合并为一个集合,即将两个元素所在的集合合并为一个新的集合。合并操作的核心是将其中一个集合的根节点指向另一个集合的根节点,以实现合并。

并查集的实现

并查集可以通过数组和树结构来实现。其中,数组实现是比较简单的方式,但效率相对较低。树结构的实现包括:普通树结构优化的树结构

1. 数组实现并查集

数组实现并查集是一种简单而直观的方式,其中每个元素在数组中对应一个父节点。初始时,每个元素的父节点指向自己,表示它们各自构成一个独立的集合。

合并操作可以通过修改数组中某个元素的父节点来实现。例如,将元素A所在的集合合并到元素B所在的集合,只需要将A的父节点指向B即可。

查找操作可以通过递归或循环遍历找到元素所在集合的根节点,直到根节点的父节点指向自己为止。

数组实现并查集的效率相对较低,特别是在查找操作中可能需要较多的遍历操作。

2. 普通树结构实现并查集

普通树结构实现并查集是在数组实现的基础上,将每个集合构造为一棵树结构。合并操作将一个树的根节点链接到另一个树的根节点,从而实现集合的合并。

但是,普通树结构的并查集在处理合并操作时,可能会出现树不平衡的情况,即某个集合的树高度过高,影响了查找操作的效率。

3. 优化的树结构实现并查集

为了优化并查集的性能,在普通树结构的基础上引入了路径压缩和按秩合并两种优化方法。

  • 路径压缩:在执行查找操作时,将当前节点到根节点的路径上的所有节点直接链接到根节点,从而减少查找操作中的遍历次数,提高查找效率。

  • 按秩合并:在执行合并操作时,将高度较低的树合并到高度较高的树上,从而避免了树的不平衡,提高了合并操作的效率。

优化的树结构实现并查集能够在常数时间内完成合并和查找操作,具有较高的效率和性能。

原理

并查集的基本原理是通过树结构来表示集合,并使用树的根节点来代表集合的代表元素。每个节点表示一个元素,而树的根节点表示该集合的代表元素。在并查集中,每个集合是一棵树,树中的节点通过指针连接。

并查集主要包含两个基本操作:合并和查询。

  • 合并操作:将两个不相交的集合合并成一个集合,即将两个树的根节点连接在一起。
  • 查询操作:判断两个元素是否属于同一个集合,即判断它们的根节点是否相同。

应用场景

并查集广泛应用于解决具有等价关系的问题,例如:

  • 社交网络中的好友关系,判断两个用户是否在同一个社交圈子中。
  • 图像处理中的连通区域,判断图像中的像素是否属于同一个区域。
  • 岛屿数量问题,判断地图中岛屿的个数和是否相连。

代码实现

在实现并查集时,我们需要定义一个节点结构来表示每个元素,并编写合并和查询操作的函数。

首先,定义一个节点结构:

class Node:def __init__(self, data):self.data = dataself.parent = selfself.rank = 0

在初始化时,每个节点的父节点都是它自己,表示每个节点都是一个单独的集合。rank表示树的高度,用于优化合并操作。

接下来,实现合并和查询操作的函数:

def find(node):if node != node.parent:node.parent = find(node.parent)return node.parentdef union(node1, node2):root1 = find(node1)root2 = find(node2)if root1 == root2:returnif root1.rank > root2.rank:root2.parent = root1elif root1.rank < root2.rank:root1.parent = root2else:root1.parent = root2root2.rank += 1

在find函数中,使用路径压缩来优化查询操作,将节点的父节点直接设为根节点,加快下一次查询的速度。

在union函数中,通过rank来优化合并操作,将高度较低的树连接到高度较高的树上,使得整个树结构更加平衡。

结论

并查集是一种用于处理集合合并与查询问题的高效数据结构。它在解决网络连接、社交网络、图论等问题时具有重要的应用价值。在实际应用中,根据具体的场景和需求,我们可以选择不同的实现方式,如数组实现、普通树结构实现或优化的树结构实现,并根据情况选择合适的优化方法,以获得更高的执行效率和性能。

相关文章:

24考研数据结构-并查集

目录 5.5.2 并查集&#xff08;双亲表示法&#xff09;1. 并查集的存储结构2. 并查集的代码实现初始化并查时间复杂度union操作的优化&#xff08;不要瘦高的树&#xff09;并查集的进一步优化&#xff08;find的优化&#xff0c;压缩路径&#xff09;优化总结 数据结构&#x…...

Redis 和 Mysql 如何保证数据一致性

项目场景&#xff1a; 一般情况下&#xff0c;Redis 用来实现应用和数据库之间读操作的缓存层&#xff0c;主要目的是减少数据库 IO&#xff0c;还可以提升数据的 IO 性能。 如下图所示&#xff0c;这是它的整体架构。 当应用程序需要去读取某个数据的时候&#xff0c;首先会先…...

WSL1升级为WSL2

首先需要启用组件 使用管理员打开Powershell并运行 Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform启用后会要求重启计算机 从https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi获取WSL2 Linux内核更新包&#xff0c;…...

力扣 1049. 最后一块石头的重量 II

题目来源&#xff1a;https://leetcode.cn/problems/last-stone-weight-ii/description/ C题解&#xff08;思路来源代码随想录&#xff09;&#xff1a;本题其实就是尽量让石头分成重量相同的两堆&#xff0c;相撞之后剩下的石头最小&#xff0c;这样就化解成01背包问题了。 …...

【广州华锐视点】葡萄种植VR虚拟仿真实训平台

随着虚拟现实(VR)技术的不断发展&#xff0c;越来越多的教育领域开始尝试将VR技术应用于教学中。在葡萄栽培这一专业领域&#xff0c;我们开发了一款创新的VR实训课件&#xff0c;旨在为学生提供沉浸式的互动学习体验。本篇文案将为您介绍葡萄种植VR虚拟仿真实训平台所提供的互…...

PBR材质理解整理

PBR Material 草履虫都能看懂的PBR讲解&#xff08;迫真&#xff09; 先前看了很多遍类似的了&#xff0c;结合《Unity Shader 入门精要》中的内容整理了下便于以后理解&#xff0c;以后有补充再添加。 光与材质相交会发生散射和吸收&#xff0c;散射改变光的方向&#xff0c…...

从c++的角度来看ffmpeg 的架构

------------------------------------------------------------------------- author: hjjdebug date: 2023年 08月 01日 星期二 11:26:40 CST descriptor: 从c的角度来看ffmpeg 的架构 ------------------------------------------------------------------------…...

Ubuntu安装JDK与IntelliJ IDEA

目录 前言 Ubuntu 安装 JDK 1、更新软件包列表 2、安装OpenJDK 3、验证安装 Ubuntu安装IntelliJ IDEA 1、下载 IntelliJ IDEA 2、解压缩 IntelliJ IDEA 安装包 3、移动 IntelliJ IDEA 到安装目录 4、启动 IntelliJ IDEA 前言 APT&#xff08;Advanced Package Tool&…...

【雕爷学编程】Arduino动手做(182)---DRV8833双路电机驱动模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…...

一个完整的http请求响应过程

一、 HTTP请求和响应步骤 以上完整表示了HTTP请求和响应的7个步骤&#xff0c;下面从TCP/IP协议模型的角度来理解HTTP请求和响应如何传递的。 二、TCP/IP协议 TCP/IP协议模型&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;&#xff0c;包含了一系…...

Unity通过代码切换材质

效果展示 代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class MaterialSwitcher : MonoBehaviour {public Material newMaterial; // 新材质private Material oldMaterial; // 旧材质private Renderer renderer; // 渲染器组件…...

Java根据坐标经纬度计算两点距离(5种方法)、校验经纬度是否在圆/多边形区域内的算法推荐

目录 前言 一、根据坐标经纬度计算两点距离&#xff08;5种方法&#xff09; 1.方法一 2.方法二 3.方法三 4.方法四 5.方法五 5.1 POM引入第三方依赖 5.2 代码 6.测试结果对比 二、校验经纬度是否在制定区域内 1.判断一个坐标是否在圆形区域内 2.判断一个坐标是否…...

PIC单片机如何设计延时

PIC单片机如何设计延时 PIC单片机的延时基本有两种,一种是自己设计的delay()函数,另一种就是利用其自带的Time定时器。当然一般Time定时器的精度要高于自己设计delay()函数,Time定时器是单片机内部的硬件寄存器模块,而delay()函数是利用自加自减来实现延时,代码进行顺序执…...

FFmpeg常见命令行(二):FFmpeg转封装

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;如何使…...

全面升级:华为鸿蒙HarmonyOS4正式发布,玩趣个性化,小艺AI升级

8月4日新闻&#xff0c;今天下午&#xff0c;华为正式发布了最新版本的鸿蒙操作系统——HarmonyOS 4&#xff01; 在华为发布会上&#xff0c;鸿蒙HarmonyOS迎来了一系列令人激动的功能升级。其中包括个性化空间、多种生产力工具以及增强的手机AI助手"小艺"。这次更…...

【python】使用Selenium和Chrome WebDriver来获取 【腾讯云 Cloud Studio 实战训练营】中的文章信息

文章目录 前言导入依赖库设置ChromeDriver的路径创建Chrome WebDriver对象打开网页找到结果元素创建一个空列表用于存储数据遍历结果元素并提取数据提取标题、作者、发布时间等信息判断是否为目标文章提取目标文章的描述、阅读数量、点赞数量、评论数量等信息将提取的数据存储为…...

使用Feign 的远程调用,把mysql数据导入es

要把数据库数据导入到elasticsearch中&#xff0c;包括下面几步&#xff1a; 1&#xff09;将商品微服务中的分页查询商品接口定义为一个FeignClient&#xff0c;放到feign-api模块中 2&#xff09;搜索服务编写一个测试业务&#xff0c;实现下面功能&#xff1a; 调用item-ser…...

Java课题笔记~ MyBatis接口开发(代理开发)

使用XML文件进行开发&#xff0c;在调用SqlSession进行操作时&#xff0c;需要指定MyBatis映射文件中的方法&#xff0c;这种调用方式过于烦琐。为解决此问题&#xff0c;MyBatis提供了接口开发的方式。 接口开发的目的&#xff1a; 解决原生方式中的硬编码 简化后期执行SQL …...

从数学到深度学习的学习资料及教程合集

诸神缄默不语-个人CSDN博文目录 目前仅收集免费内容&#xff0c;最多需要买本纸质书。 付费的如果有免费版本我也会收录。 链接如失效请联系我。 这个笔记主要是为我自己准备的&#xff0c;算是一个可公开的to do list&#xff08;其实做不完的我也知道&#xff09;&#xff…...

nn.CrossEntropyLoss()报错

RuntimeError: “nll_loss_forward_reduce_cuda_kernel_2d_index” not implemented for ‘Float’ Traceback (most recent call last): File "<string>", line 1, in <module> File "/home/zz/anaconda3/envs/torch1.11/lib/python3.7/site-pack…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...