并查集详解及模板

C++并查集模板详解与数据结构实战 并查集作为一种高效的动态集合管理工具,其底层逻辑依赖于对“集合”、“节点”和“根节点”这三个核心概念的精确建模。在计算机中,数学意义上的集合需要被转化为可操作的数据结构,而这种转化的关键在于如何通过有限的存储单元表达无限可能的集合关系。本章将深入剖析这些基本构成要素的抽象定义与具体实现方式,并以 C++ 语言为载体,展示如何从零开始构建一个具备良好封装性与扩展性的并查集数据模型。集合在数学中被定义为一组无序且互异元素的组合。当多个集合彼此不相交(即任意两个集合的交集为空)时,它们构成了一个。 阅读详情

1. 解决什么问题?

当题目最终要将数据分成若干个集合时,可往并查集的方向思考。并查集三个字拆开对应“合并”,“查找”,“集合”,这样就很好理解了。

【思路】

为了方便查找和合并,每个元素都有对应的代表元素,代表元素就是它所在集合里的所有元素的代表元素。

因此,要构建一个 father 数组 表示每个元素的代表元素。

2. 模板

1)构建集合/初始化

一开始每个元素就是自己的代表元素,后续根据题目要求进行合并,如果要求集合的个数也可以在此处表示。

也不一定写成函数,此处只是为了方便展示。

void build(int n)
{
    for (int i = 1; i < n; i++)
        father[i] = i;
    sets = n;
}

2)查找:递归思路

如果 i == father[i] ,则 i 为代表元素。

而当一个元素的 father 不是本身时,则再找 father 的 father,知道找到代表元素为止。

int find(int p)
{
    if (father[p] != p)
    {
        father[p] = find(father[p]);
    }
    return father[p];
}

3)合并

将代表元素合并,也就是相当于两个集合合成一个集合

 void set_union(int x, int y)
 {
     int fx = find(x);
     int fy = find(y);
     if (fx != fy)
     {
         father[fx] = fy;
         sets--;
     }
 }

3. 优化

一般的并查集用上面的模板就可以,如果想更快些,可以看下面的版本,但需要的空间会大些

1)扁平化

【思路】

因为 find 方法调用频繁,所以如果将递归的次数减少一些会大大优化时间复杂度

优化方法就是将同一代表元素的元素的 father 都改成代表元素(原先是通过递归来实现的)

【实现方式】

需要开一个栈来实现:栈来收集从该元素到代表元素沿途的元素,再将他们的 father 一一改成代表元素

而当下次再调用时,就可以只循环一次,找到它的 father。

int find(int i) {
    int size = 0;
    while (i != father[i]) {
        stack[size++] = i;
        i = father[i];
    }

    while (size > 0) {
        father[stack[--size]] = i;
    }
    return i;
}

2)小挂大

需要多开一个数组表示代表元素对应的集合的元素个数,记为 size 数组,初始化时全为1

两个集合合并表示为对应代表元素的 size 值小的加到大的上

void set_union(int × int y) 
{
    int fx = find(x);
    int fy = find(y);
    if (fx != fy) {
        // 小的挂在大的上
        if (size[f×] >= size[fy]) {
            size[f×] += size[fy];
            father[fy] = fx;
        } else {
            size[fy] += size[f×];
            father[fx] = fy;
        }
    }
}

PS:如果看模板不好理解,最好结合练习看会舒服很多

4. 练习

(1)模板题

链接:牛客_并查集的实现

(2)相似字符串组

链接:leet_839

【分析】

核心思路就是并查集,通过记录每个字符串的不同字符数找相似字符串,然后按并查集的思路合并,最终输出集合的个数。

【参考代码】链接

(3)情侣牵手

链接:leet_765

【分析】

情侣数一定是人数的一半,故只需开人数一半的集合即可,规定其 ID 对应除以2的数就是对应的情侣 ID;

那么每一次相邻两个元素合并就将其情侣 ID (可理解为代表元素)合并即可,因为在合并的函数中,属于相同集合的不用再进行操作,而只有不是属于一个集合的才减少集合的个数

【参考代码】链接

Transformers在自动驾驶领域的应用(High-level like in scene) Transformers uses global attention mechanism to capture long-range interaction information. Two core modules in Transformers are Self-Attention and Cross-Attention, which defined asAttn(Q,K,V)=softmax(QK⊤dk)VSelfAttn(X)=Attn(WQX,WKX,WVX)CrossAttn(X,Y)=Attn 阅读详情

相关推荐

华为使用MicroG安装并使用Google服务教程

鉴于众多华为手机用户因无法使用Google服务而感到不便,我经过多次摸索和测试,总结了一份简单易懂的教程,希望能够帮助到大家。无论是需要使用Google Play商店下载应用,还是需要使用Google服务进行工作和学习,本文将详细介绍如何在华为手机上安装并使用Google服务。二、前置条件软件要求:Aurora Store(替代Google Play商店)、MicroG Companion、MicroG Server(替代Google框架)

weixin_41926602的博客 3万+

《并查集算法详解及实用模板》

学会了并查集, 可以接触到Tarjan大佬的一角了。 并查集结构由Galler和Fischer于1964年发明, 于1989证明时间复杂度。 具有全O(1)的优雅数据结构。 Kruskal最小生成树, Tarjan算法和并查集结构解决批量查询最近公共祖先问题。 并查集

博客网站地址: https://arsenova.xyz 我会将优快云上的博客重修一部分迁移到网站上。 文章会做同步更新,但我不会在这个糟糕的平台多待1秒。下面是我要说的话,save your time. keep going 1758

深信服技术认证“SCCA-C”划重点:信服云托管云

该认证包括云数据中心基础、云计算基础、云计算关键技术、云计算交付和运维体系、云计算技术商业应用、信服云托管云、深信服超融合HCI、深信服桌面云aDesk、深信服分布式存储EDS、深信服应用交付AD。学习并获得SCCA-C认证后,可以具备深信服产品功能原理与实践,能够根据业务需求,协助完成云产品方案落地与实施;能够根据业务需求,完成深信服云产品的部署和管理的基本工作。为帮助大家更加系统化地学习云计算知识,高效通过云计算工程师认证,深信服特推出“SCCA-C认证备考秘笈”,共十期内容。

sangfor_edu的博客 614

P3367 【模板】并查集 题解 与并查集详解

P3367 【模板】并查集 题解 和 并查集详解

m0_66502505的博客 374

ESP32拓展板DIY全攻略:从零打造你的传感器控制中心(附PCB设计文件)

本文详细介绍了如何从零开始DIY ESP32拓展板,打造多功能传感器控制中心。内容涵盖项目规划、硬件设计、PCB布局、制作测试全流程,并提供进阶优化建议和实战案例。特别适合嵌入式硬件爱好者学习ESP32拓展板开发,实现各类传感器的高效集成与控制。

blockchain9miner的博客 1078

SAP SD跨公司销售IDOC自动记账配置实战指南

本文详细介绍了SAP SD模块中跨公司销售IDOC自动记账的配置实战指南。通过IDOC技术实现集团企业间交易的自动化处理,显著提升财务效率和准确性。文章涵盖前置配置、RFC连接、合作伙伴参数设置及财务科目分配等关键步骤,并提供了常见错误排查和性能优化建议,帮助用户快速掌握这一高效业务流程。

weixin_29284885的博客 772

并查集详解(模板)

并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运

暗淡的时光 318

SAC安装与相关库文件(.so)的安装

摘要 SAC: Seismic Analysis Code 是用于地震信号处理的一套软件。 本文将介绍SAC的安装,以及安装时遇到的一些问题。主要是一些动态库(lib**.so)找不到的问题。 本文的环境 64位的 Ubuntu 16.04 64位的系统是安装出现问题的主要原因 1. SAC获取与安装 SAC 的安装,只需要解压,然后修改环境变量即可!!!不需要任何编译!!! 1.1. SAC 获取与解压 SAC软件获取地址:http://ds.iris.edu/ds/nodes/dmc/forms/s.

WangCY的博客 4336

并查集详解+模板

http://blog.youkuaiyun.com/liujian20150808/article/details/50848646 并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定。不分享出来真是对不起party了。(party:我靠,关我嘛事啊?我跟你很熟么?)来看一个实例,HDU1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可

白茶清欢无别事 468

从Gitee上部署视觉工程到Linux虚拟机

(使用SVM来识别装甲板的编号,此处手机上的图片中只有灯条没有数字,SVM无法识别出编号。这两行代码的意义是,当SVM识别不出或者识别不到编号时,把装甲板的编号默认为2号。找到自瞄程序中,数字识别类下的这两行代码,把注释去掉。这样,每次打开新的终端时,环境变量都会自动设置。(2)查看虚拟机设置选项,检查虚拟机USB接口是否为3.0及以上的接口。如果不是,要更改好。这样,每次打开新的终端时,环境变量都会自动设置。后,每次打开终端时自动设置这些环境变量,你可以将。打开第一个终端,用来挂ROS的内核启动页面。

2301_81035291的博客 1520

基于STM32设计的万能红外遥控器(学习型)

当前介绍了一种基于STM32微控制器设计的红外遥控器,支持接收解码功能和发送功能,可以将接收的码原样发送出去。 红外遥控器作为智能设备控制方式之一,在一定程度上满足了人们对于快速方便控制的需求。 当前设计的红外遥控器支持学习模式和发送模式。通过矩阵键盘上的数字键选择发送对应的控制码。 一共支持学习10个控制码,对应矩阵键盘上的数字。0~9。

6559

详解并查集模板——理论和代码的实现

并查集的理解与实现 这里通过一个例子来讲解一下并查集 问题 我们要判断一个无向图中是否存在环,如果存在的话就返回Ture,否则的话就返回False。 代码的实现 进行路径路径优化是通过增加一个rank数组来记录根结点对应的数的高度,以此来判断当找到两个要合并的两个根结点的时候,应该将哪一个作为新的根结点,哪一个作为其子树。 public class Main { public static void main(String[] args) { //并查集,外加压缩路径进行优

西瓜的博客 300

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

带权并查集模板题详解

1. 题目描述TT and FF are ... friends. Uh... very very good friends -________-b FF is a bad boy, he is always wooing TT to play the following game with him. This is a very humdrum game. To begin with, TT s...

untilyouydc 1040

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jre9下载 jdk9

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

并查集详解+Java模板代码

并查集清晰易懂

qq_44622851的博客 147

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

并查集详解(附例题和模板)

并查集详解(附例题和模板)

m0_73557680的博客 342

Union-Find Set 并查集 详解 [基本模板]

并查集--路径压缩--启发式合并--按秩合并--移动次数--权值

张天枭の博客 2173

【数据结构】并查集(操作详解 + 模板 + 练习)

并查集的表示方法,并查集的基本操作,模板 + 练习

2401_87820834的博客 1930

(刷题必备)并查集详解+Java模板代码

并查集的简单介绍 并查集模板代码 保证性能的两个启发式策略:路径压缩和按秩合并 时间复杂度介绍 Ackermann(4,1)到底有多大 何谓并查集 并查集,在《算法导论》中的术语是“用于不相交集合的数据结构”。比较抽象,笔者觉得还不如“并查集”来的好理解。 先举个简单的例子来直观感受一下“并查集”解决的问题: 假设有编号分别为0,1,2,3,4,5的6个人, 告诉你0和4是一伙儿的,2和3同属一伙,3和5同属一伙,请问一共有几个团伙? 这个问题可以靠简单推理得出答案。但是如果

编程架构三分天下:分层、分治、分时序。 3039

P3367 并查集(入门模板题)(详解)

题目描述 如题,现在有一个并查集,你需要完成合并和查询操作。 输入格式 第一行包含两个整数 N, M,表示共有 N 个元素和 M 个操作。 接下来 M 行,每行包含三个整数 Zi,Xi,Yi。 当 Zi = 1时,将 Xi 与 Yi 所在的集合合并。 当 Zi = 2时,输出 Xi 与 Yi 是否在同一集合内,是的输出 Y ;否则输出 N 。 输出格式 对于每一个 Zi = 2的操作,都有一行输出,每行包含一个大写字母,为 Y 或者 N 。 输入输出样例 输入 #1 4 7 2 1 2 1 1 2 2 1

weixin_51250927的博客 1431

并查集模板:食物链详解

【代码】并查集模板:食物链详解。

2302_76649176的博客 297

【并查集】模板 + 【HDU 1213、HDU 1232、POJ 2236、POJ 1703】例题详解

不想看模板,想直接看题目的请戳下面目录: 目录: HDU 1213 How Many Tables【传送门】 HDU 1232 畅通工程 【传送门】 POJ 2236 Wireless Network 【传送门】 POJ 1703 Find them, Catch them 【传送门】 先上模板: #define MAXN 根据编号需要 int per[MAXN],rank[MAX...

lesileqin的博客 283

【C++算法模板】并查集详解,一种处理不相交集合的合并与查询的数据结构

并查集是用于处理不相交集合的合并与查询的树形数据结构

qq_63586399的博客 1202

手撕并查集及其优化,三大相关模板实现详解(附图解)

一旦用了路径压缩,会破坏树的形态,因为原来的节点的父节点会直接压缩到祖先上,这样一来我们调用的时候父子关系发生了改变,造成了算法的错误。​ 所谓 ” 路径压缩 “ ,就是一种在执行 ” 查找 “ 过程中,扁平化树的结构的方法,使得在路径上的每一个节点都可以直接连在根节点上,为以后直接或则间接引用节点的操作加速。​ 当树的高度过高,查询元素的个数过多时, BF 做法 的时间效率显得过于吃力,此时我们需要对元素所在集合查询时的路径进行缩短优化,此时均摊的时间复杂度为。的所在集合的祖宗节点的父节点置为。

qq_63786973的博客 439
上一篇: 前缀和 && 差分
下一篇: KMP算法详解
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值