并查集(很难搞的数据结构)

并查集是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素。

顾名思义,并查集支持两种操作:

  • 合并(Union):合并两个元素所属集合(合并对应的树)
  • 查询(Find):查询某个元素所属集合(查询对应的树的根节点),这可以用于判断两个元素是否属于同一集合

并查集在经过修改后可以支持单个元素的删除、移动;使用动态开点线段树还可以实现可持久化并查集。

路径压缩(核心思想)

查询过程中经过的每个元素都属于该集合,我们可以将其直接连到根节点以加快后续查询。

 

 acwing  合并集合

一共有 n 个数,编号是 1∼n1,最开始每个数各自在一个集合中。

现在要进行 m 个操作,操作共有两种:

  1. M a b,将编号为 a和 b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
  2. Q a b,询问编号为 a和 b 的两个数是否在同一个集合中;
输入格式

第一行输入整数 n 和 m。

接下来 m 行,每行包含一个操作指令,指令为 M a b 或 Q a b 中的一种。

输出格式

对于每个询问指令 Q a b,都要输出一个结果,如果 a和 b在同一集合内,则输出 Yes,否则输出 No

每个结果占一行。

数据范围

1≤n,m≤1e5

输入样例:
4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4
输出样例:
Yes
No
Yes

 

#include<iostream>
using namespace std;
const int N=100010;
int f[N];
int n,m;
int find(int x) //返回祖宗结点
{
    if(f[x]!=x)
    {
        f[x]=find(f[x]);
    }
    return f[x];
}
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++) //每个数赋值为自己的父结点
    {
        f[i]=i;
    }
    while(m--)
    {
        char op;
        int a,b;
        cin>>op>>a>>b;
        if(op=='M')
        {
            f[find(a)]=find(b); 根结点相同,合并集合
        }
        else
        {
            if(find(a)==find(b)) 判断祖宗结点是否相同
            {
                cout<<"Yes"<<endl;
            }
            else
            {
                cout<<"No"<<endl;
            }
        }
    }
    return 0;
}

  • 39
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
⼤数据导论(1)——"⼤数据"相关概念、5V特征、数据类型 在过去的⼗⼏年中,各个领域都出现了⼤规模的数据增长,⽽各类仪器、通信⼯具以及集成电路⾏业的发展也为海量数据的产⽣与存储提供 了软件条件与硬件⽀持。 ⼤数据,这⼀术语正是产⽣在全球数据爆炸式增长的背景下,⽤来形容庞⼤的数据集合。 由于⼤数据为挖掘隐藏价值提供了新的可能,如今⼯业界、研究界甚⾄政府部门等各⾏各业都对⼤数据这⼀研究领域密切关注。 尽管⽬前⼤数据的重要性已被社会各界认同,但⼤数据的定义却众说纷纭,Apache Hadoop组织、麦肯锡、国际数据公司等其他研究者都 对⼤数据有不同的定义。但⽆论是哪种定义都具有⼀定的狭义性。 因此,我们可以从⼤数据的"5V"特征对⼤数据进⾏识别。同时,企业内部在思考如何构建数据集时,也可以从此特征⼊⼿。以下就是⼤ 数据的"5V"特征图。 1. 容量(Volume) 是指⼤规模的数据量,并且数据量呈持续增长趋势。⽬前⼀般指超过10T规模的数据量,但未来随着技术的进步,符合⼤数据标准的数据集 ⼤⼩也会变化。 ⼤规模的数据对象构成的集合,即称为"数据集"。 不同的数据集具有维度不同、稀疏性不同(有时⼀个数据记录的⼤部分特征属性都为0)、以及分辨率不同(分辨率过⾼,数据模式可能会 淹没在噪声中;分辨率过低,模式⽆从显现)的特性。 因此数据集也具有不同的类型,常见的数据集类型包括:记录数据集(是记录的集合,即数据库中的数据集)、基于图形的数据集(数据对 象本⾝⽤图形表⽰,且包含数据对象之间的联系)和有序数据集(数据集属性涉及时间及空间上的联系,存储时间序列数据、空间数据 等)。 2. 速率(Velocity) 即数据⽣成、流动速率快。数据流动速率指指对数据采集、存储以及分析具有价值信息的速度。 因此也意味着数据的采集和分析等过程必须迅速及时。 3. 多样性(Variety) 指是⼤数据包括多种不同格式和不同类型的数据。数据来源包括⼈与系统交互时与机器⾃动⽣成,来源的多样性导致数据类型的多样性。根 据数据是否具有⼀定的模式、结构和关系,数据可分为三种基本类型:结构化数据、⾮结构化数据、半结构化数据。 结构化数据,指遵循⼀个标准的模式和结构(conform to a data model or schema),以⼆维表格的形式存储在关系型数据库⾥的⾏ 数据。结构化数据是先有结构、后产⽣数据。由于关系型数据库发展较为成熟,因此结构化数据的存储、分析⽅法也发展的较为全⾯, 有⼤量的⼯具⽀持结构化数据分析,分析⽅法⼤部门以统计分析和数据挖掘为主。其中,关系型数据库(Relational Database)是创 建在关系模型基础上的数据库,关系模型即⼆维表格模型,因此⼀个关系型数据库包括⼀些⼆维表且这些表之间的具有⼀定关联。关系 型数据库可运⽤SQL语⾔通过固有键值提取相应信息。 ⾮结构化数据,是指不遵循统⼀的数据结构或模型的数据(如⽂本、图像、视频、⾳频等),不⽅便⽤⼆维逻辑表来表现。这部分数据 在企业数据中占⽐达,且增长速率更快。⾮结构化数据更难被计算机理解,不能直接被处理或⽤SQL语句进⾏查询。⾮结构化数据常以 ⼆进制⼤型对象(BLOB,将⼆进制数据存储为⼀个单⼀个体的集合)形式,整体存储在关系型数据库中中;或存储在⾮关系型数据库 中(NoSQL数据库)。其处理分析过程也更为复杂。 半结构化数据,是指有⼀定的结构性,但本质上不具有关系性,介于完全结构化数据和完全⾮结构化数据之间的数据。它可以说是结构 化数据的⼀种,但是结构变化很⼤。因此,为了了解数据的细节,不能将数据简单按照⾮结构化数据或结构化数据进⾏处理,需要特殊 的存储(化解为结构化数据/⽤XML格式来组织并保存到CLOB字段中)和处理技术。半结构化数据包含相关标记,⽤来分隔语义元素 以及对记录和字段进⾏分层。因此,它也被称为⾃描述的结构(以树或者图的数据结构存储的数据)。先有数据,再有结构。两种常见 的半结构化数据:XML⽂件和JSON⽂件。常见来源包括电⼦转换数据(EDI)⽂件、扩展表、RSS源、传感器数据。 除此之外,还有⼀种⽤于描述其他数据的数据,即"元数据"。元数据可说明已知的数据的⼀些属性信息(数据长度、字段、数据列、 ⽂件⽬录等),提供了数据系谱信息(包含数据的演化过程。)、和数据处理的起源。元数据可分为三种不同类型,分别为记叙性元数 据、结构性元数据和管理性元数据,主要由机器⽣成并添加到数据集中。例如数码照⽚中提供⽂件⼤⼩和分辨率的属性⽂件。元数据的 作⽤也类似于数据仓库中的数据字典。 4. 真实性(Veracity) 指数据的质量和保真性。⼤数据环境下的数据最好具有较⾼的信噪⽐。 信噪⽐与数据源和数据类型⽆关。 5. 价值(Value) 即低价值密度。随着数据量的增长,数据
快速查询控件2.0 -----------------------打造中国快捷,明了,直观,易查,易用的查询控件 一。创作初衷: 在创作此控件时,作者曾用万能查询控件开发之各类ERP及通讯用软件,但客户普遍反应此控件难查,难学,难用。绝大多数客户反应他们仅仅只要一个简单的查询就行了,不要求太多的功能。但要快捷,明了,直观,易查,易用。为了满足客户的需求,遂起综合以前所写的各类查询方法,集合而成为本控件--快速查询控件。 二。控件优势: 1:快速查询控件2.0发布了。此快速查询控件,综合各查询控件的优势,取其精华弃其糟粕。 2.本控件生成的查询界面快捷,明了,直观,易查,易用。 3.本快速查询控件,在运行时不与数据库发生交付查询访问,即与数据一点联系都没有,消除了与数据库的访问负荷。用户可用sql profiler查看证实。而因不与数据库发生关系,故也与数据库连接接驱动程序无关。 4.本控件由于与数据库无关,则可应用于三层结构客户端的查询用。 5.可保存前一次查询条件以及在需要时进行多条件查询,使用方便,功能强大。 三。安装方法: 1.双击d6或d7文件夹下的ZQComponent打开组件包,在组件包面板上点compile,再点Install则安装完毕。安装完毕后会在delphi的组件面板里看到ZQSoft面板,第一个组件即fastSearch. 2.设置组件库目录。点delphi菜单tools-->Environment options-->library页-->点library path -->点右边...按钮则弹出directories窗口--->点...按钮选择安装组件包的路径--->确定-->Add-->Ok-OK则正确设置了组件路径。如果组件路径设置错误则运时会提示找不到dcu文件的错误。 四。使用方法。 具体见我的demo。简述如下: 1.拖曳FastSearch控件到你的Form上。设置DatabaseType属性即你所用的数据库类型,默认为SQL Server。 2.可设置DataSet属性或不设置DataSet属性 2.1设置DataSet属性,此方法简单常用,此DataSet即你用来访问数据库的数据集组件。设完DataSet后,则本控件会自动把DataSet里的fields里所有的字段域拿过来到DataFields里去,省去重新输入字段域的麻烦,用户也可在里面自行修改或删除字段域。如果用户DataSet里没设固定的列对象则控件在运行时会自动用默认域。如demo1. 2.2不设置DataSet属性。则直接设置DataFields里添加各项内容。在没有设置DataSet时,注意设置DataFields里的各项的AutoCheckType设为false。AutoCheckType为True时,控件在运行时会自动到DataSet里检查DataFields里各项的数据类型。如demo2. 3.运用FastSearch的Search方法执行查询。返回成功后从QueryCondition取得查询所得到的SQL 条件语句。也可用QuerySql方法,此方法会自动分析sql语句然后把查询后的条件插入到正确的位置,则当QuerySql返回结果不为空时,即是结果SQL语句,此方法对长SQL语句很简单。 4.是不是很简单,哈哈,FastSearch查询设计就这么简单的哦。 联系方式: Email:[email protected] QQ:1282329592 五、历史版本: 1.2.02 解决了在oracle8i下日期数据查询出错的BUG。 2. 2.01 解决了在多条件下不选择任何条时出错提示信息压于查询框下面看不到的BUG. 3. 2.0 加入DataFields编辑器,解决多表关联的同名字段查询问题,并可完全脱离DataSet进行查询,使查询控件更独立。 4. v1.21 修改非模试窗口在顶部时压于底层看不见。并对使界面更友好。 5. v1.2 加入多条件查询,并修正了1.0的一些bug 六、注意 1.目录中demo1与demo2为在delphi7下编译通过的例子。 2.D2005中的控件仍为2.0版本的,因我没有delphi2005,有朋友须要时可联系我。D6与D7为2.02版本的控件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值