不相交集合

算法导论之不相交集合森林——并查集 最近写一些算法题总是碰到同一段代码: int find(x) { if(father[x]!=x) { father[x]=find(father[x]) } return father[x]; } 代码的形式就是上面的,因为之前没有看到算法导论上的不相交集合森林,所以并不熟悉这段代码,然后问了一下大牛,他指点说看算法导论第二版311页,正好是这段伪代码:FIND_SET(x) if x!=p 阅读详情

不相交集合用于对集合的一种操作,对不相交集合主要四个主要点和两个关键词:


四个主要点
1. 集合的表示方法
2. 创建集合
3. 获得某个元素所在集合的代表
4. 合并两个集合

两个关键词
1. 按秩合并

2. 路径压缩


集合的表示方法

链表表示法和有根数表示法。


链表表示法

链表表示方法,它是最简单的表示方法,也是最容易想到的方法。它的其他三个主要点的操作如下:


获得某个元素所在集合的代表

为了能够在O(1)时间内获得代表,集合的每个元素都可以增加一个卫星数据来指向代表;

合并两个集合
为了能够在O(1)时间内将一个集合链表添加到另一个集合链表的后面,我们可以增加一个指针指向集合链表的尾,这样可以O(1)时间内找到链表最后一个元素;
由于添加到后面的集合都要重新设置它所有元素的代表为第一个集合的代表,所以一种优化就是将长度短的集合链表添加到长度长的集合链表后面;

创建集合
创建只有一个节点的集合,设置这个节点为代表,设置这个节点为尾,设置链表长度为1;
在O(1)时间内完成;


有根数表示法

有根数是目前已知的最快的方法,它主要有两个特殊的操作:


按秩合并
和链表表示法的合并操作的优化方法差不多,只是这里的秩是树的高度的意思;
将高度较小的一个集合树合并到高度较高的集合树中;


路径压缩
它的思路是,假设集合A合并到集合B ,只是将集合A的代表指向B的代表,集合A中的其他元素的代表不作更改,这样就可以O(1)时间内完成合并。那什么时候,更改集合A的其他元素的代表呢?当执行“获得某个元素所在集合的代表”操作时。

参考代码部分的find_set函数,如果该元素e不是它记录的代表p[e],那么重新设置它记录的代表p[e],这个是可以在O(1)时间内完成的,因为p[e]可能是集合A合并前的代表也可能是合并后的代表。如果是合并前的代表,那么两个递归后,就可以将p[e]设置为集合B的代表;如果是合并后的代表,那么一个递归后就返回,并将p[e]设置为集合B的代表(当然这个递归是无用功)。


代码

该代码,假设集合是由顶点组成

class vertex  
{  
    public:  
        vertex(){  
            make_set();  
        }  
          
        vertex * find_set(){  
            if(mParent != this){  
                mParent = mParent->find_set();  
            }  
              
            return mParent;  
        }  
  
        void union_set(vertex * v){  
            link(v->find_set());  
        }  
          
    private:  
        vertex * mParent;  
        int mRank;  
  
        void make_set(){  
            mParent = this;  
            mRank = 0;  
        }  
          
        void link(vertex * v){  
            if(mRank < v->mRank){  
                mParent = v->find_set();  
            }else{  
                v->mParent = this;  
                if(mRank == v->mRank){  
                    mRank++;  
                }  
            }  
        }  
}; 


四相BUCK PCB布局实战:从单相复制到完整布线的关键步骤 开关电源设计是硬件工程师的核心技能之一,多相BUCK作为一种大电流DC-DC解决方案,通过多路功率级并联和相位交错,能有效降低输出纹波、分散热源并提升动态响应。它在CPU/GPU/FPGA核心供电、服务器、通信设备等场景中广泛使用。然而,从单相功率级扩展到四相完整布线,远不只复制原理图那么简单,相位分配、热环路控制、SW节点处理、反馈采样和地平面完整性都成为影响性能的关键。本文从电源设计的基础概念和原理出发,围绕多相BUCK的技术价值与应用场景,系统梳理了从单相复制到四相PCB布局的核心策略、操作步骤、DR 阅读详情

相关推荐

不相交集合的数据结构和操作

什么是不????集合 不相交集合维护了一个不相交动态集的集合,选用一个代表元素来标识每个集合,并不关心哪个元素作为代表(当然,还是有一定的选取规则)。 动态集合支持的操作: Make-Set(x) 建立一个新的集合,它的成员唯一且仅出现在此集合中(因为不相交)。 Union(x,y)将包含x和y的两个动态集合(不一定是单一成员集合)合并成一个新的集合,选取两个集合中的任意元素作为代表。 Find-Set(x) 返回一个指针,这个指针指向包含x的集合的代表。(这个集合是唯一的) 不相交集合的链表表示 每个

Travor Philip的blog 536

不相交集合 - 并查集

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。恩,前两周学习了并查集,是时候总结一下了。等价关系与等价类从数学上看,等价类是一个对象(或成员)的集合,在此集合中的所有对象应满足等价关系。若用符号"≡"表示集合上的等价关系,那么对于该集合中的任意对象x,y, z,下列性质成立:1、自反性:x ≡ x2、对称性:若 x

乐吾天 999

Java实现不相交集合算法

在上面的示例中,我们首先创建了一个大小为10的不相交集合,并进行了几次合并操作。最后,我们又合并了元素0和9所在的集合,并再次查找了一些元素所属的集合。通过维护一个森林结构和应用路径压缩、按秩合并等技术,我们可以高效地管理一组元素,并支持查找元素所属的集合以及合并集合的操作。不相交集合算法(Disjoint Sets)是一种用于管理元素的数据结构,它将一组元素划分为多个不相交的集合。我们可以通过调用union()方法来合并某些元素所在的集合,再通过调用find()方法来查找某个元素所属的集合。

CodeWWWCode的博客 242

不相交集类

一、基本概念不相交集类维持着多个彼此之间没有交集的子集的集合,可以用于 判断两个元素是否属于同一个集合,或者合并两个不相交的子集。比如, { {1,3,5},{2},{4},{6,7} }这整体就是一个不相交集合。里面的一些子集也是彼此互不相交的。注意,对于每一个子集,往往用某一个元素来代表,至于...

weixin_34101784的博客 444

将雷达连接到树莓派的串口

dev/ttyAMA0 是树莓派的主要 UART(用于 GPIO 引脚 8 (TXD) 和 10 (RXD))。通常,树莓派使用 GPIO 引脚 8 (TXD) 和 10 (RXD) 进行串口通信。树莓派上通常有两个串口:/dev/ttyS0 和 /dev/ttyAMA0。你需要确认雷达的 TX 和 RX 引脚,并与树莓派的对应引脚连接。VCC(电源)连接到树莓派的 3.3V 或 5V(根据雷达的要求)MR(Receive)连接到树莓派的 GPIO 8 (TXD)GND(地)连接到树莓派的 GND。

qq_45943628的博客 1465

GPU八卡A100使用INT4-W4A16量化大模型实验

本实验旨在探索在环境下,对大语言模型进行权重量化的可行性、效率与性能影响。通过采用工具集成 GPTQ 算法,实现对所有线性层的权重量化(W4A16 方案最终通过lm-eval工具在GSM8K任务上对压缩模型进行评估。

goodgood_UP的博客 1909

不相交集合的数据结构

链表中的每个节点都包含。

Zhang_Qin123的博客 1236

IAR使用教程:如何导入现有工程并成功编译

详细介绍如何在IAR中导入现有工程项目并完成编译配置,解决常见报错问题。通过清晰的操作指引,帮助开发者快速上手iar使用教程中的关键环节,提升开发效率。

weixin_42437253的博客 883

不相交集合数据结构

一些应用涉及将n个不同的元素分成一组不相交的集合。这些应用经常需要进行两种特别的操作:寻找包含给定元素的唯一集合和合并两个集合。本章将介绍如何维护一种数据结构来实现这些操作。本文介绍不相交集合所支持的操作,及其使用链表及有根树表示的两种形式。有时,集合我们不关心集合代表是谁,只要能够保证每次查询时,对于同一集合中的元素始终返回同一个代表即可,而有时代表的选取又需要特别考虑。不相交集合通常支持以下三种操作:建立集合是对单个元素进行操作,它是集合初始化操作,此时集合中只包含唯一元素。

wts327的博客 1054

普冉PY32F003定时器实战:从HSE时钟配置到500ms精准闪烁LED(附完整代码)

本文详细解析了普冉PY32F003单片机定时器的实战应用,从HSE时钟配置到实现500ms精准LED闪烁。通过完整的代码示例和深入的技术分析,帮助开发者掌握定时器参数计算、中断优先级管理及调试技巧,适用于各类嵌入式开发项目。

weixin_30608503的博客 451

ANSYS 有限元分析 支架拓扑优化设计 分析过程及常见问题解决

1.确定分析类型,所用模块包括两种 static structural Topology Optimization。3.通过草图建立几何模型,建好的几何模型如图1所示。2.工程材料采用默认的Q235。

m0_68737530的博客 1966

并查集(不相交集合)

  文章作者:ktyanny文章来源:ktyanny转载请注明,谢谢合作。  早上早早起来看Kruscal的MST算法,原来要用到不相交集合来实现。拿起《算法导论》看完不相交集合这章,顿然茅塞顿开,终于完成并查集的基础知识的学习。《算法导论》真是牛××  不相交集合有两种不同的实现,链表表示和带路径压缩的按秩合并策略。看到大家都比较喜欢用带路径压缩的按秩合并策略,那么我只认真研究了一下带路径压...

weixin_34228662的博客 325

基于YOLOv11的仓库机器人导航系统设计与实现:Amazon Robotics Challenge解决方案

本文将详细介绍一个基于YOLOv11目标检测算法的仓库机器人导航系统,该系统能够准确识别托盘(pallet)和箱子(box),为机器人提供精确的导航信息。而基于深度学习的视觉导航系统能够实时识别环境中的关键物体,如托盘和箱子,从而实现更智能的路径规划和货物搬运。YOLOv11作为YOLO系列的最新演进版本,在检测精度和速度上都有显著提升,非常适合仓储环境中的实时物体检测任务。YOLOv11在保持实时性的同时,提高了对小物体和密集物体的检测能力,这对仓储环境中的托盘和箱子检测尤为重要。

YOLO 303

【轻松掌握数据结构与算法】不相交集合

不相交集合 ADT 是一种非常有用的数据结构,通过路径压缩和按秩合并,可以高效地处理集合的合并和查找操作。这种数据结构在图算法、网络流问题和并查集问题中非常有用。

Whoisbug的博客 1194

Autosar CAN 网络管理标准文档

Autosar CAN 网络管理标准文档

蚂蚁小兵 925

动量因子在A股市场的有效性分析:量化实证研究

验证动量因子在A股市场的有效性及时间周期性分析不同时间窗口(短期/中期/长期)对动量效应的影响量化交易成本、市场流动性对动量策略收益的侵蚀程度比较A股与成熟市场(如美股)动量效应的差异特征理论框架:行为金融学解释动量效应的产生机制技术实现:Python全流程代码实现动量因子计算与回测实证分析:统计检验、风险收益指标、敏感性分析应用拓展:结合市场微观结构的策略优化方案动量因子(Momentum Factor)

2501_92132293的博客 2476

用于不相交集合的数据结构——查并集

不相交集合数据结构的概念和操作: 不相交集合数据结构(disjoing-set data structure)保持一组不相交的动态集合S={S1,S2,S3,……Sk}。每个集合通过一个代表来识别,代表即集合中的某个成员。 不相交集合数据结构支持如下操作: 1 . MAKE_SET(x): 建立一个新的集合,其唯一成员就是x,所以其代表也就是自己。因为各集合是不相交...

a136358的博客 404

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

不相交集合(并查集)

不相交集合(两集合中没有相交元素),因为只能 进行合并和查找所求元素所在的集合,因此被称为并查集,至于怎么标志哪一个集合,可以使用集合的头结点(使用链表表示并查集),若果返回的元素一样则表示为同一个集合。如果使用森林表示,则用根节点代表这一个集合。只连接两个根节点即可。   这一般应用 在无向图的连通分量和一些图的算法中。 下面说明两种实现方式:    1.  不相交森林(数组实现) 森林

jiaomingliang的专栏 3834

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【算法学习】不相交集合数据结构

参考算法导论第21章 用于不相交集合的数据结构 `

memcpy0的博客 933

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

第21章-用于不相交集合的数据结构 21.1 不相交集合的操作 21.2 不相交集合的链表表示

本文为第21章-用于不相交集合的数据结构 21.1 不相交集合的操作 21.2 不相交集合的链表表示的笔记,欢迎参考!

Toby的博客 375
上一篇: Android - JNI
下一篇: 最小生成树
G机器猫
博客等级 码龄16年 106粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值