当前位置: 首页 > news >正文

「图::连通」详解并查集并实现对应的功能 / 手撕数据结构(C++)

目录

概述

成员变量

创建销毁

根节点访问

路径压缩

启发式合并

复杂度

Code


概述

并查集,故名思议,能合并、能查询的集合,在图的连通性问题和许多算法优化上着广泛的使用。

这是一个什么数据结构呢?

一般来讲,并查集是由一系列集合组成的集合群。

其中,每个集合都有一个根节点,它的父亲仍是它自己,集合内其余的节点的父亲or祖宗均是这个节点,这样,一个根节点就领导了一个集合。而并查集支持这样的多个集合的访问以及合并操作。

每个集合都是一个树形结构,你可以认为并查集是一片森林。

听起来挺复杂度,但是其实很好实现。

成员变量

static constexpr int N = 1e5 + 5;一个无关紧要的常量,限制最大值。

int pre[N];父节点指针数组,pre[i]=j表示i的父亲是j,即二者处于同一集合。

int size[N];集合大小数组,只用每个集合的根节点上的size是有意义的,若i为根节点size[i]=x表示i所在的集合大小为x。

struct union_find_set {static constexpr int N = 1e5 + 5;int pre[N],size[N];...
};

创建销毁

在一开始,每个节点都单独成为一个集合,每个集合大小为1。

union_find_set(int n = N) {for (int i = 0; i < n; i++) {pre[i] = i;size[i] = 1;}
}

根节点访问

给定一个节点x,我们想访问他的根节点

这一步可以递归实现:我们知道只有根节点的pre指向自己,所以如果pre[x]==x,我们就找到了根节点,否则沿着pre指针爬,传入下一级root。

int root(int x) {return pre[x] == x ? x : root(pre[x]);
}

路径压缩

沿着pre指针爬树的过程的时间复杂度是线性级别的,但是我们可以使用路径压缩

当我们依次跳出递归时,额外将这一级x的pre指针更新为找到的根节点,这样,一棵树就由多层被压缩成了两层(根节点与叶子节点)。

int root(int x) {return pre[x] = (pre[x] == x ? x : root(pre[x]));
}

启发式合并

想合并两个集合,我们可以采用启发式合并,即按规模合并。

路径压缩并不是实时的,所以一般一个集合仍是多层的。在这种情况下,为了保持查询根节点的高效性,我们应该将小集合接在大集合之下(小集合中节点少,向上访问的总代价小,如果反过来,那么大集合中的大量节点想向上访问会极其不利)。

给出两个节点,将其所在的集合合并,我们先找出root,如果两个节点确实属于不同集合,我们将小集合接在大集合之下,这样就能保持根节点查询的效率。最后根节点的size。

void unite(int x, int y) {x = root(x), y = root(y);if (x == y)return;if (size[y] < size[x])std::swap(x, y);pre[x] = y;size[y] += size[x];
}

复杂度

时间复杂度:O(n) 使用路径压缩:O(1)~O(logn)

空间复杂度:O(n) 

Code

#include <algorithm>
#ifndef UNION_FIND_SET
#define UNION_FIND_SET
struct union_find_set {static constexpr int N = 1e5 + 5;int pre[N],size[N];union_find_set(int n) {for (int i = 0; i < n; i++) {pre[i] = i;size[i] = 1;}}int root(int x) {return pre[x] = (pre[x] == x ? x : root(pre[x]));}int get_size(int x) {return size[root(x)];}void unite(int x, int y) {x = root(x), y = root(y);if (x == y)return;if (size[y] < size[x])std::swap(x, y);pre[x] = y;size[y] += size[x];}
};
#endif

相关文章:

「图::连通」详解并查集并实现对应的功能 / 手撕数据结构(C++)

目录 概述 成员变量 创建销毁 根节点访问 路径压缩 启发式合并 复杂度 Code 概述 并查集&#xff0c;故名思议&#xff0c;能合并、能查询的集合,在图的连通性问题和许多算法优化上着广泛的使用。 这是一个什么数据结构呢&#xff1f; 一般来讲&#xff0c;并查集是…...

基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) PSO优化过程&#xff1a; PSO优化前后&#xff0c;模型训练对比&#xff1a; 数据预测对比&#xff1a; 误差回归对比&a…...

PyTorch 的 DataLoader 类介绍

DataLoader 类 功能与作用 PyTorch 是一个流行的开源机器学习库&#xff0c;它提供了一个名为 DataLoader 的类&#xff0c;用于加载数据集并将其封装成一个可迭代的对象。DataLoader 可以自动地将数据集划分为多个批次&#xff0c;并在训练过程中迭代地返回这些批次。是用于加…...

【设计模式系列】命令模式

目录 一、什么是命令模式 二、命令模式的角色 三、命令模式的典型应用场景 四、命令模式在Runnable中的应用 一、什么是命令模式 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将一个请求或简单操作封装为一个对象。这个模式提供了一种…...

uniapp中使用lottie实现JSON动画

uniapp中使用lottie实现JSON动画 不喜欢废话直接开干一、引入相关依赖二、在项目的目录新建目录结构三、操作步骤四、编写自定义组件代码五、组件的使用提一嘴更多lottie-web常用方法添加点击事件 不喜欢废话直接开干 一、引入相关依赖 npm install lottie-web # 如果有问题可…...

AcWing275

题目重述 这道题的核心是利用方格取数模型的思想&#xff0c;将两条路径的传递过程映射为同时出发的两条路径&#xff0c;避免重复格子的经过。题解通过以下步骤解题&#xff1a; 路径映射&#xff1a;从 (n, m) 回到 (1, 1) 的路径&#xff0c;可以转换成 (1, 1) 到 (n, m) …...

Windows系统部署redis自启动服务【亲测可用】

文章目录 引言I redis以本地服务运行(Windows service)使用MSI安装包配置文件,配置端口和密码II redis服务以终端命令启动缺点运行redis-server并指定端口和密码III 知识扩展确认redis-server可用性Installing the Service引言 服务器是Windows系统,所以使用Windows不是re…...

深入了解机器学习 (Descending into ML):线性回归

人们早就知晓&#xff0c;相比凉爽的天气&#xff0c;蟋蟀在较为炎热的天气里鸣叫更为频繁。数十年来&#xff0c;专业和业余昆虫学者已将每分钟的鸣叫声和温度方面的数据编入目录。Ruth 阿姨将她喜爱的蟋蟀数据库作为生日礼物送给您&#xff0c;并邀请您自己利用该数据库训练一…...

每日OJ题_牛客_集合_排序_C++_Java

目录 牛客_集合_排序 题目解析 C代码 Java代码 牛客_集合_排序 集合_牛客题霸_牛客网 (nowcoder.com) 题目解析 笔试题可直接用set排序&#xff0c;面试可询问是否要手写排序函数&#xff0c;如果要手写排序&#xff0c;推荐写快排。 C代码 #include <iostream> …...

鸿蒙网络编程系列27-HTTPS服务端证书的四种校验方式示例

1. 服务端数字证书验证的问题 在鸿蒙客户端对服务端发起HTTPS请求时&#xff0c;如果使用HttpRequest的request发起请求&#xff0c;那么就存在服务端数字证书的验证问题&#xff0c;你只有两个选择&#xff0c;一个是使用系统的CA&#xff0c;一个是使用自己选定的CA&#xf…...

scala继承

Scala中继承的定义为在原有类的基础上定义一个新类&#xff0c;原有类称为父类&#xff0c;新类称为子类。 当子类从父类中继承的方法不能满足需要时&#xff0c;子类需要有自己的行为&#xff0c;怎么办&#xff1f; 此时使用override可以重写父类方法。 class Aniaml(){va…...

【Hive】2-Apache Hive概述、架构、组件、数据模型

Apache Hive概述 什么是Hive Apache Hive是一款建立在Hladoop之上的开源数据仓库系统&#xff0c;可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表&#xff0c;基于表提供了一种类似SQL的查询模型&#xff0c;称为Hive查询语言(HQL)&#xff0c;用于访…...

关于目前面试八股文的一些心得体会

现在是2024年10月&#xff0c;自22年开始&#xff0c;明显感觉到整个计算机行业&#xff0c;越来越卷了。一方面&#xff0c;随着信息的传播&#xff0c;越来越多的新人涌入了这个赛道&#xff0c;另一方面&#xff0c;众所周知的原因&#xff0c;不管大厂还是小厂在经历寒冬之…...

大数据-178 Elasticsearch Query - Java API 索引操作 文档操作

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…...

PHP(一)从入门到放弃

参考文献&#xff1a;https://www.php.net/manual/zh/introduction.php PHP 是什么&#xff1f; PHP&#xff08;“PHP: Hypertext Preprocessor”&#xff0c;超文本预处理器的字母缩写&#xff09;是一种被广泛应用的开放源代码的多用途脚本语言&#xff0c;它可嵌入到 HTML…...

基于深度学习的生物启发的学习系统

基于深度学习的生物启发学习系统&#xff08;Biologically Inspired Learning Systems&#xff09;旨在借鉴生物大脑的结构和学习机制&#xff0c;设计出更高效、更灵活的人工智能系统。这类系统融合了生物神经科学的研究成果&#xff0c;通过模仿大脑中的学习模式、记忆过程和…...

10_实现readonly

在某些时候&#xff0c;我们希望定义一些数据是只读的&#xff0c;不允许被修改&#xff0c;从而实现对数据的保护&#xff0c;即为 readonly 只读本质上也是对数据对象的代理&#xff0c;我们同样可以基于之前实现的 createReactiveObject 函数来实现&#xff0c;可以为此函数…...

简单介绍$listeners

$listeners 它可以获取父组件传递过来的所有自定义函数&#xff0c;如下&#xff1a; // 父组件 <template><div class"a"><Child abab"handleAbab" acac"handleAcac"/></div> </template><script> impor…...

架构设计笔记-20-补充知识

知识产权 我国没有专门针对知识产权制定统一的法律(知识产权法)&#xff0c;而是在民法通则规定的原则下&#xff0c;根据知识产权的不同类型制定了不同的单项法律及法规&#xff0c;如著作权法、商标法、专利法、计算机软件保护条例等&#xff0c;这些法律、法规共同构成了我…...

scrapy 爬虫学习之【中医药材】爬虫

本项目纯学习使用。 1 scrapy 代码 爬取逻辑非常简单&#xff0c;根据url来处理翻页&#xff0c;然后获取到详情页面的链接&#xff0c;再去爬取详情页面的内容即可&#xff0c;最终数据落地到excel中。 经测试&#xff0c;总计获取 11299条中医药材数据。 import pandas as…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...