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

集合元素并查集

改章节笔者在深圳吃饭的时候突然想到的...之前就有想写几篇关于集合元素的博客,所以回家到之后就奋笔疾书的写出来发布了

    并查集:(

    union-find sets)

    一种简略的用处广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操纵,应用很多,如其求无向图的连通分量个数等。最完善的应用当属:实现Kruskar算法求最小生成树。

    l         并查集的精髓(即它的三种操纵,结合实现代码模板进行懂得):

    1、Make_Set(x) 把每一个元素初始化为一个集合

    初始化后每一个元素的父亲节点是它本身,每一个元素的先人节点也是它本身(也可以根据情况而变)。

    2、Find_Set(x) 查找一个元素所在的集合

    查找一个元素所在的集合,其精髓是找到这个元素所在集合的先人!这个才是并查集判断和合并的最终依据。
判断两个元素是不是属于统一集合,只要看他们所在集合的先人是不是相同即可。
合并两个集合,也是使一个集合的先人成为另一个集合的先人,详细见示意图

    3、Union(x,y) 合并x,y所在的两个集合

    合并两个不相交集合操纵很简略:
利用Find_Set找到其中两个集合的先人,将一个集合的先人指向另一个集合的先人。如图

集合和元素

    

    l         并查集的优化

    每日一道理
微笑,是春天里的一丝新绿,是秋日里的一缕阳光,是骄阳下的一片浓荫,是冬雪中的一株梅红……微笑着去面对吧,你会感到人生是那样的温馨与甜蜜!

    1、Find_Set(x)时 路径压缩
寻觅先人时我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次Find_Set(x)都是O(n)的复杂度,有没有方法减小这个复杂度呢?
谜底是确定的,这就是路径压缩,即当我们经过"递推"找到先人节点后,"回溯"的时候顺便将它的子孙节点都直接指向先人,这样以后再次Find_Set(x)时复杂度就变成O(1)了,如下图所示;可见,路径压缩方便了以后的查找。

    2、Union(x,y)时 按秩合并
即合并的时候将元素少的集合合并到元素多的集合中,这样合并之后树的高度会绝对较小。

集合和元素

int father[MAX];   /* father[x]表示x的父节点*/
 2int rank[MAX];     /* rank[x]表示x的秩*/
 3
 4
 5/* 初始化集合*/
 6void Make_Set(int x)
 7{
 8    father[x] = x; //根据实际情况指定的父节点可变更
 9    rank[x] = 0;   //根据实际情况初始化秩也有所变更
10}
11
12
13/* 查找x元素所在的集合,回溯时压缩路径*/
14int Find_Set(int x)
15{
16    if (x != father[x])
17    {
18        father[x] = Find_Set(father[x]); //这个回溯时的压缩路径是精髓
19    }
20    return father[x];
21}
22
23
24/* 
25   按秩合并x,y所在的集合
26   上面的那个if else结构不是绝对的,详细根据情况变更
27   但是,主旨是稳定的即,按秩合并,实时更新秩。
28*/
29void Union(int x, int y)
30{
31    x = Find_Set(x);
32    y = Find_Set(y);
33    if (x == y) return;
34    if (rank[x] > rank[y]) 
35    {
36        father[y] = x;
37    }
38    else
39    {
40        if (rank[x] == rank[y])
41        {
42            rank[y]++;
43        }
44        father[x] = y;
45    }
46}

    

文章结束给大家分享下程序员的一些笑话语录: 姿势要丰富,经常上百度!

--------------------------------- 原创文章 By
元素和合并
---------------------------------

相关文章:

  • PostgreSQL的总体架构
  • Web 应用程序项目 XXXX 已配置为使用 IIS。 无法访问 IIS 元数据库。您没有足够的特权访问计算机上的 IIS 网站。...
  • 030、 Linux 查看CPU信息、机器型号等硬件信息
  • 用Shell脚本监控服务器并发邮件报警
  • HANA学习笔记1-搭建HANA学习环境
  • linux何检查一个目录是否为空目录
  • 网站安全那些事
  • Gartner:数据审计与保护的9个关键能力
  • Mybatis 在CS程序中的应用
  • 支持高并发的IIS Web服务器常用设置
  • ThinkPHP框架中添加404错误页面以及访问安全
  • 一条if语句引起的思考
  • SQLSERVER使用密码加密备份文件以防止未经授权还原数据库
  • Eclipse初次java开发问题总结-1
  • android-有效解决加载大图片时内存溢出的问题
  • 《深入 React 技术栈》
  • 【刷算法】求1+2+3+...+n
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Cookie 在前端中的实践
  • js递归,无限分级树形折叠菜单
  • Linux后台研发超实用命令总结
  • Magento 1.x 中文订单打印乱码
  • nodejs实现webservice问题总结
  • Python十分钟制作属于你自己的个性logo
  • React-Native - 收藏集 - 掘金
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SQLServer之创建显式事务
  • Terraform入门 - 1. 安装Terraform
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 回顾2016
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一些css基础学习笔记
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #宝哥教你#查看jquery绑定的事件函数
  • #在 README.md 中生成项目目录结构
  • (12)Linux 常见的三种进程状态
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Python第六天)文件处理
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (五)网络优化与超参数选择--九五小庞
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转载)深入super,看Python如何解决钻石继承难题
  • .apk 成为历史!
  • .dwp和.webpart的区别
  • .htaccess配置常用技巧
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • :O)修改linux硬件时间