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

数据结构与算法:学习并查集 并查集一般都不怎么用到,甚至听都没怎么听到过这么一个数据结构,写这篇文章是源自于我在刷力扣第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;
}
保姆级教程:用Unity为麒麟系统打包Linux应用(含路径权限全攻略) 本文提供了一份详细的Unity跨平台开发指南,重点介绍如何在麒麟系统上打包和部署Linux应用。从开发环境配置、路径权限处理到性能优化和常见问题解决,全面解析了Unity项目在国产操作系统上的适配流程,帮助开发者高效完成跨平台应用开发。 阅读详情

相关推荐

科研指南:IEEE期刊LaTeX/Word模板下载与使用全解析

本文详细解析了IEEE期刊LaTeX/Word模板的下载与使用技巧,帮助科研人员高效完成论文排版。从官方模板获取入口到LaTeX文档结构配置,再到Word样式管理与常见问题解决方案,全面覆盖投稿准备的关键步骤。特别针对数学公式、参考文献和图片处理等难点提供实用建议,助力学术写作规范化。

weixin_28396629的博客 567

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

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

dong52130的博客 228

RK3568 解决MIPI屏幕开机只显示uboot logo的问题

之前写过一篇文章介绍了RK3568驱动MIPI屏幕的方法,这次产品迭代,硬件改版,选型的新的屏幕了。所以再次开启调试屏幕的过程。本以为会和上次一样会轻车熟路,事情总是事与愿违,同样的路,遇到新的坑。

fhqlongteng的博客 5426

并查集(Disjoint Set)

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

破东风 1062

OpenClaw实战-行政与HR必备:AI驱动的办公自动化

智能会议纪要自动生成会议时间智能协调自动提醒和跟进简历智能筛选和匹配度分析面试安排自动化入职办理流程化通知公告一键发布发票识别和报销辅助资产管理数字化让AI处理繁杂的事务性工作,让您有更多时间专注于更有价值的战略和管理任务。

gaoxiang_120的专栏 220

yolov8 转华为昇腾om脚本

yolov8 转华为昇腾om脚本

jacke121的专栏 1601

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

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

fisher_jiang的专栏 1万+

18-XLINX的XC7A100T的BANK0引脚说明

DXP_0和 DXN_0是纯输入引脚,Xilinx Artix-7 FPGA 内部集成的一个片上监控模数转换器​ 的差分模拟输入对,模数转换器​的模拟信号输入端,将外部的模拟电压​ 采样并转换为内部的数字值,是一个单向的信号采集过程。它是与 VCCADC配对的关键引脚,共同为内部的精密模数转换器提供一个纯净、安静、独立的参考地平面。多FPGA同步配置: 在多FPGA系统中,主FPGA配置完成后,可以拉低从FPGA的 INIT_B使其等待,等所有FPGA都准备好后,再同时释放,实现同步启动。

weixin_44479192的博客 233

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

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

weixin_60278491的博客 1301

基于自适应小波阈值算法的图像去噪

自适应小波阈值算法是一种基于小波变换的方法,它相对于传统的小波阈值去噪方法具有更好的性能和鲁棒性。该算法首先对图像进行小波变换,然后根据小波系数的大小确定一个自适应的阈值,将小波系数与阈值进行比较,大于阈值的系数被保留,小于阈值的系数被置零。在上述代码中,首先选取了小波函数sym4进行小波分解,然后根据标准差计算出阈值,使用wthresh函数进行阈值处理,最后进行反变换得到处理后的图像。该GUI界面与前面的自适应小波阈值算法代码结合,实现了图像的去噪,并提供了可视化的效果。

与其临渊羡鱼,不如退而结网 559

工业产线瑕疵检测:基于 YOLO 的自动化质检系统实战

从工业瑕疵数据集构建到模型训练,从桌面检测界面到产线适用性优化,本文覆盖了一套工业质检系统的完整路线。这个场景的核心评价指标不是最高精度,而是在保证 recall ≥ 0.95 的前提下尽可能压低 false positive——因为漏检的直接成本(客户投诉、质量事故)远高于误报的成本(人工复检)。部署时先设一个偏低的置信度阈值确保覆盖,再通过持续收集人工复检数据来逐步调优。

m0_71589036的博客 67

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

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

2301_81243975的博客 2289

11-16 Fluent结果查看及后处理功能(做动画、监控点)

监控点、面及动画操作

zheaa的博客 1万+

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

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

Calmsym的博客 143

WINCC7.3破解文件

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

君逍遥o 805

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

NJU_ChopinXBP的博客 453

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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、付费专栏及课程。

余额充值