数据结构与算法复习(01)-并查集

数据结构与算法分析复习笔记(持续更新...欢迎指正) 数据结构与算法分析 文章目录数据结构与算法分析前言一、数据结构概述数据结构相关基本概念1. 数据2. 数据元素3. 数据项4. 数据对象5. 数据结构6. 程序结构7. 数据类型8. 算法基本结构简介1.从集合到结构体2.映射、函数、算法3.线性结构、树形结构、图形结构算法性能评价1.算法的时间复杂度二、线性结构( 线性表)三、树形结构四、图形结构 前言 复习408考研数据结构和学习蓝桥杯的笔记,也有相关的离散数学基础内容记录,本笔记以应试为主 持续更新ing 一、数据结构概述 数据结构相关基本概念 阅读详情

本文首发于我的Github博客

本文是数据结构预算法复习系列的第一篇博文,会介绍写作该系列博文的原因

本文复习了并查集的概念,基础的API,良好的实现(路径压缩与权重),简单的应用和变式

相关代码

写作本篇博文的原因

  1. 生活所迫
    1. 懂的都懂,IT行业从业者(或者是考研保研),跑不了的
  2. 数据结构与算法是大学生活里花费的时间很多的部分,复习一下,也算是对自己的大学生涯有个交代
  3. 三次元的生活真的无聊,找点代码写,嘿嘿(难道不能写工程项目吗?质问!)

并查集的概念与基础API

并查集的概念

假设拥有N个元素1…N,我们需要对其做两种基础的操作:

  1. 宣告某两个元素a, b处在同一个等价类里
  2. 判断某两个元素a, b是否在一个等价类里

用于处理这种问题,提供这两种操作接口的数据结构,可以被称为并查集

并查集基础的API

interface UnionFind {
    void union(int a, int b);
    boolean isConnected(int a, int b);
}

良好的实现

良好的实现往往将一个等价类以树的形式进行组织,使用一个数组int[] parent,parent[i]记录了元素i的父亲节点

如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tY25IREj-1592185859107)(union-find-tree.png)]

  • isConnected(a, b)接口即判断a和b是否在同一棵树内(是否有同样的根)
  • union(a, b)接口即需要将a所属的树归并到b所属的树下,或者将b所属的树归并到a所属的树下
  • 提高执行速度,就是想办法降低树的高度
路径压缩

路径压缩基本上能够完全解决并查集的接口执行速度问题

其基本思想是:

在沿着某条路径查询到a元素的根之后,将这条路径上所有的元素父亲,都直接设为根节点
这样,在以后查询的时候,查找到这条路径上的元素,只需要一次向上查询,就可以找到根节点了

路径压缩实现
public class PathCompressUnionFindImpl implements UnionFind {
    int[] parent;

    public PathCompressUnionFindImpl(int n) {
        parent = new int[n];
        for (int i = 0; i < parent.length; ++i) {
            parent[i] = i;
        }
    }

    private int find(int a) {
        if (parent[a] == a) {
            return a;
        }
        return parent[a] = find(parent[a]);
    }

    @Override
    public void union(int a, int b) {
        int rootA = find(a), rootB = find(b);
        parent[rootA] = rootB;
    }

    @Override
    public boolean isConnected(int a, int b) {
        return find(a) == find(b);
    }
}
加权并查集

虽然路径压缩基本能够解决并查集的执行速度问题,但是还有一个解决方案值得我们思考

加权并查集,其实是基于这样的观察:

在代表一个等价类的树的高度快速增长时,往往是由于将高的树合并成为了矮的树的子树
如果每次合并,都将矮的树合并成为高的树的子树,那么树的高度增长就会减缓

从数学的角度来看,减缓的原因是

每次当树的高度增加1,就意味着树的节点总数至少翻倍了
那么一共有N个节点,树的高度最多也就是lg N

加权并查集实现
public class WeightedUnionFindImpl implements UnionFind {
    int[] parent, size;

    private int find(int a) {
        while (parent[a] != a) {
            a = parent[a];
        }
        return a;
    }

    public WeightedUnionFindImpl(int n) {
        parent = new int[n];
        size = new int[n];
        for (int i = 0; i < n; ++i) {
            parent[i] = i;
            size[i] = 1;
        }
    }

    @Override
    public void union(int a, int b) {
        int rootA = find(a), rootB = find(b);
        if (size[rootA] > size[rootB]) {
            parent[rootB] = rootA;
            size[rootA] += size[rootB];
        } else {
            parent[rootA] = rootB;
            size[rootB] += size[rootA];
        }
    }

    @Override
    public boolean isConnected(int a, int b) {
        return find(a) == find(b);
    }
}

并查集的简单应用

贴两道OJ题目,都是简单练手的

洛谷P3367 模板题
洛谷UVA10583 简单变式

并查集的简单变式

等价类的个数

也就是树的根节点的个数,一个节点a是根节点当且仅当parent[a] == a

int nClass() {
    int nClass = 0;
    for (int i = 0; i < parent.length; ++i) {
        if (parent[i] == i) {
            nClass++;
        }
    }
    return nClass;
}
可以维护的等价类性质

比如:

  • 给定元素a,求a所在等价类的元素个数
  • 给定元素a,求a所在等价类的最大值
  • 给定元素a,求a所在等价类的最小值

这类性质只需要新开一个数组,并在union时进行维护就可以了:

void union(int a, int b) {
    //....
    parent[rootA] = rootB;
    size[rootB] += size[rootA];
    maximum[rootB] = Math.max(maximum[rootA], maximum[rootB]);
    minimum[rootB] = Math.max(minimum[rootA], minimum[rootB]);
}
【数据结构】【王道408】——PPT精要与思维导图实战解析 本文分享了一套高效学习数据结构的方法,特别针对王道408课程。该方法的核心在于将PPT精要截图与亲手绘制思维导图相结合,通过“捕获-构建-应用”三步,将抽象知识转化为可视化、结构化的知识图谱。文章以并查集、红黑树等难点为例,详细拆解了如何利用此方法攻克数据结构学习难关,实现从被动接受到主动构建的转变,从而扎实掌握知识并提升解题能力。 阅读详情

相关推荐

基于角谱传播的MATLAB仿真:从相位恢复看自由空间光传播

本文详细介绍了基于角谱传播理论的MATLAB仿真方法,用于模拟自由空间光传播过程。通过傅里叶光学原理,将光场分解为频谱并应用传播相位滤波器,实现了从纯相位物体到可观测衍射图样的仿真。文章结合具体代码,演示了如何利用角谱法进行相位恢复,为计算成像和生物医学检测等领域的研究提供了实用的仿真工具和思路。

weixin_29055699的博客 281

算法题之图论篇01 并查集算法及其应用

由于在刷OJ题的时候,刷到了信息传递这一道题,看解法是用图论、并查集解决的,我记得大一学完C语言的时候,老师额外布置了一道可莉+蜥蜴的题,当时自学了并查集然后77ms解决哈哈,远超剩下做出的几个人,快乐,但现在太久没练习,已经忘得一干二净,今天来复习复习。首先是并查集的概念和作用。并查集常用来解决连通性问题,当我们需要判断两个元素是否在同一个集合里的时候,我们就要想到用并查集。其主要有两个功能:1、将两个元素添加到一个集合中。2、判断两个元素在不在同一个集合。

m0_73682715的博客 617

vue微前端qiankun框架学习到项目实战,基座登录动态菜单及权限控制

技术无关,独立开发,独立部署,增量升级,独立运行,微前端的核心目标是将巨石应用拆解成若干可以自治的松耦合微应用。

前端开发工程师 9747

并查集 01 并查集基础

并查集 并查集指的是在一个集合中的两种操作:并和查; 并:将集合S中的两个子集S1和S2合并;S1和S2是没有交集的; 查:查看集合S中的元素a是否存在于S的某个子集中; 并查集的初始状态:每个元素构成一个集合,所有集合之间是不相交的; 并查集涉及2个操作 void unionElements(int p, int q) - 并 将元素p和元素q所在的集合合并成一个集合; p和q指...

乌鲁木齐001号程序员 185

STM32F407VET6与CH395Q串口通信实战:从零搭建以太网客户端(附完整代码)

本文详细介绍了基于STM32F407VET6微控制器与南京沁恒微CH395Q以太网芯片,通过串口通信从零搭建TCP客户端应用的完整实战过程。内容涵盖硬件连接、驱动层设计、基于FreeRTOS的任务实现以及核心调试技巧,并提供了完整的代码示例,帮助嵌入式开发者快速实现设备联网功能。

weixin_29179311的博客 413

Transformer在CV里太耗算力?手把手拆解Restormer的MDTA与GDFN模块

本文深度解析了CVPR2022最佳论文提名作品Restormer的创新模块MDTA与GDFN,有效解决了Transformer在计算机视觉领域的高计算复杂度问题。通过通道注意力降维和门控前馈网络设计,Restormer在图像恢复重建任务中显著降低计算量,同时保持高性能,为实时图像处理提供了可行方案。

weixin_30258901的博客 445

基础并查集01(poj2236)

并查集,又一个acm的重点,对于分群具有特别好的效果 A.Wireless Network 思路:这一题的关键就是读题,确实题意有点晦涩,需要研究一番。 乍一看题目有点像最短路问题,仔细研究发现,给定了坐标,给定了最长距离并且传输过程可以由中间点中转,那么这一题就相当于将距离小于给定长度的点分于一个集体,内部相互可达,于是,并查集的思路瞬间开朗。 /* Autho...

Owen_Q的博客 421

✨从零搭建 Ubuntu22.04 + Python3.11 + PyTorch2.5.1 GPU Docker 镜像并上传 Docker Hub

构建一个带 GPU 支持的深度学习开发镜像;使用 PyTorch 2.5.1(CUDA 12.4)环境;发布并托管 Docker 镜像至 Docker Hub;验证 GPU 环境正常运行!🎉 这将极大提升你的项目部署效率,尤其是在多人协作或跨平台部署场景中。

用大模型重构生活:猫奴程序员的AI智能日常记录 1578

01、并查集

题目: 1、有若干个样本a、b、c、d…类型假设是V 2、在并查集中一开始认为每个样本都在单独的集合里 3、用户可以在任何时候调用如下两个方法: boolean isSameSet(V x, V y) : 查询样本x和样本y是否属于一个集合 void union(V x, V y) : 把x和y各自所在集合的所有样本合并成一个集合 4) isSameSet和union方法的代价越低越好 ...

u014299052的博客 167

深入解析机器人软件开发中的核心:状态机管理(FSM)—— 理论、实践与优化

状态机(FSM)是机器人软件开发中管理复杂行为逻辑的核心工具,广泛应用于导航、任务执行、故障处理等场景。本文系统探讨状态机的基础理论(定义、要素)、主流设计模式(经典FSM、分层状态机HSM、行为树BT),以及工业级实现方法(代码架构、线程安全、调试技巧)。通过移动机器人导航和机械臂任务执行的案例,分析分层状态机的实际应用,并总结常见陷阱(如状态爆炸、阻塞操作)与优化策略(异步化、事件过滤)。

郑伟强dev的专栏 292

S32K324 Stack异常分析及解决方案

在项目开发过程中,在一次软件变更时,调整了task优先级之后导致应用层软件中的float数据经常性的变为NAN,导致应用层功能失效。本文记录下这个bug的分析及解决过程。该问题排查了好几天,最开始正向排查不出来,差点放弃了,ETAS OS也没有人支持,只能换一种思路,通过反向推,最终定位到问题,能完美解决,还是很欣慰的。遇到问题不可怕,Bug一直都会有,主要是在解决问题中的思路和方法,不断总结积累,总会越来越好的!

赞的博客 597

蓝桥杯最后一天复习?各大算法四步法教你轻松秒杀各种题型

十道题带你巩固基础打爆蓝桥

欢迎关注,一起进步! 1万+

如何设置Xilinx以太网IP核的Pause帧处理

这里要注意,为什么是或,第一个条件是该功能使能取反,也就是说,如果你设置使能不打开的话,这个条件是直接满足的;先来看图中第二句,判断该以太网数据包为Global Pause帧(gpp),首先要满足Step1,然后是由上图中第二句代码(assign global_pause_packet)后面的所有项“与”(&&)起来的,就是说要满足后面所有的项,分别是DA符合,SA符合,Etype符合,Opcode符合,并且使能了该功能(即设置ctl_rx_enable_gpp=1)。如果没通过,则进入Step3。

qq_43416206的博客 618

常用数据结构与算法java版01(二分、排序、并查集)

二分,快速排序,堆排序,并查集

m0_52744273的博客 157

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

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

2021蓝桥杯Java复习【史上最详细攻略】【持续更新】

Java排序 交叉排序 import java.math.BigInteger; import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); Integer a[]; Integer n = cin

weixin_43960370的博客 2万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

算法复习 - AcWing - 数据结构

237. 程序自动分析 一开始用种类并查集调了半天,,,但是这并不是要分为两类啊喂! A!=B, B!=C 不能推出A=C 因为是离线,正确的思路: (0)数据太大,离散化 (1)先把已知的相等情况处理完 (2)对于不相等的情况,如果他们已经在同一个并查集里,则出错 int f[MX]; vector<pair<int,pair<int,int>>>v; int find(int x) { return x==f[x]?x:f[x]=find(f[x]); }

欢迎光临 我的心 827

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

备战蓝桥杯算法整合

这里写目录标题六倍法判断素数欧拉筛01背包完全背包多重度背包Floyd-Warshall(多源最短路)Dijkstra(单源最短路)最大公约数最小公倍数分解质因数全排列(递归)并查集 六倍法判断素数 bool is_sprime(int x){ if(x==1)return false;//1不是素数 if(x==2||x==3||x==5){//2,3,5是素数 return true; } if(x%2==0||x%3==0){//2和3的倍数一定不是素数 return false

Anterior_condyle的博客 3272

算法比赛复习

算法部分 dfs+回溯 1.岛屿的个数 2.岛屿的最大面积 3.全排列 4.八皇后 (n皇后) 5.解迷宫 6.踩方格 7.2n皇后(n皇后变种) 8.括号生成 9.单源到单源最短路径 (这个和迷宫一个道理,返回最短的路径就可以了,还有一个剪枝的技巧,一旦tem_len>min_len 直接return 大白话就是,如果在路径长度累加的过程中,一旦出现当前累加长度大于原来存储的最短长度,那么不需要继续走下去了,直接返回 ) 10.盾神与砝码称重 BFS 1.迷宫求解 2.最短路径(格子的长度为1.

BOWWOB的博客 2014

POJ 1182食物链————并查集复习

食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 105782 Accepted: 32027 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种...

鸿杰 的博客 259

数据结构期末复习

线性表 树 哈夫曼编码 搜索二叉树 平衡二叉树 图 Dijkstra算法 关键路径 最小生成树 Prim算法 Kruskal算法 排序 基本算法思想及经典例题 贪心 区间选点 活动安排 DP 01背包 分治 散列表

weixin_51671868的博客 1610

数据结构期末复习小结

文章目录最小生成树Kruskal(克鲁斯卡尔)算法prime(普利姆)算法最短路Floyd(弗洛伊德)算法Dijkstra(迪杰斯特拉)算法哈夫曼编码确定权值建树编码等长编码拓展与思考邻接表和邻接矩阵平衡二叉排序树问题平衡树思想哈希线性探测法例题链地址法例题排序树小结顺序表操作集带头结点的链式表操作集树的四种遍历 最小生成树 Kruskal(克鲁斯卡尔)算法 最小生成树,算法思想:首先按照边的权值进行从小到大开始排序,每次从剩余的边中选择权值较小的且边的两个顶点不在同一个集合内的边,加入到生成树,直到n-1

ZZULI_星.夜 3327

蓝桥杯国赛算法复习

复习内容 1.spfa 2.背包问题 3.动态规划其他常考问题 4.dfs 5.bfs 6.并查集 一、基础题回顾 1.spfa 问题描述 蒜头君准备去参加骑车比赛,比赛在 n 个城市间进行,编号从 1 到 n。选手们都从城市 1 出发,终点在城市 n。 已知城市间有 m 条道路,每条道路连接两个城市,注意道路是双向的。现在蒜头君知道了他经过每条道路需要花费的时间,他想请你帮他计算一下,他这次比赛最少需要花多少时间完成。 输入格式 第一行输入两个整数\n,m(\1≤n≤1,000,1≤m≤5,000),分别

lihao1875699404的博客 796

Rumor(并查集)以及并查集的有关操作

题目链接C. Rumor 先是并查集的有关操作【模版】并查集 及路径压缩,正好可以复习一波 题意:有一个人,他所在的社区有n(1 &amp;amp;lt;= n &amp;amp;lt;= 1e5)个人,现在他想散播一个谣言,让整个社区的人都知道,给每个人散播谣言都要花费一定的钱,但是给一个人散播谣言之后,这个人可以免费地把谣言传给这个人的朋友。 输入:n,m(1 &amp;amp;lt;= n &amp;amp;lt;= 1e5)下面一行输入n个数代表散播个...

C'est la vie! 368

极客大学算法课-01

数据结构和算法是一个程序员的基本功,但在这方面一直是弱项,发毒誓学了几百遍但一直不得要领,所以报名了极客时间的算法大课,跟着谭超再从头到尾刷一遍,希望这次能有质的提升。 极客时间的这个课程,老师规定了每周的学习任务和作业任务,然后老师和助教会进行review,每周都要按时提交,对于加班狗来说却是有些困难,但还是克服下困难把这几周的课程跟下来。 在正式开始算法课之前,谭超老师讲了一些高效学习这门课程的主要事项,比如学习这门课程要以练习为主,看视频和做练习的时间三七开,第二是看视频的时候,在理解的情况下,尽量加

不瘦十斤不换名字 2025

蓝桥杯考前复习一

一段子数组在包含一段连续的自然数时,会有什么性质?有一个整数 A=2021,每一次,可以将这个数加 1 、减 1 或除以 2,其中除以 2 必须在数是偶数的时候才允许。已知a,b为质数,则不能由a,b凑出来的最大的数是(a-1)(b-1)-1;再如,2022 经过一次操作可以变成 2021、2023 或 1011。例如,2021 经过一次操作可以变成 2020、2022。请问,2021 最少经过多少次操作可以变成 1。今天就复习到这里吧,回去吃我的塔斯丁去啦!

m0_74302039的博客 730

面试中数据结构与算法——知识点最全总结(学完可应对一线大厂)

面试中数据结构与算法——知识点最全总结(学完可应对一线大厂)

IT 甄选推荐 895
上一篇: webpack教程01-webpack是什么与webpack命令行使用
下一篇: 数据结构与算法复习-02-链表
FitzLeopard
博客等级 码龄9年 6粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值