并查集(Disjoint Set)

article/2025/8/27 2:52:26

目录

❤️什么是并查集?

🎶实现方法1

🐔实现方法2

🎃题目1


❤️什么是并查集?

        并查集是一种数据结构,用于处理一些不交集(Disjoint sets,一系列没有重复元素的集合)的合并及查询问题。

常见的两种操作:

        -合并两个集合;                        //并

        -查找某元素属于哪个集合;      //查

🎶实现方法1

        -用编号最小的元素标记所在的集合;

        -定义一个数组 Set[1..n] ,其中 Set[i] 表示元素 i 所在的集合

不相交集合:{1 , 3 , 7} , {4} , {2, 5, 9, 10} , {6, 8} 

每个元素 i 用数组的下标表示,集合中保存的元素是集合中元素的标记。

例如:第一个不相交集合{1 , 3 , 7},这个集合的标记为最小的元素 1,则图中Set[1]、Set[3]、Set[7]都保存这个集合的标记 1。(就相当于1是集合{1 , 3 , 7}的队长,2是集合{2, 5, 9, 10}的队长)

-查找元素:时间复杂度O(1)

find_1(x){return Set[x];
}

例如:查找元素9是哪个集合则返回Set[9],也就是标记为2的集合。

-合并操作:时间复杂度O(N)

merge_1(a, b){i = min(a, b);j = max(a, b);for(int k=1; k<=N; k++){if(Set[k] == j)Set[k] = i;}
}

例如:合并两个集合{1 , 3 , 7} , {4},执行merge_1(1, 4),用两个集合的标记的较小值重新标记每个元素。

🐔实现方法2

-每个集合用树来表示

对于数组Set[1..n],Set[i] = i,则 i 就是队长,也就是树根;Set[i] = j,且 j != i,则 j 就是 i 的上级,也就是父节点。

  

 -查找元素:最坏情况的时间复杂度O(N)

find_2(x){r = x;while(Set[r]!=r)r = Set[r]; return r;
}

例如:查找元素10的大队长,10的上级是4,4的上级是,2的上级是他自己,那么2就是大队长。

-合并操作:时间复杂度O(1)

void merge_2(a, b){Set[a] = b;
}

 

 -避免最坏情况:上面说到,查找的最坏情况时间复杂度是O(N),如何避免最坏情况?

        方法:降低查找深度,将深度低的树合并到深度高的树。如下图所示:第一种合并结果高度为4,第二种合并结果高度为3。

        实现:时间复杂度O(1)

merge_3(a, b){if(height(a)==height(b)){height(a) = height(a)+1;Set[b] = a;}else if(height(a)<height(b))Set[a] = b;elseSet[b] = a;
}

         效果:最坏情况的时间复杂度变为O(logN)

🎃题目1

Problem - 1232https://acm.hdu.edu.cn/showproblem.php?pid=1232AC代码:

#include<bits/stdc++.h>
using namespace std;int city[1001];
int findBoss(int a){int boss = a;while(city[boss]!=boss){boss = city[boss];}return boss;
}
void changeBoss(int a, int b){int aBoss = findBoss(a);int bBoss = findBoss(b);if(aBoss != bBoss){city[aBoss] = bBoss;}
}int main (){int N, M, x, y, number;while(cin >> N, N){number = -1;for(int i=1; i<=N; i++)city[i] = i;cin >> M;for(int i=0; i<M; i++){cin >> x >> y;changeBoss(x, y);}for(int i=1; i<=N; i++)if(city[i]==i) number++;cout << number << endl;}return 0;
}


http://chatgpt.dhexx.cn/article/IU8LheIE.shtml

相关文章

并查集

参考 https://www.cnblogs.com/asdfknjhu/p/12515480.html https://www.bilibili.com/video/BV13t411v7Fs?p3 https://leetcode-cn.com/problems/number-of-provinces/solution/python-duo-tu-xiang-jie-bing-cha-ji-by-m-vjdr/ 一、基本概念 并查集是一种数据结构 并查集这…

并查集(详细解释+完整C语言代码)

目录 1概论 2.树的表现形式 3.代码实现 3.1创立集合 3.2合并 3.3查询 3.4路径压缩 第一个方法&#xff1a;查找时优化 第二个方法&#xff1a;合并时优化&#xff08;加权标记法&#xff09; 4.完整代码 4.1优化前 4.2优化后 1概论 并查集是一种十分精巧且实用的树形…

时间序列预测的一般步骤

一、ARIMA模型概述 ​​ ARMA模型就是AR和MA的简单结合&#xff0c;同时包含了历史数值项和错误项。由于AR和MA模型都对时间序列有平稳性要求&#xff0c;ARMA模型也存在这个限制&#xff0c;因此我们将其拓展到ARIMA模型&#xff0c;其可以解决非平稳性问题。引入的差分概念是…

时间序列预测算法总结

时间序列算法 time series data mining 主要包括decompose&#xff08;分析数据的各个成分&#xff0c;例如趋势&#xff0c;周期性&#xff09;&#xff0c;prediction&#xff08;预测未来的值&#xff09;&#xff0c;classification&#xff08;对有序数据序列的feature提…

基于深度学习的时间序列预测

# 技术黑板报 # 第十一期 推荐阅读时长&#xff1a;15min 前言 时间序列建模历来是学术和工业界的关键领域&#xff0c;比如用于气候建模、生物科学和医学等主题应用&#xff0c;零售业的商业决策和金融等。虽然传统的统计方法侧重于从领域专业知识层面提供参数模型&#xff0…

预测类问题中的时间序列预测模型

前言&#xff1a;时间序列预测模型适用于含有时间变量的模型预测&#xff0c;对中短期的预测有着较好的结果&#xff0c;对长期预测不适用。本文重点介绍ARIMA模型的原理及代码实现。 其他模型总结&#xff1a;​【Python】Python中的经典时间序列预测模型总结_风度78的博客-C…

Transformer 在时间序列预测中的应用

2017年&#xff0c;Google的一篇 Attention Is All You Need 为我们带来了Transformer&#xff0c;其在NLP领域的重大成功展示了它对时序数据的强大建模能力&#xff0c;自然有人想要把Transformer应用到时序数据预测上。在Transformer的基础上构建时序预测能力可以突破以往的诸…

【推荐收藏】11种比较常用的时间序列预测模型

时间序列及其预测是日常工作中建模&#xff0c;分析&#xff0c;预测的重要组成部分。 本文我们将从0开始介绍时间序列的含义&#xff0c;模型及其分析及其常用的预测模型。 文章目录 交流时间序列定义时间序列预测模型与方法原始数据朴素法简单平均法移动平均法指数平滑法一次…

时间序列预测的20个基本概念总结

1、时间序列 时间序列是一组按时间顺序排列的数据点 比如&#xff1a; 每小时的气压每年的医院急诊按分钟计算的股票价格 2、时间序列的组成部分 时间序列数据有三个主要组成部分。 趋势季节性残差或白噪声 3、趋势 在时间序列中记录的长期缓慢变化/方向。 4、季节性 …

时间序列-预测(Forcasting):时间序列预测算法总结

一、背景介绍 绝大部分行业场景,尤其是互联网、量化行业,每天都会产生大量的数据。金融领域股票价格随时间的走势;电商行业每日的销售额;旅游行业随着节假日周期变化的机票酒店价格等; 我们称这种不同时间收到的,描述一个或多种特征随着时间发生变化的数据,为时间序列…

时间序列预测 | ARMA应用指南

ARMA可谓是时间序列最为经典常用的预测方法&#xff0c;广泛应有于涉及时间序列的各个领域。ARMA模型自出道以来&#xff0c;出场次数不可胜数。想必大家也都不陌生&#xff0c;常学常新&#xff0c;我们今天不妨再来回顾一遍&#xff5e;。 ARMA全称Autoregressive moving ave…

时间序列预测的7种方法

import pandas as pd#取数 #dfpd.read_csv(jetrail.csv) #print(df.head()) ID Datetime Count 0 0 25-08-2012 00:00 8 1 1 25-08-2012 01:00 2 2 2 25-08-2012 02:00 6 3 3 25-08-2012 03:00 2 4 4 25-08-2012 04:00 2#pr…

Transformer时间序列预测

介绍&#xff1a; 提示&#xff1a;Transformer-decoder 总体介绍 本文将介绍一个 Transformer-decoder 架构&#xff0c;用于预测Woodsense提供的湿度时间序列数据集。该项目是先前项目的后续项目&#xff0c;该项目涉及在同一数据集上训练一个简单的 LSTM。人们认为 LSTM 在…

时间序列预测的8种常用方法简介

时间序列预测的7种方法 1. 朴素预测法&#xff08;Naive Forecast) 如果数据集在一段时间内都很稳定&#xff0c;我们想预测第二天的价格&#xff0c;可以取前面一天的价格&#xff0c;预测第二天的值。这种假设第一个预测点和上一个观察点相等的预测方法就叫朴素法&#xff…

常见的时间序列预测模型python实战汇总

最完整的时间序列分析和预测&#xff08;含实例及代码&#xff09;&#xff1a;https://mp.weixin.qq.com/s/D7v7tfSGnoAqJNvfqGpTQA 1 时间序列与时间序列分析 在生产和科学研究中&#xff0c;对某一个或者一组变量 x(t)x(t) ARIMA 模型对时间序列的要求是平稳型。因此&#…

时间序列预测模型

时间序列数据一般有以下几种特点&#xff1a;1.趋势(Trend) 2. 季节性(Seasonality)。 趋势描述的是时间序列的整体走势&#xff0c;比如总体上升或者总体下降。下图所示的时间序列是总体上升的&#xff1a; 季节性描述的是数据的周期性波动&#xff0c;比如以年或者周为周期&…

【数据分析】基于时间序列的预测方法

时间序列预测 目录 时间序列预测1.时间序列介绍2.原始数据集3.导入数据4.检测时间序列的平稳性5.如何使时间序列平稳5.1 估计和消除趋势5.1.1 对数转换5.1.2 移动平均 5.2 消除趋势和季节性5.2.1 差异化5.2.2 分解 6.预测时间序列6.1 AR Model6.2 MA Model6.3 Combined Model6.…

Matlab实现时间序列预测

文章目录 一、数据准备二、时间序列预测分类1、输入为xt&#xff0c;输出是yt2、有x值&#xff0c;有y值&#xff1a;NARX(1)选择模型类型(2)选择输出&#xff0c;只有y_t(3)选择70%用来作为训练数据&#xff0c;15%用来作为验证使用&#xff0c;15%用来测试(4)选择delay(5)开始…

【时序预测】Transformer模型在时间序列预测领域的应用

今天又是一篇Transformer梳理文章&#xff0c;这次应用场景是时间序列预测。Transformer的序列建模能力&#xff0c;让其天然就比较适合时间序列这种也是序列类型的数据结构。但是&#xff0c;时间序列相比文本序列也有很多特点&#xff0c;例如时间序列具有自相关性或周期性、…

11种常见的时间序列预测方法

参考内容&#xff1a;4大类11种常见的时间序列预测方法总结和代码示例 代码地址&#xff1a; https://github.com/SeafyLiang/machine_learning_study/blob/master/time_series 11种常见的时间序列预测方法 1、指数平滑Exponential Smoothing2、Holt-Winters 法3、自回归 (AR)…