前言

今天在力扣上做了一道每日一题,接触到了并查集这个概念,以前没有了解过,记录在此。

定义

并查集(Disjoint-Set)是一种可以动态维护若干个不重叠的集合,并支持合并与查询两种操作的一种数据结构。

官方关于并查集的说明没有找到,但是并查集的概念那就是维护了一个森林,森林里有很多树,每棵树代表了一个集合,树的根节点就是这个集合的leader,树里面没个子节点都是这个集合的一个单元。

而这个森林支持两种操作

1、查询:给定一个目标值,找到这个目标值的leader

2、合并:给定两个目标值,把两个目标合并到一个集合中

操作是就这么两个操作,看起来很简单,接下来可以先简单的玩一下。

张三的老大是张二、张二的老大是张大,张大是leader,老大是自己;

李四的老大是李三,李三是leader,老大是自己;

查找

现在我们想查一下李四的老大是谁,步骤如下

1、李四是leader么?不是,找李四的老大

2、李四的老大是李三,李三是leader么?是,那么返回李三。

合并

case1:现在新来了一个李氏集团有一个新成员李五要加入。那么要把李五合并进李氏集团,步骤如下。

随便找一个李氏的成员,比如李四,让李四当上李五的老大,合并完成。

case2:现在张氏集团要把李氏集团整体收编

随便找一个张氏集团的成员,比如张二;

随便找到一个李氏集团的成员(任一成员的老大都是一个人),找到其老大,李三;

让张二当上李三的老大,合并完成。

与树的不同

其实根据上面的例子可以看出来,并查集每一棵树,我们是从下往上找的,而在树中,我们通常是从上至下来寻找到各个节点。

这样反查的好处,就是在做一些合并操作的时候代价比较小,比如现在我们有两个元素突然有了共同点,我们要把两个元素所在的树合并(比如case2中,张二突然发现和李四是同一个姥姥生的,现在要把族谱扩大了)。这时,如果要从上之下来找,我们要遍历森林里所有的书,才能知道这两个元素(张二和李四)分别所在的树在哪,然后再把两棵树合并,如果从下至上来查找,那么只需要让一个元素让另一个元素的老大就行了(修改父节点指针)

使用场景

通常并查集这种数据接口都用在多集合反向索引的场景,比如找亲戚

同学a有亲戚b、c、d

同学b有亲戚e、f

同学g有亲戚h、i

那么可以看到e、f通过b和a、c、d都建立起一个亲戚的关系,我们可以通过并查集,直接将两组集合合并,然后再判断两个人是否是亲戚的时候直接判断是不是在一个集合(是不是同一个老大),就可以了。

不然、假设我们要看c和f是不是亲戚,

1、我们要找到所有有c的集合,然后在这些集合看下是不是有f,

2、我们还要看下c所在的所有集合的所有成员所在的集合里是不是是有f

3、我们还要看c所在的所有集合的所有成员所在的所有集合里是不是有f....

周而复始,复杂度越来越大

所以并查集主要是用来解决这种多线索集合的问题,通常数据结构为一个网状(图),我们构建一个并查集(森林),维护这些集合(树)。

c 语言中并查集的用法,并查集基本介绍相关推荐

  1. C语言中 * “星号”的九种用法

    C语言中 * "星号"的九种用法 乘法运算符 复合赋值运算符 假读符 注释符 普通符号 指针定义符 指向运算符 行列地址转换符 地址值符 乘法运算 c=ab; a=2, b=3, ...

  2. C语言中的关键字“ volatile”的用法(摘)

    C语言中的关键字" volatile"的用法(摘) volatile 这个ANSI C 关键字在经典的C 教程中很少提及,高层编程的人也可能永远都 不会用到,但是作为嵌入式开发者来 ...

  3. R语言中的并行计算——二、搭建R的集群

    zhuanzai :http://blog.sina.com.cn/s/blog_83bb57b70101qeys.html 一直纠结于R的大数据计算问题,希望可以找到一个彻底的方案解决它.而云服务器 ...

  4. C语言中结构体struct的用法

    点击蓝字 关注我们 定义结构体变量 下面举一个例子来说明怎样定义结构体变量. struct string { char name[8]; int age; char sex[2]; char depa ...

  5. python语言中整型对应的英文_Python基本数据类型详细介绍(转)

    1.空(None)表示该值是一个空对象,空值是Python里一个特殊的值,用None表示.None不能理解为0,因为0是有意义的,而None是一个特殊的空值. 2.布尔类型(Boolean) 在 Py ...

  6. golang获取结构体中的tag_26. Go 语言中结构体的 Tag 用法

    大家好,我是明哥. 由于某些不可抗力,之前该专栏的所有内容都被删除了.因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒. 本文原文:http://golang.iswbm.com ...

  7. Go 语言中三个点的用法

    参考资料:3 dots in 4 places 在 golang 中,三个点的官方名称是 "three dots"(真·直译),其中常见的三种用法是在代码中: 函数的参数声明,如: ...

  8. C语言中结构体struct的用法总结

    不积硅步,无以至千里.不积小流,无以成江海.每天进步一点点. 一.概述 结构体属于C语言提供给用户的可以进行自定义的数据类型,来满足一些个性化需求.它允许用户建立由不同类型数据组成的组合型的数据结构. ...

  9. C语言中#、##宏定义的用法

    一.#的用法 #用于编译器编译过程进行预处理. 1.宏定义 #define ON 1#ifndef _PARA_ #define _PARA_ #enddef#ifdef _PARB_ #define ...

最新文章

  1. R语言将ggplot2对象转化为plotly对象并通过shiny将可视化结果在应用程序或者网页中显示出来
  2. 东南大学计算机科学试验中心,受迫振动试验数据处理的研究-东南大学物理试验中心.doc...
  3. Powershell(3)
  4. JVM-11虚拟机性能监控与故障处理工具之【JDK的可视化工具-JConsole】
  5. 实例教程七:在SQLite中使用事务
  6. vue中父子组件先后渲染_vue父子组件传值(子传父,非父子组件传值)
  7. java连接mysql数据库jdbc
  8. Chapter 7:Statistical-Model-Based Methods
  9. es6新增的html标签,javascript – 如何导入已在html中的标签中定义的es6模块?
  10. java XML解析防止外部实体注入
  11. 马凯军201771010116《面向对象程序设计(java)》第二周学习总结
  12. 进程线程协程对比(通俗)
  13. pip安装tensorflow_Tensorflow源代码编译踩坑若干
  14. JS高级程序设计——阅读笔记一
  15. Exclusively Dark (ExDark) Image Dataset 数据集下载
  16. DPDK ring简单说明
  17. feil_uVission4左侧工目录消失
  18. Propensity Score Matching
  19. GDG深圳站,我又来了~
  20. mac安装MongoDB与启动

热门文章

  1. FCPX插件:56种高动态HDR视频调色预设HDR Look Effects
  2. nnie学习一、生成wk文件
  3. 如何写出高效的代码?(持续更新)
  4. java io处理_java之IO处理
  5. python气象数据分析_基于Python的气象观测数据的解析与存储
  6. oracle绝对值求和,Oracle存储过程当中经常使用函数
  7. 短信链接跳转微信小程序(URLSchema等)
  8. project和program的区别
  9. 百度智能小程序SEO指南
  10. 桂花网创始人赵福勇:蓝牙物联网的领先者,让万物互联奔腾起来