算法基础:并查集详解

并查集

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

以上释义来自:百度百科

并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题


  • 根节点的编号就代表该集合的编号
  • 树中每一个节点存储着它的父亲节点
基本原理
  • 如何判断树根
if(p[x]==x)
  • 如何求X的集合编号
while(p[x]!=x) x = p[x];
  • 如何合并两个集合(本质上就是合并两棵树)

方法:将集合1或者2插入到集合1或者2的某个位置即可【根节点之下的某个位置】

** 设Px是x的集合编号,Py是y的集合编号,则合并操作**:p[x] = y;


画解合并/插入

初始时每个集合都是一个独立的集合且集合的编号等于自己下标数。
:)例:p[2]=2,p[6]=6将两个集合进行合并

  • 1.找到p[2]【该集合的根就是该集合的编号】集合的父节点
  • 2.找到p[6]集合父亲节点
  • 3.p[2]集合的父节点指向p[6]集合即可。
    合并后:p[2] = p[6] = 6;
    因为p[2]=2,p[6]=6
    所以合并后的集合{6,2},一个以6为祖宗节点的集合

插入

将以p[6]为根的集合{4,7,10}插入到以p[5]为根的集合{5,3,9}
显然p[3]=5,p[9]=5,p[5]=5p[4]=6,p[7]=6,p[10]=6,p[6]=6
那么只要找到集合p[6]中的祖宗节点【6】指向集合p[5]即可【不一定直接作为其第一个儿子,指向其孙子【比如指向p[3]】也是可以的,因为p[3]的父亲也是5】。
所以有:p[6] = find(3) or p[6] = find(9)【find(x)为寻找x节点的祖宗节点】


路径压缩

可以看到,在计算x的集合编号的时候还是比较耗时的,所以介入了一个优化算法 【路径压缩】

由于每次都要将x指向它的父亲节点,x = p[x]
因此只要搜索一次成功后将该路径上所有的节点x都指向其祖宗节点。这样再一次查询之后,之后的每一次都是近乎O(1)的操作了

这也是并查集NB的一个地方。

代码模板
 int p[N]; //存储每个点的祖宗节点// 返回x的祖宗节点int find(int x){if (p[x] != x) p[x] = find(p[x]);return p[x];}// 初始化,假定节点编号是1~nfor (int i = 1; i <= n; i ++ ) p[i] = i;// 合并a和b所在的两个集合:p[find(a)] = find(b);
模板练习


// Problem: 合并集合
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/description/838/
// Memory Limit: 64 MB
// Time Limit: 1000 ms#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int p[N];
int find(int x)
{if(p[x]!=x) p[x] = find(p[x]);//返回祖宗节点return p[x];}
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){p[i] = i;}	while(m--){char op[2];int a,b;scanf("%s%d%d",op,&a,&b);//合并集合if(*op=='M') p[find(a)]=find(b);else if(find(a)==find(b))printf("Yes\n");elseprintf("No\n");}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/650683.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源框架-链路追踪(SkyWalking)

SkyWalking 极简入门 | Apache SkyWalking 开发环境配置&#xff1a; -javaagent:D:\xxxxx\yyyy\skywalking-agent.jar -DSW_AGENT_NAMEspringboot-xxxx-demo -DSW_AGENT_COLLECTOR_BACKEND_SERVICES127.0.0.1:11800

在“美国死海”边的科研盛会 ACM CCS‘24 截稿日期逼近 行动要快

会议之眼 快讯 亲爱的学者们&#xff0c;第31届ACM CCS 2024&#xff08;ACM Conference on Computer and Communications Security)即计算机和通信安全会议将于 2024 年 10月14日-18日在美国盐湖城举行&#xff01;作为信息安全领域的四大顶会之一&#xff0c;ACM CCS一直备受…

LAPGAN浅析

LAPGAN 引言 在原始 GAN和CGAN中&#xff0c;还只能生成 16*16, 28*28, 32*32 这种低像素小尺寸的图片。而LAPGAN首次实现 64*64 的图像生成。与其一下子生成这么大的图像 &#xff08;包含信息量这么多&#xff09;&#xff0c;不如一步步由小到大&#xff0c;这样每一步生成…

redis常用数据结构

redis常用数据结构 Redis 底层在实现下面数据结构的时候&#xff0c;会进行特定的优化&#xff0c;来达到节省时间/空间的效果。 内部结构 String raw&#xff08;最基本的字符串&#xff09;&#xff0c;int&#xff08;实现计数功能&#xff0c;当value为整数的时候会用整…

webpackd打包两次-生成两份代码-出现legacy的js文件

当我们build后dist文件中出现legacy的js文件。 原因&#xff1a; pack.json文件&#xff1b; { *****"browserslist": ["> 0.03%","not dead"] }当我们项目运行在古老的浏览器上面时&#xff08;表示支持市场份额超过 > 0.03% 的浏览器版…

力扣--N皇后

题目: 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。…

【LLMOps】小白详细教程,在Dify中创建并使用自定义工具

文章目录 博客详细讲解视频点击查看高清脑图 1. 搭建天气查询http服务1.1. flask代码1.2. 接口优化方法 2. 生成openapi json schema2.1. 测试接口2.2. 生成openapi schema 3. 在dify中创建自定义工具3.1. 导入schema3.2. 设置工具认证信息3.3. 测试工具 4. 调用工具4.1. Agent…

C++实战演练---负载均衡在线oj项目预热

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 前言 学习准备了快一年时间&#xff0c;心心念念的实战演练终于可以开始了&#xff0c;话不多说&#xff0c;直接进入主题…

使用streamlit构建网站

1.目的 最近团队有一个人脸识别的项目&#xff0c;想做一个网站界面来演示&#xff0c;同时使用了花生壳进行内网穿透&#xff0c;使得可以在其他设备访问该界面。 2.算法部分 import os os.environ[TF_CPP_MIN_LOG_LEVEL] 2 import matplotlib as mpl mpl.use(TkAgg) impo…

AI大模型探索之路-训练篇4:大语言模型训练数据集概览

文章目录 前言一、常用的预训练数据集1、网页2、书籍3、维基百科4、代码5、混合型数据集 二、常用微调数据集1、指令微调数据集1.1 自然语言处理任务数据集1.2 日常对话数据集1.3 合成数据集 2、人类对齐数据集 前言 在人工智能领域&#xff0c;构建强大的AI系统的关键步骤之一…

RTU遥测终端为城市排水安全保驾护航!

近年来&#xff0c;全球气候变迁与城市化进程不断加速&#xff0c;导致强降雨事件频发&#xff0c;道路低洼地带、下穿式立交桥和隧道等区域在暴雨中常易积水&#xff0c;严重阻碍了人民的出行&#xff0c;甚至危及生命与财产安全。而传统的排水管网管理方式已难以适应现代城市…

干货 :医疗企业渠道管理实战手册:策略、平台建设、CRM解决方案

最近与同行交流&#xff0c;对方调侃道&#xff1a;人形机器人和老头乐&#xff0c;应该也算医疗器械&#xff0c;是服务老人居家和出行的产品。确实&#xff0c;未来中国老龄化加重&#xff0c;医疗器械行业&#xff0c;也会注入新的增长动力。 长期以来&#xff0c;医疗器械…