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

数据结构——二十二、并查集(王道408)

文章目录

  • 前言
  • 一.逻辑结构——“集合”
    • 1.全集
    • 2.子集与森林
  • 二.用互不相交的树,表示多个“集合”
    • 1.查操作
    • 2.并操作
  • 三.代码实现并查集
    • 1.存储结构——双亲表示法
      • 1.定义
      • 2.代码
      • 3.图例
    • 2.初始化
    • 3.查操作
      • 1.定义
      • 2.代码
      • 3.时间复杂度
    • 4.并操作
      • 1.定义
      • 2.代码
      • 3.时间复杂度
  • 四.使用Union操作优化并查集
    • 1.优化思路
    • 2.代码展示
    • 3.优化后影响
  • 五.知识回顾与重要考点
  • 结语

前言

本文介绍了并查集(Disjoint Set)的逻辑结构、存储实现和优化方法。主要内容包括:1)用互不相交的树表示集合,通过查操作(Find)和并操作(Union)实现集合操作;2)使用双亲表示法存储结构,给出初始化、查、并的代码实现;3)提出优化方案,通过小树合并到大树的方式控制树高,将查操作的时间复杂度从O(n)优化到O(log₂n)。并查集是一种高效处理不相交集合的数据结构,适用于需要频繁查询和合并集合的场景。文章还总结了并查集的重要考点和知识点框架。

代码在文章开头,有需要自取🧐

一.逻辑结构——“集合”

1.全集

在这里插入图片描述

2.子集与森林

  • 将各个元素划分为若干个互不相交的子集
    在这里插入图片描述

  • 森林。森林是m(m≥0)棵互不相交的树的集合
    在这里插入图片描述

  • 同一子集中的各个元素,组织成一棵树用于表示各个子集之间互不相交的关系

二.用互不相交的树,表示多个“集合”

1.查操作

如何“”到一个元素到底属于哪一个集合?
答:从指定元素出发,一直寻找它的父结点,直至找到根节点,根节点代表了其属于哪一棵树

如何判断两个元素是否属于同一个集合?
答:分别查到两个元素的根,判断根节点是否相同即可

2.并操作

如何把两个集合“”为一个集合?
答:让一棵树成为另一棵树的子树即可

注:并查集(Disjoint Set)是逻辑结构——集合的一种具体实现,只进行“并”和“查”两种基本操作

三.代码实现并查集

1.存储结构——双亲表示法

1.定义

  • 双亲表示法:每个结点中保存指向双亲的“指针”

2.代码

#define SIZE 13
int UFSets[SIZE];	//集合元素数组

3.图例

在这里插入图片描述

2.初始化

初始状态:所有的元素都是一个一个独立的结点

//初始化并查集
void Initial(int S[]){for(int i=0; i<SIZE; i++)S[i]=-1;
}

3.查操作

1.定义

  • Find–“查”操作:确定一个指定元素所属集合

2.代码

//Find“查”操作,找x所属集合(返回x所属根结点)
//x表示这个元素的数组下标
int Find(int S[], int x){while(S[x]>=0)//循环寻找x的根x=S[x];return x; //根的S[]小于0
}

3.时间复杂度

  • 若结点数为n,Find最坏时间复杂度为O(n)

4.并操作

1.定义

  • Union–“并”操作:将两个不相交的集合合并为一个

2.代码

}
//Union“并”操作,将两个集合合并为一个
//Root1和Root2是要合并的两个集合的根结点
void Union(int S[], int Root1, int Root2){//要求Root1与Root2是不同的集合if(Root1==Root2) return;//将根Root2连接到另一根Root1下面S[Root2]=Root1;
}

3.时间复杂度

  • 时间复杂度:O(1)

四.使用Union操作优化并查集

可以看出查这个操作的最坏的时间开销直接和树的高度的相关,如果我们想要优化这个并查集的效率的话,那我们能否在构造这个树的时候让这棵树别长得太高

1.优化思路

  • 在每次Union操作构建树的时候,尽可能让树不长高
    用根节点的绝对值表示树的结点总数
    Union操作,让小树合并到大树

  • 例子
    在这里插入图片描述

    • A这棵树有6个结点,因此存为-6
    • C这棵树有2个结点,因此存为-2
    • C这棵树有5个结点,因此存为-5

2.代码展示

//Union“并”操作,小树合并到大树
void Union(int S[], int Root1, int Root2){if(Root1==Root2) return;if(S[Root2]>S[Root1]){//Root2结点数更少S[Root1] += S[Root2]; //累加结点总数S[Root2]=Root1; //小树合并到大树}else{S[Root2] += S[Root1]; //累加结点总数S[Root1]=Root2; //小树合并到大树}
}

3.优化后影响

  • 该方法构造的树高不超过⌊log2n⌋+1\lfloor log₂n\rfloor+1log2n+1
  • Union操作优化后,Find操作最坏时间复杂度:O(log₂n)

五.知识回顾与重要考点

在这里插入图片描述

结语

二更😉

想要查看更多章节?请点击一、数据结构专栏导航页

http://www.dtcms.com/a/496566.html

相关文章:

  • 云网站功能32层建筑工期是
  • 程序+股票一年随笔
  • 手机网站制作费室内设计效果图图片
  • 【Luogu】P1972 [SDOI2009] HH 的项链 (树状数组求区间内不同数的个数)
  • 若依AI平台
  • 宁波网站建设设计制作.net 网站开发架构
  • 制作网站网络科技公司做seo对网站推广有什么作用
  • 软件测试基础知识与面试题总结
  • 河南高端网站建设随机图片网站
  • Orcad capture 元器件位号按顺序重排
  • 外贸行业网站建设公司排名企业集团网站建设
  • 400电话申请网站源码程序做网站公司不给源码
  • CFF Explorer: 一款Windows PE 文件分析的好工具
  • LINUX14 进程间的通信 - 管道
  • 徐州城乡建设局网站金山网站建设公司
  • Java成长之路 | 技术专栏导航页
  • 知识就是力量——mode-red使用qq邮箱
  • 四川网站建设公司 会员登录制作动作游戏吧中文
  • 做网站价格需要多少钱Wordpress页面标签插件
  • YOLO-V3深度学习中的目标检测新高度
  • 找到M3U8直播源的方法
  • html5网站建设平台百度搜索关键词规则
  • 专业做公墓 陵园的网站三合一网站包含什么
  • 深度学习——基于 ResNet18 的图像分类训练
  • 西安公司建一个网站需要多少钱广告设计公司合同
  • Linux:11.线程概念与控制
  • 恋家网邯郸房产网站排名优化服务公司
  • 婚纱网站建设需求分析国外模板wordpress
  • 南阳理工网站建设专项培训网站建设方案
  • 便携气象站具备完整的气象观测能力