数据结构与算法学习-并查集

数据结构与算法:学习并查集 并查集一般都不怎么用到,甚至听都没怎么听到过这么一个数据结构,写这篇文章是源自于我在刷力扣第130. 被围绕的区域这道题的时候涉及到并查集的使用,大家如果没做过可以去做一下,程序员闲的时候刷刷算法题是非常有意义的事情。原本这道题使用深度优先遍历(DFS)和广度优先遍历(BFS)就可以解决,但是执行时间才超过百分之五十多,这让我有点不服,我想看下使用并查集看下执行时间需要多久,所以想... 阅读详情

并查集(Union-Find Set):
用于解决若干的不相交集合的如下几种操作的统称:
1.MAKE-SET(x):初始化操作,建立一个只包含元素x的集合。
2.UNION(x,y):合并操作,将包含x和y的集合合并为一个新的集合。
3.FIND-SET(x):查询操作,计算x所在的集合。
通常使用树这种数据结构来表示集合,树中的每一个结点代表一个元素,每棵树代表一个集合。那么如何判断两棵树是不是同一个集合呢?
举个例子,比如包含点1,2,3,4,5,6的图有三棵树{1,2},{3},{4,5,6},每棵树的根结点就是代表这个集合的代表元,1!=3,3!=4,所以一共有3个集合。如果两棵树的根节点相同,则代表这两棵树是同一个集合。
以上只是并查集的基本操作,未进优化的并查集的查询操作的时间复杂度是O(n),这是因为如果对应到森林都是点连到一条链的一端,则就退化成了一个链表,有点类似于二叉平衡树的诞生原因。为了改善这种情况,一般有两种方法,一种是按秩合并优化,另外一种是路径压缩优化。
按秩合并优化:
秩的意思可以简单理解为一棵树的深度。按秩合并优化是指在合并操作的时候,我们可以通过比较即将合并的两棵树的深度大小,把深度较小的合并到深度较大的树上,这样就可以防止树退化成一条链了。
路径压缩优化:
在查询操作的时候,我们往往是通过一个结点递归查找到父结点,在递归的过程中我们可以改变树的形状来防止树退化成链。意思就是把树上的每个结点的父结点都设置成根结点。使树成为一棵深度为1的树。
这两种优化操作一同使用的话可以使并查集的查询操作达到常数级的时间复杂度,效率非常高,但是按秩合并优化需要开销额外的空间来存储每棵树的秩。
初始化、合并、查询和两种优化的操作代码如下:

#include <iostream>
using namespace std;
class   DisjointSet
{
    public:
        int *father;  //记录父节点 
        int *rank;  //记录秩
        DisjointSet(int size)
        {
            father = new int[size];
            rank = new int[size];
            for(int i = 0; i < size; i++)
            {
                father[i] = i; //初始化时每个父节点是自己本身
                rank[i] = 0; //初始化时每个结点的秩都为0 
            }
        } 
        ~DisjointSet()
        {
            delete []father;
            delete []rank;
        }
        int find_set(int node)  //查找根结点
        {
            if(father[node] != node)
            {
                father[node] = find_set(father[node]);  //压缩路径优化 
            }
            return father[node];
        }
        bool merge(int node1, int node2) //合并操作
        {
            int ancestor1 = find_set(node1);
            int ancestor2 = find_set(node2);
            if(ancestor1 != ancestor2)
            {
                //比较两棵树之间秩的大小
                if(rank[ancestor1]>rank[ancestor2])
                {
                    father[ancestor2] = ancestor1;  
                }
                else
                {
                    father[ancestor1] = ancestor2;
                    rank[ancestor2] = max(rank[ancestor2], rank[ancestor1]+1); //更新秩
                }
                return true;
            }
            return false;
        } 
};
int main()
{
    int n, m;   //n表示元素个数,m表示有关系的元素个数
    int count = 0;
    cin>>n>>m;
    DisjointSet dus(n);
    for(int i = 0; i < m; i++)
    {
        int a, b;
        cin>>a>>b;
        dus.merge(a, b);
    }
    for(int i =0; i < n; i++)
    {
        if(dus.father[i] == i)  //输出集合的个数
        {
            count++;
        }
    }
    cout<<count<<endl;
    return 0;
}
MTK眼中6G物理层与无线协议的进化之路 提议统一波束和小区级的测量、报告和切换框架/流程,进一步减少移动性切换过程中的中断,采用可扩展框架/流程,允许在不同移动性场景中进行部分用户设备配置更新以实现快速切换,支持用户设备发起的移动性(同步/切换)以降低延迟和因信令交换导致的失败,设计移动性RS以实现空闲状态下的节能和连接状态下的无缝用户体验,实现5G/6G间的无缝互操作移动性,为固定无线接入(FWA)提供潜在增强,构建统一的跨层移动性框架以降低复杂度、减少中断和失败。为适应多样化的流量类型,需要灵活的帧结构和高层时间对齐。 阅读详情

相关推荐

游戏开发实战:用UE4 Marschner模型打造次世代头发渲染(附Shader代码解析)

本文详细解析了如何在UE4中使用Marschner模型实现次世代头发渲染,包括Shader代码逐行解读与参数调优。通过对比传统Kajiya-Kay模型,展示了Marschner模型在物理精确性和视觉效果上的优势,并提供了性能优化与实战技巧,帮助技术美术师提升游戏角色渲染品质。

weixin_28223453的博客 240

并查集-解决区间和纠错问题 hdu-3038

题目:多次给出信息,告诉你[a,b]区间的和,求多少个错误信息(错误信息不考虑)。 乍一看有点像线段树,但想想就发现这个并不能用线段树方便地解决。后来经提醒是并查集的一种经典题型。 把区间抽象为并查集的子节点和母根结点,子节点存放了到根节点的区间和。这样当引入一个新的区间,如果区间左右界根节点不同就一定不存在矛盾(有点种类并查集的意思,形象来看就是存在冗余区间用于调整),然后可以通过...

dong52130的博客 228

光谱数据计算CIE值(三刺激值、CIE1931、CIE1976、CCT)软件

软件界面如下,免安装,拷贝即可使用 导入光谱数据即可计算三刺激值、CIE1931、CIE1976、CCT CIE1931、CIE1976色坐标图形只管显示 导入的光谱数据格式如下,txt文本 波长380到780,间隔1nm 注意:缺省的数据默认写0即可 下面为一些CIE相关介绍: CIE(国际发光照明委员会):原文为Commission Internationale de L’Eclairage(法)或International Commission on Illumination(英)。这个委员会创

业余程序员小徐的博客 2万+

并查集(Disjoint Set)

并查集,一种比较基础的算法,主要是用于解决一些连通性的问题,通常这些问题

破东风 1062

量化策略分享之ST股弱转强,回测年化123%

本策略的核心是精选ST股票,国九条过滤,防止直接暴雷退市,只做ST股票的弱转强,弱转强的认定标准是前日涨停但昨日不涨停,昨日收盘价大于前一日最低价,昨日收盘价大于10日线,昨日成交量大于前一日的成交量但小于前一日成交量的10倍,股价大于1;这类股票强势,有资金介入,能获得超额收益。

qq_29301281的博客 1268

RoboMaster新手必看:用STM32 HAL库搞定大疆M3508电机正反转(附完整代码)

本文详细介绍了如何使用STM32 HAL库驱动大疆M3508电机实现正反转控制,包括硬件准备、PWM配置、电机校准及完整代码实现。特别针对RoboMaster新手常见问题提供了解决方案,如电机抖动、不转等故障排查,并分享了缓启动、DMA更新等进阶技巧,帮助开发者快速掌握电机控制核心技术。

weixin_42519985的博客 228

并查集 (Union-Find Sets)及其应用

并查集 (Union-Find Sets)并查集:(union-find sets)是一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多。一般采取树形结构来存储并查集,并利用一个rank数组来存储集合的深度下界,在查找操作时进行路径压缩使后续的查找操作加速。这样优化实现的并查集,空间复杂度为O(N),建立一个集合的时间复杂度为O(1),N

fisher_jiang的专栏 1万+

手把手教你用Silvaco Atlas复现GaN蓝光LED仿真:从网格划分到光谱分析全流程避坑

本文详细介绍了如何使用Silvaco Atlas进行GaN蓝光LED仿真,从网格划分到光谱分析的全流程避坑指南。重点讲解了网格划分技巧、材料参数设置、极化效应处理以及结果分析方法,帮助用户快速掌握半导体器件仿真技术,提升研发效率。

weixin_42552716的博客 224

数据结构与算法学习笔记----并查集

@ author: 明月清了个风ps:从这里开始加入原题链接了。

weixin_60278491的博客 1301

基于云平台的ATS系统微服务架构方案研究

在当前智慧地铁的升级转型过程中,城市轨道交通ATS系统面临着稳定性差、运维方 式繁琐和故障应急处理效率低等问题。为此,提出一种基于云平台的ATS系统微服务架构方案; 研究了ATS系统在云平台上的微服务总体架构、ATS应用的微服务划分和设计、容器部署方式 及通信交互模式,可实现系统松耦合和易扩展,达到节约计算资源、提高系统稳定性和运营效 率的目的

mi_lan1的博客 966

《UDS协议从入门到精通》系列——图解0x23:通过地址读取内存

如何读取ECU中指定内存地址的数据?图解UDS 0x23服务带你快速上手!!

车载系统攻城狮 2623

学习笔记分享-进阶数据结构与算法-图-并查集-优化

学习笔记分享-进阶数据结构与算法-图-并查集-优化

2301_81243975的博客 2289

Nova — GPU/vGPU 虚拟机

目录 文章目录目录云主机使用显卡的实现方式虚拟显卡物理显卡直通物理显卡虚拟化 云主机使用显卡的实现方式 采用虚拟显卡 采用物理显卡直通 采用物理显卡虚拟化 虚拟显卡 虚拟显卡技术,主要用于虚拟机 Remote Console 领域,如:VNC(Virtual Network Computing,虚拟网络计算机),它能将完整的窗口界面通过网络,传输到另一台计算机的屏幕上。 VNC 主要由 VNC server 和 VNC viewer 两部分组成。用户需先将 VNC server 安装在被远程操控的计算

烟云的计算 2428

Calmsym学习数据结构与算法之--并查集

数据结构与算法是每一个CS人的必经之路路漫漫其修远兮,今天总结的是关于数据结构的并查集思路1. 维护一个数组f,用f[x]保存元素x所在集合的代表。这种方法可以达到O(1)的查询速度,但是在合并时需要大量修改元素的 f 值,效率低下思路2. 使用树形结构储存每个集合。在一棵树中,树的节点就可以充当集合中的元素,树的根即为集合元素的代表。所以并查集实际是一片森林。我们可以通过维护数组fa来记录这片森林(多个集合),fa[x]保存x的父节点,特别的树根的父节点为他本身(代表)2.代码实现。

Calmsym的博客 143

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

学习 数据结构与算法 进阶知识:并查集(一)

并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集的思想是用一个数组表示了整片森林(parent),树的根节点唯一标识了一个集合,我们只要找到了某个元素的的树根,就能确定它在哪个集合里。

君逍遥o 805

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

#数据结构与算法学习笔记#PTA15:并查集+按秩归并+路径压缩(C/C++)

2018.5.4   昨天写完最小堆之后,一兴起看了一晚上的区块链,总算对炒得火热的区块链有了一些大致的了解。今天有点晚,明天会发一篇关于区块链的文章,欢迎各位与我交流探讨。 这一题说的是,一个网络中有N台主机,当输入I的时候,对某两台主机进行网络连接;当输入C的时候,对两个主机是否连接进行检查;当输入S的时候,对整个网络的连接状态进行检查,并结束任务。本题主要考察并查集的知识,题目本身不难...

NJU_ChopinXBP的博客 453

SAP B1中文培訓教材_SDK

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

vb6实现union数据结构_数据结构与算法学习笔记:并查集

并查集的引入:现在由n个村庄,n个(n很大)村庄中有些村庄两者之间是有路相通的,有些村庄是没有的,现在需要快速判断某两个村庄之间是否能相通,或者快速连通两个村庄。这是一种多集合的需求,互通的村庄属于一个集合,不互通的村庄又属于另外一种集合。因为村庄数量n很大,如果用集合set这一种数据结构来实现这一功能,就会针对互不相连的村庄都需要生成一种set,这样占用的内存空间就会很大。这时就引入了并查集这一...

weixin_39681161的博客 253

学习笔记分享-进阶数据结构与算法-图-并查集-代码实现

学习笔记分享-进阶数据结构与算法-图-并查集-代码实现

2301_81243975的博客 789

数据结构与算法学习(第六天)(并查集)

并查集两种实现,Quick Union实现的优化,非广告!

幸数得五滴博客 139

学习 数据结构与算法 进阶知识:并查集(二)

按照上一小节的思路,我们把如下图所示的并查集,进行 union(4,9) 操作。合并操作后的结构为:可以发现,这个结构的树的层相对较高,若此时元素数量增多,这样产生的消耗就会相对较大。解决这个问题其实很简单,在进行具体指向操作的时候先进行判断,把元素少的集合根节点指向元素多的根节点,能更高概率的生成一个层数比较低的树。构造并查集的时候需要多一个参数,数组,表示以为根的集合中元素个数。在进行合并操作时候,根据两个元素所在树的元素个数不同判断合并方向。优化后,合并结果如下,9 指向父节点 8。

君逍遥o 770

算法与数据结构基础学习九(贪心算法+并查集)

题二:点灯 题三:割金条 题三:安排会议 题四:最大钱数 并查集 from 左程云算法基础课

Master_guoguo的博客 304

数据结构与算法学习---数据结构篇(并查集)(默然回首,夯实基础)

一、并查集 并查集是一种树型的数据结构 ,并查集可以高效地进行如下操作: 查询元素p和元素q是否属于同一组 合并元素p和元素q所在的组 1.1 并查集结构 并查集也是一种树型结构,但这棵树跟我们之前讲的二叉树、红黑树、B树等都不一样,这种树的要求比较简单: 每个元素都唯一的对应一个结点; 每一组数据中的多个元素都在同一颗树中; 一个组中的数据对应的树和另外一个组中的数据对应的树之间没有任何联系; 元素在树中并没有子父级关系的硬性要求; 1.2 并查集API设计 1.3 并查集的实现 1.3.1 U

weixin_43185348的博客 830

Java数据结构与Java算法学习Day09---并查集(简略笔记记录)

合并集的学习

xiaoxixicc的博客 830

2.7数据结构与算法学习日记(动态规划01背包和并查集)

dp[i][j]代表的是以j为容量所放入的前i个物品的最大价值,然后开始分析俩种情况,如果是不取这个物品的话(你不要这个物品的话(或当前容量小于物品所需容量),那此时你的dp[i][j]里存放的价值是不是你不加他之前的最大价值,那么你此时的最大价值没变所以你的dp[i][j]会等于dp[i-1][j])因为你不取它,那么容量不用动,只需取你前i-1个物品的最大价值就行,所以。对于 100%100% 的数据,1≤N≤104,1≤M≤2×105,1≤Xi​,Yi​≤N,Zi​∈{1,2}。

weixin_64589886的博客 1033

cs61b数据结构与算法学习笔记 9. DisjointSets(并查集)

直观地说,我们可以首先考虑将 "互不相交集 "表示为一个集列表,例如 List。例如,如果我们有 N=6 个元素,并且没有任何元素被连接,那么我们的集合列表看起来就像这样:[{0}, {1}, {2}, {3}, {4}, {5}, {6}].看起来不错。但是,考虑一下如何完成 connect(5, 6) 这样的操作。我们必须遍历多达 N 个集合才能找到 5,再遍历 N 个集合才能找到 6。我们的运行时间就变成了 O(N)。而且,如果要尝试实现这一点,代码会相当复杂。

m0_72741580的博客 547

数据结构与算法学习笔记 (二) 栈 链表 队列 树 堆 图 并查集

学习数据结构与算法的目的: 1.掌握底层 coding 2.从顶层宏观的去观察一种数据结构的各种操作 推荐 一个动态可视化网站 Visualgo 栈 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。栈允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUS...

weixin_30593261的博客 263
上一篇: git的小问题CRLF和LF自动转换的warning
下一篇: 程序员技术练级攻略
UKey_
博客等级 码龄10年 258粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值