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

数据结构(5.5_2)——并查集

逻辑结构——数据元素之间的逻辑关系

并查集:

并查集(Union-Find)是一种树型的数据结构,用于处理一些不交集的合并及查询问题。它支持两种操作:

用双亲表示存储并查集 

首先将所有根节点数组值设为-1,其他结点数组值对应其父节点的数组下标

查找(Find)

确定某个元素处于哪个子集,它可以用来确定两个元素是否属于同一个子集。

如何“查”到一个元素到底属于哪一个集合?

---从指定元素出发,一路向上,找到根结点---

如何判断两个元素到底是否属于同一个集合?

---分别查到两个元素的根,判断节点是否相同即可---

合并(Union)

将两个子集合并成一个集合。

把两个集合“并“为一个集合

---让一棵树成为另一棵树的子树即可---

树的存储——双亲表示法(回忆)

并查集的代码实现

初始化

先将所有结点数组值设为-1

#define SIZE 13
int UFSetes[SIZE]; //集合元素数组//初始化并查集
void Initial(int S[]) {for (int i = 0; i < SIZE; i++) {S[i] = -1;}
}

并、查

查操作:

//Find "查"操作,找x所属集合(返回x所属根结点)
int Find(int S[], int x) {while (S[x] >= 0)//循环寻找x的根x = S[x];return x;//根的S[]小于0
}

并操作:

 

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

时间复杂度分析

Union的优化操作 

优化思路:在每次Union操作构建树的时候,尽可能让树不长高

  1. 用根节点的绝对值表示树的结点总数
  2. Union操作,让小树合并到大树

 

代码:

//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;//小树合并到大树}
}

总结:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux centos stream 9命令及源码
  • 46-扇孔的处理及铺铜以及布线
  • 01学生管理系统(数组)
  • 基于Spring Boot的健身房管理系统
  • Linux从0到1——进程池
  • 江协科技STM32学习笔记
  • HBase snapshot+replication 测试
  • 不依靠for循环,Python如何对列表进行去重并保留排列顺序
  • <Qt> 系统 - 事件
  • 计算机网络——HTTP协议详解(上)
  • 7万字详解Apache Shiro面试题、示例、参考答案
  • 文心快码 Baidu Comate 前端工程师观点分享:行业现状(二)
  • 贷齐乐系统最新版SQL注入(绕过WAF可union select跨表查询)
  • 字符串函数!!!(续)(C语言)
  • Git 大文件存储 (LFS)
  • JavaScript 如何正确处理 Unicode 编码问题!
  • Bytom交易说明(账户管理模式)
  • crontab执行失败的多种原因
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • flask接收请求并推入栈
  • flutter的key在widget list的作用以及必要性
  • gcc介绍及安装
  • js数组之filter
  • JS学习笔记——闭包
  • mysql中InnoDB引擎中页的概念
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • storm drpc实例
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • ubuntu 下nginx安装 并支持https协议
  • windows下如何用phpstorm同步测试服务器
  • - 概述 - 《设计模式(极简c++版)》
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 小程序开发中的那些坑
  • 异常机制详解
  • 栈实现走出迷宫(C++)
  • 你对linux中grep命令知道多少?
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (黑马C++)L06 重载与继承
  • (简单) HDU 2612 Find a way,BFS。
  • (九十四)函数和二维数组
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (四) Graphivz 颜色选择
  • (四)stm32之通信协议
  • (算法)求1到1亿间的质数或素数
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)大型网站架构演变和知识体系
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .bat批处理(十一):替换字符串中包含百分号%的子串