浅谈并查基

所谓并查集,就是一种支持并与查的数据结构,是一种集合。并即为合并,查即为查询。

我们给每个集合选择一个代表元素,每个元素记录一个\(fa\)数组,表示它所在的集合的代表元素。合并两个集合,我们只需要将其中一个集合的代表元素的\(fa\)数组赋值为另外一个集合的代表元素即可。代表元素的\(fa\)就是自己。这样子操作的话,所有元素之间的关系就会形成一个森林,若要查询两个元素是否在同一个集合内,只需要看看他们的根是否相同即可。

但是,如果树的深度为\(n\),每次查询都是\(O(n)\)的,这个复杂度是我们所不能接受的。

路径压缩

由于我们只关注每个元素所在的树的根是谁,所以我们不必将整条链谁在前谁在后记录下来,只需要将每个元素直接指向根即可。

int find(int x) {
    if(fa[x]==x)return x;//自己就是树根
    return fa[x]=find(fa[x]);//将自己的fa数组指向树根并且返回
}

按秩合并

所谓秩,就是树的深度或者集合大小。在秩的概念等于集合大小的时候,这又称为启发式合并。每次合并将秩较小的集合往秩较大的集合上并,这样子只会增加小的集合的元素的询问复杂度。我们只需要把每个集合的秩记录在代表元素上即可。

带边权的并查基

我们可以在树的边上记录一些信息,每次路径压缩的时候更新每个元素往自己父亲那一条边上的信息,通过一些信息的性质,我们可以计算出同一集合内任意两个元素之间存在的某些关于我记录的信息的关系,这就是带边权的并查基。

并查基是一种十分简洁明了的数据结构,操作也就只有上面几种。由于本数据结构十分简单,所以一般题目都会变着法子增加思维难度。怎么在题目中找到元素之间的关系以及如何用并查基维护我们需要知道的信息,才是我们学习并查基的重中之重。

原文地址:https://www.cnblogs.com/AKMer/p/10360090.html

时间: 2024-10-09 09:49:36

浅谈并查基的相关文章

【深入.NET平台】浅谈.NET Framework基元类型

什么是基元类型? 初学者可能很少听说过这个名词,但是平时用得最多的肯定是基元类型.先看下面两行代码: System.Int32 a = 5; int a = 5;  上面两行代码都表示声明一个int类型的变量,但在平时写代码的时候我们一般用的是第二种方式.第二种方式不仅简洁.易读,而且生成的IL代码和第一种完全一致.像这种编译器直接支持的数据类型就称为基元类型.类似的还有double.bool.long.string等. 基元类型与.NET框架类库的关系 在我接触的第一份面试题中,我记得有这么一

浅谈并查集 By cellur925【内含题目食物链、银河英雄传说等】

什么是并查集? 合并!查询!集合! 专业点说? 动态维护若干不重叠的和,支持合并查询的数据结构!(lyd老师说的) 数据结构特点:代表元.即为每个集合选择一个固定的元素,作为整个集合的代表,利用树形结构存储,每个节点都是一个元素,树根是集合的代表元素.(还是lyd老师说的) 两大基本操作 一.合并(merge()) 即把两个集合合并到一个的操作.通俗的说,即令其中一个树根为另一个树根的子节点. void merge(int x,int y) { fa[getf(x)]=getf(y); } 二.

浅谈Android多屏幕的事

浅谈Android多屏幕的事 一部手机可以同时看片.聊天,还可以腾出一支手来撸!这么吊的功能(非N版本,非第三方也能实现,你不知道吧)摆在你面前,你不享用?不关注它是怎样实现的?你来,我就满足你的欲望! 一部手机可以同时看片.聊天,还可以腾出一支手来撸==!就像这样: 是时候告别来回切换应用屏幕的酸爽了,还可以在分屏模式下两Activity间直接拖放数据! 好高大上的样子!这是怎么实现的?别急,我们一一道来: kitkat(4.4)版本对多任务分屏的实现 由于相关的代码和功能被封装及隐藏起来,所

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

浅谈知识管理

工欲善其事,必先利其器 推荐使用为知笔记(WizNote),它是电脑.手机.平板上都能用的云笔记软件,还可以分类管理和共享资料! 使用我的邀请码注册 前言 在做项目,解决某些需求的时候,总会用到自己不熟悉的模块和技术,这时候就会各种谷歌百度查手册,查询完之后,实现功能需求,过一段时间之后,就又忘记当时是如何实现的了. 这时你会怎么做?是又去网上查找一遍?还是说通过之前的个人知识管理,即时抓取.快速检索该知识? 浅谈知识管理(以自己为例) 熟话说:“好记性不如烂笔头”,但是在这个信息爆棚的时代,充

浅谈oracle中rowid和rownum

[ 概要 ] 刚刚接触oracle的同学可能常常会被rowid和rownum这两个词弄混, 弄清楚这两个家伙对于我们写sql会有很大的帮助, 下面偶就抛砖引玉, 简单地谈谈他们之间的区别吧. [ 比较 ] rowid和rownum都是oracle中的伪列, 但他们还是存在本质区别: rowid: 是物理地址, 用于定位数据表中数据的位置, 它是唯一的且不会改变. rownum: 是根据查询的结果集给每行分配的一个逻辑编号, 查询结果不同, rownum自然不同. 对于同一条记录, 查询条件不同,

浅谈委托和事件(一)

浅谈委托和事件(一) 关于委托和事件,可能是.NET或者说是面向对象编程语言中的一个比较重要又比较难以理解的概念.关于这一话题,园子里的人也写了很多文章,最经典的可能就是张子阳的C#中的委托和事件这两篇文章了,之前也看过MSDN 上的WebCast深入 "委托和事件".可能和很多人一样,刚开始读的时候,觉得很清楚,但是过了一段时间好像又忘记了委托和事件的区别,知道很久以前,在一次面试中我被问到委托和事件有什么区别,一下子就说不清了. 所以这里稍微理一下,也算是自己的一个总结.当然,还是

( 转)浅谈QT中窗口刷新事件

浅谈QT中窗口刷新事件 [日期:2011-06-25] 来源:Linux社区  作者:袁硕 [字体:大 中 小] 经过一个星期的项目初步开发,写此文就开发时遇到的一些常见问题,给出些资料和自己的观点,希望能给其他的初学者或者参赛的选手一点帮助,当然,也算是一种抛砖引玉,大家有什么好的技巧经验什么的,也能多多分享,借助这次比赛,我们共同进步~ 如果大家都是跟我一样,刚刚开始接触QT,开始开发QT的程序,肯定也会有很多不习惯的地方,今天我重点想谈的就是这么一个不习惯的地方——QT中窗口刷新事件. 对

浅谈C++ IO标准库(1)

IO流:一.C++中标准IO库:1).为面向对象的标准库.2).以继承的形式设计.     A)以iostream为基类,派生出了fstream,strigstream类.注意:fstream.stringstream没有继承关系,open.close为fstream类自有的函数操作,str为stringstream自有的函数操作,故其各函数操作不可混用,而iostream中的函数操作其两子类由于继承关系可以调用.     B) 其禁用了复制和赋值操作,故IO对象不可以复制或赋值.这将导致像ve