数据结构学习记录——集合及运算(集合的表示、并查集、树结构表示集合、集合运算、查找函数、并运算)

news2024/11/20 10:23:17

目录

集合的表示

集合运算概述

并查集

树结构表示集合

集合运算

查找函数

并运算 


集合的表示

集合运算概述

交、并、补、差,判定一个元素是否属于某一个集合

并查集

集合并、查某元素属于什么集合

 我们最主要关心的就是集合的两个运算,一个是把两个集合并起来;另一个是查找某一个元素是属于哪个集合的。

【例】有10台电脑{1,2,3,...,9,10},已知下列电脑之间已经实现了连接:

1和22和43和54和75和86和96和10

问:2和7之间,5和9之间是否是连通的?

解决思路

(1)将10台电脑看成10个集合{1},{2},{3},...,{9},{10};

(2)已知一种连接“x和y”,就将x和y对应的集合合并;

(3)查询“x和y是否是连通的”就是判别x和y是否属于同一集合。

已经清楚思路了,那么在这样的并查集问题中集合存储要如何实现呢?

  • 可以用树结构表示集合,树的每个结点代表一个集合元素

树结构表示集合

例如,有三个整数集合

S1 = {1,24,7}

S2 = {3,5,8}

S3 = {6,9,10}

存储形式采用数组 

 数组中每个元素的类型描述为:

typedef int ElementType;  
typedef struct
{
    ElementType Data;
    int Parent;
}SetType;

 

采用数组存储结点,可以通过下标访问结点,从而快速访问结点和结点信息。

双亲表示法只需要存储每个结点的父结点下标,相比于其他树形结构存储方式,双亲表示法占用的空间更小。

采用数组形式的树形结构双亲表示法存储集合结构的实现相对来说比较简单,易于理解和实现。

但是,

在使用时需要注意数组大小的限制和节点添加、删除的效率问题。此外,双亲表示法对于树形结构的高度有一定的限制,如果树的高度过高,会导致数组过大,空间利用率下降。

 

集合运算

查找函数

查找某个元素所在的集合(用根结点表示

#define MAXN 1000                  /* 集合最大元素个数 */
typedef int ElementType;           /* 默认元素可以用非负整数表示 */
typedef int SetName;               /* 默认用根结点的下标作为集合名称 */
typedef ElementType SetType[MAXN]; /* 假设集合元素下标从0开始 */

SetName Find( SetType S, ElementType X )
{    /* 默认集合元素全部初始化为-1 */
    if ( S[X] < 0 ) /* 找到集合的根 */
        return X;
    else
        return S[X] = Find( S, S[X] );  /* 路径压缩 */
}

S 数组用于存储每个元素的父结点,如果一个元素的父结点为负数,则说明该元素为集合的根。

在查找元素 X 所在的集合时,首先判断该元素是否为集合的根,如果是,则直接返回该元素的下标。

如果不是,则通过递归查找该元素的父结点,直到找到集合的根,并将路径上所有结点的父结点都设置为根结点。

在递归返回时,算法还进行了路径压缩的优化。也就是将路径上所有结点的父结点都设置为根结点,避免了后续查找时的重复递归。

路径压缩

路径压缩是一种优化技术,用于加速查找并查集中元素所在集合的过程。

在不进行路径压缩的情况下,每次查找一个元素的根结点时,需要从该元素一直向上遍历到根结点,并将路径上所有结点的父结点都设置为根结点,这样才能保证以后查找该元素所在集合时的效率。

而路径压缩技术的思想是:在递归返回的过程中,将路径上所有结点的父点都设置为根结点。假设要查找元素 X 所在的集合,从 X 开始向上查找其父结点,直到找到集合的根结点,然后将路径上所有节点的父结点都设置为根结点。这样就可以将路径上的所有结点都直接连接到根结点上,从而压缩树的高度,提高查找效率。

并运算 

在进行并运算时,要注意

元素所在集合的根结点的 S 值为负数不仅仅单纯为-1,而是用负数大小来表示集合的大小。(例如-7则表示集合中有7个元素)。

void Union( SetType S, SetName Root1, SetName Root2 )
{     /* 这里默认Root1和Root2是不同集合的根结点 */
    /* 保证小集合并入大集合 */
    if ( S[Root2] < S[Root1] )  /* 如果集合2比较大 */
    { 
        S[Root2] += S[Root1];     /* 集合1并入集合2  */
        S[Root1] = Root2;
    }
    else                        /* 如果集合1比较大 */
    {                         
        S[Root1] += S[Root2];     /* 集合2并入集合1  */
        S[Root2] = Root1;
    }
}

在合并两个集合时,根据两个集合的大小来判断将哪个集合并入另一个集合。这样能使得并起来之后的树的高度尽可能小一点。

如果集合 1 的大小(S[Root1])比集合 2 的大小(S[Root2])小,就将集合 1 并入集合 2 中。

此时,需要将集合 1 的根结点的父结点设置为集合 2 的根结点,并将集合 2 的大小增加集合 1 的大小。


end 


学习自:MOOC数据结构——陈越、何钦铭 

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

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

相关文章

【网络原理】TCP原理

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; 目 录 &#x1f343;一. 确认应答&#x1f342;二. 超时重传&#x1f341;三. 连接管理&#x1f33f;四. 滑动窗口&#x1f33b;五. 流量控制&#x1f340;六. 拥塞控制&#x1f49…

量子计算:当前阶段仍属于热炒概念

一、量子计算为何可能会成为一个风口&#xff1f; 量子计算是利用量子力学原理进行计算的新型计算方式。与传统的经典计算机不同&#xff0c;量子计算机利用量子比特&#xff08;qubits&#xff09;进行信息处理&#xff0c;由于量子比特可以处于叠加态&#xff0c;这使得量子…

【英】考虑多能负荷不确定性的区域综合能源系统鲁棒规划(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

携手共建数字钢铁,Hightopo亮相第三届钢铁展洽会

4 月 26 日备受期待的第三届钢铁展洽会在日照盛大召开。图扑软件作为智慧钢铁行业领先的 2D 和 3D 图形界面可视化解决方案提供商&#xff0c;受邀参与此次展会。 图扑软件携智慧钢铁三维可视化监控体系亮相“钢铁展洽会”&#xff0c;向众多钢铁企业展示了一系列图扑 HT 数字…

性价比最高的护眼台灯是哪款?最好的护眼台灯

不管你处在学生被动学习还是上班后主动学习的阶段&#xff0c;为自己挑选一款合适的台灯非常重要&#xff0c;因为夜晚的氛围能达到很高的学习效率&#xff0c;而台灯可以保证我们有一个舒适的阅读感受。那在为学习需求挑选台灯时&#xff0c;不应该以平价作为选购标准&#xf…

RTC 体验优化的“极值”度量与应用

随着线上互动需求的增加&#xff0c;直播连麦、语音/视频聊天的应用越来越广泛。我们一直在说“追求用户的极致体验”&#xff0c;但是体验是一个抽象的概念&#xff0c;很难量化和统计。如何从用户的行为中得到所在场景的优化“极值”&#xff0c;如何依据“极值”建立统一的质…

macOS Ventura 13.4 RC2(22F63)发布

系统介绍 根据黑果魏叔官网提供&#xff1a;5 月 12 日消息&#xff0c;苹果今天面向开发人员&#xff0c;发布了 macOS Ventura 13.4 的第 2 个候选 RC 版本&#xff08;内部版本号 22F63&#xff09;&#xff0c;距离上个候选版本相隔数天时间。 macOS Ventura 带来了台前调…

VS2022安装NuGet 包

手动安装 在 解决方案资源管理器 中加载项目&#xff0c;然后选择“项目>管理 NuGet 包”。系统会打开“NuGet 包管理器”窗口。 2、 选择“ 浏览 ”选项卡&#xff0c; 使用左上角的搜索框搜索特定包。 从列表中选择一个包&#xff0c;在右侧窗格中显示其信息&#xff0c;…

MySQL(表的约束)

文章目录 0. 前言1. 空属性2. 默认值3. 列描述4. zerofill5. 主键6. 自增长7. 唯一键8. 外键 0. 前言 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正…

【ChatGPTMidjourney】许多职业即将消失,AI 即将战胜人类了吗?

文章目录 前言一、人类科技发展史二、 AI浪潮下的挑战1. 数据安全和隐私保护问题2. 带来新的伦理和道德问题3. 版权和知识产权问题 三、对传统行业和就业的冲击1.传统文本编辑行业受到冲击2.就业岗位的变化3.工作流程的变化4.创意版权问题 四、AI浪潮下的机遇1.提高效率和创意性…

不用网闸、FTP的话 如何实现内外网数据交换?

网络隔离已然成为很多企业首选的数据保护方式&#xff0c;即使是内部人员之间&#xff0c;也是不能随意的发送敏感文件的。但是&#xff0c;文件的流转交互&#xff0c;又是不可避免的&#xff0c;网络隔离保障了企业网络安全&#xff0c;但在具体实践中仍需解决各隔离网间的数…

基于html+css图展示57

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Ubuntu一条命令下载MCU固件

现在很多项目开发都逐渐的迁移到Linux环境下。但是Linux开发单片机就没有像Windows下开发那么方便&#xff0c;它没有对应开发工具&#xff08;KEIL&#xff0c;IAR等&#xff09;&#xff0c;它们自带烧录等功能。所以在Linux上开发单片机需要安装下载固件的工具–JLink。 J…

小程序上线流程

1.配置服务器域名 小程序接口API 2.业务域名配置 ​首先配置小程序的业务域名&#xff0c;将下载txt文件放在A 域名根目录下&#xff0c;然后才可以配置业务域名为 A 。主要应用场景为&#xff0c;小程序页面跳转其他小程序 3. npm run build:weapp 编译&#xff0c;小程序代…

【ChatGPT】 AI 手把手一步一步教学 Self-Attention:这些动图和代码让你一次读懂ChatGPT背后的“自注意力”

BERT 及其多种变体已经在多种语言理解任务上取得了非常出色的表现,这些架构全都基于 Transformer,而 Transformer 又使用了一种名为「自注意力」的方法。本文将通过图示和代码对自注意力机制进行透彻的解读。当然,在阅读本文之前,你可能也想了解什么是注意力机制。没有问题…

【JS】js常用工具类:

文章目录 一、 将对象拼接到url地址后面二、正则获取url中的图片名称三、获取多数组之间的差集四、数组遍历判断是否需要拼接地址五、 数组去重六、如果值不存在就 push 进数组&#xff0c; 反之不处理七、过滤对象中为NaN&#xff0c;undefined的属性八、字符串中插入千位分隔…

基于SpringBoot+Vue的校园疫情防控系统(附源码和数据库)

文章目录 第一章2.主要技术第三章第四章 系统设计4.1功能结构4.2 数据库设计4.2.1 数据库E/R图4.2.2 数据库表 第五章 系统功能实现5.1系统功能模块5.2后台功能模块5.2.1管理员功能 源码咨询 第一章 springboot校园疫情防控系统演示录像2022 一个好的系统能将校园疫情防控的管理…

ChatGPT网站如何像软件一样可以安装下载

今天给大家分享一下, 如何实现网站能够在手机端像软件一样下载在桌面保存, 这样下次就能像打开app一样访问网站了, 是不是听了之后会很心动呢, 接下来我们就一起来学习一下知识, 快来试试这样的效果吧, 最后分享一下我做的一个chatGPT网站, 欢迎大家免费试玩chatGPT, 不过我的免…

JVM系列-第8章-执行引擎

执行引擎 执行引擎概述 执行引擎概述 执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念&#xff0c;这两种机器都有代码执行能力&#xff0c;其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的&#xff0c;而虚拟…

GreatSQL社区月报 | 2023.04

GreatSQL 是一个开源的 MySQL 技术路线数据库社区&#xff0c;社区致力于通过开放的社区合作&#xff0c;构建国内自主 MySQL 版本及开源数据库技术&#xff0c;推动中国开源数据库及应用生态繁荣发展。 为了帮助社区的小伙伴们更好地了解 GreatSQL 社区的实时进展&#xff0c…