基于C#实现并查集

一、场景

有时候我们会遇到这样的场景,比如:M={1,4,6,8},N={2,4,5,7},我的需求就是判断{1,2}是否属于同一个集合,当然实现方法有很多,一般情况下,普通青年会做出 O(MN)的复杂度,那么有没有更轻量级的复杂度呢?并查集就是用来解决这个问题的。

二、操作

从名字可以出来,并查集其实只有两种操作,并(Union)和查(Find),并查集是一种算法,所以我们要给它选择一个好的数据结构,通常我们用树来作为它的底层实现。

2.1、节点定义

 #region 树节点
 /// <summary>
 /// 树节点
 /// </summary>
 public class Node
 {
     /// <summary>
     /// 父节点
     /// </summary>
     public char parent;

     /// <summary>
     /// 节点的秩
     /// </summary>
     public int rank;
 }
 #endregion

2.2、Union 操作

<1> 原始方案
首先我们会对集合的所有元素进行打散,最后每个元素都是一个独根的树,然后我们 Union 其中某两个元素,让他们成为一个集合,最坏情况下我们进行 M 次的 Union 时会存在这样的一个链表的场景。
image.png
从图中我们可以看到,Union 时出现了最坏的情况,而且这种情况还是比较容易出现的,最终导致在 Find 的时候就相当复杂了,为 O(N)。
<2> 按秩合并
我们发现出现这种情况的原因在于我们 Union 时都是将合并后的大树作为小树的孩子节点存在,那么我们在 Union 时能不能判断一下,将小树作为大树的孩子节点存在,最终也就降低了新树的深度,比如图中的 Union(D,{E,F})的时候可以做出如下修改。
image.png
可以看出,我们有效的降低了树的深度,在 N 个元素的集合中,构建树的深度不会超过 LogN 层。M 次操作的复杂度为 O(MlogN),从代码上来说,我们用 Rank 来统计树的秩,可以理解为树的高度,独根树时 Rank=0,当两棵树的 Rank 相同时,可以随意挑选合并,在新根中的 Rank++ 就可以了。

 #region 合并两个不相交集合
 /// <summary>
 /// 合并两个不相交集合
 /// </summary>
 /// <param name="root1"></param>
 /// <param name="root2"></param>
 /// <returns></returns>
 public void Union(char root1, char root2)
 {
     char x1 = Find(root1);
     char y1 = Find(root2);

     //如果根节点相同则说明是同一个集合
     if (x1 == y1)
         return;

     //说明左集合的深度 < 右集合
     if (dic[x1].rank < dic[y1].rank)
     {
         //将左集合指向右集合
         dic[x1].parent = y1;
     }
     else
     {
         //如果 秩 相等,则将 y1 并入到 x1 中,并将x1++
         if (dic[x1].rank == dic[y1].rank)
             dic[x1].rank++;

         dic[y1].parent = x1;
     }
 }
 #endregion

2.3、Find 操作

我们学算法,都希望能把一个问题优化到不能优化的地步,针对 logN 的级别,我们还能优化吗?当然可以。
<1> 路径压缩
在 Union 和 Find 这两种操作中,显然我们在 Union 上面已经做到了极致,下面我们在 Find 上面考虑一下,是不是可以在 Find 上运用伸展树的思想,这种伸展思想就是压缩路径。
image.png
从图中我们可以看出,当我 Find(F)的时候,找到“F”后,我们开始一直回溯,在回溯的过程中给,把该节点的父亲指向根节点。最终我们会形成一个压缩后的树,当我们再次 Find(F)的时候,只要 O(1)的时间就可以获取,这里有个注意的地方就是 Rank,当我们在路径压缩时,最后树的高度可能会降低,可能你会意识到原先的 Rank 就需要修改了,所以我要说的就是,当路径压缩时,Rank 保存的就是树高度的上界,而不仅仅是明确的树高度,可以理解成"伸缩椅"伸时候的长度。

 #region  查找x所属的集合
 /// <summary>
 /// 查找x所属的集合
 /// </summary>
 /// <param name="x"></param>
 /// <returns></returns>
 public char Find(char x)
 {
     //如果相等,则说明已经到根节点了,返回根节点元素
     if (dic[x].parent == x)
         return x;

     //路径压缩(回溯的时候赋值,最终的值就是上面返回的"x",也就是一条路径上全部被修改了)
     return dic[x].parent = Find(dic[x].parent);
 }
 #endregion

我们注意到,在路径压缩后,我们将 LogN 的复杂度降低到 Alpha(N),Alpha(N)可以理解成一个比 hash 函数还有小的常量,这就是算法的魅力。
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/184002.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

管理后台系统,springboot+redis+nginx+html+bootstrap

一个简易版的管理后台系统&#xff0c;前后端分离&#xff0c;可适用于小团队开发&#xff0c;支持二次开发。 后端主要技术springboot&#xff0c;他可以帮我们快速的搭建项目&#xff0c;并快速实现开发。 redis做缓存&#xff0c;保存登录状态和一些高频率查询的基础数据。…

【Unity细节】Unity中为什么用字符串加载对象,检查多便都加载不出来—(命名细节)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

小红书达人类型特点有哪些,创作形式总结!

小红书自带的社交电商属性&#xff0c;吸引了众多优秀的内容创作者和品牌达人。他们以不同的风格和主题&#xff0c;赢得了粉丝们的喜爱和关注。今天为大家分享下小红书达人类型特点有哪些&#xff0c;创作形式总结&#xff01; 1. 内容创作风格 我们从内容上来区分小红书达人类…

【论文解读】在上下文中学习创建任务向量

一、简要介绍 大型语言模型&#xff08;LLMs&#xff09;中的上下文学习&#xff08;ICL&#xff09;已经成为一种强大的新的学习范式。然而&#xff0c;其潜在的机制仍未被很好地了解。特别是&#xff0c;将其映射到“标准”机器学习框架是具有挑战性的&#xff0c;在该框架中…

视频录制工具有哪些?收藏起来,需要的时候用起来

视频录制工具顾名思义&#xff1a;用于捕获视频片段的软件。使用视频录制工具&#xff0c;你可以创建属于自己的视频内容。市面上的录屏工具五花八门&#xff0c;有哪些才是适合自己的呢&#xff1f; 虽然有许多视频录制工具可供选择&#xff0c;甚至有很多是免费的&#xff0…

智安网络|如何最大限度地提高企业网络安全水平

在当今数字化时代&#xff0c;企业面临着日益复杂和智能化的网络威胁。为了保护企业的机密信息和客户数据&#xff0c;漏洞扫描成为了一个至关重要的安全措施。然而&#xff0c;对于企业来说&#xff0c;他们最关心的是什么问题呢&#xff1f; 一、漏洞的发现和修复 在网络安全…

SOAP 协议和 HTTP 协议:深入解读与对比

SOAP 和 HTTP 协议 SOAP 协议 SOAP&#xff08; Simple Object Access Protocol&#xff09;是一种用于在节点之间交换结构化数据的网络协议。它使用XML格式来传输消息。它在 HTML 和 SMTP 等应用层协议的基础上进行标记和传输。SOAP 允许进程在整个平台、语言和操作系统中进…

【ChatGLM3-6B】Docker下部署及微调

【ChatGLM2-6B】小白入门及Docker下部署 注意&#xff1a;Docker基于镜像中网盘上上传的有已经做好的镜像&#xff0c;想要便捷使用的可以直接从Docker基于镜像安装看Docker从0安装前提下载启动访问 Docker基于镜像安装容器打包操作&#xff08;生成镜像时使用的命令&#xff0…

火爆火爆!影响超250万读者,Python入门圣经全新升级!

人生苦短&#xff0c;快学Python&#xff01; 什么&#xff1f;你没用过&#xff0c;也没开始学习&#xff0c;甚至没有认真了解过这门语言&#xff1f;那你一定这一秒就开始发力——下面让我们先简单看看 Python 有多火。权威编程语言排行榜 TIOBE&#xff0c;2022 和 2023 都…

案例015:Java+SSM+uniapp基于微信小程序的校园防疫系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

化学气相沉积(CVD)中的TEOS

在半导体制程中&#xff0c;薄膜的沉积是核心的步骤之一&#xff0c;有接触过CVD的小伙伴应该或多或少听过TEOS这种物质&#xff0c;TEOS作为一种重要的沉积源&#xff0c;尤其在低温氧化硅的生成过程中&#xff0c;发挥了无可替代的角色。今天我们就来聊聊这种物质。 什么是TE…

勒索病毒:数字化时代的“黑帮敲诈”,如何防范避免成为下一个受害者?

近日&#xff0c;加拿大政府披露了一起重大黑客攻击事件。据官方消息&#xff0c;两家政府承包商BGRS和SIRVA Canada沦为黑客攻击目标&#xff0c;导致数量不明的政府雇员敏感信息泄露。此次泄露的信息不仅涉及普通政府雇员&#xff0c;还牵扯到加拿大皇家骑警&#xff08;RCMP…

【论文阅读笔记】Smil: Multimodal learning with severely missing modality

Ma M, Ren J, Zhao L, et al. Smil: Multimodal learning with severely missing modality[C]//Proceedings of the AAAI Conference on Artificial Intelligence. 2021, 35(3): 2302-2310.[开源] 本文的核心思想是探讨和解决多模态学习中的一个重要问题&#xff1a;在训练和测…

Mobaxterm 使用lrzsz传输文件(rz/sz)

Mobaxterm 使用lrzsz传输文件报错 1. 现象 最近从xshell切换到Mobaxterm其他一切正常,就是使用rz传输文件时会出现错误,比较苦恼. 会出现以下错误 [rootcentos7 rpmbuild]# rz ▒CCCCCCCCCCC23be50ive.**B0100000023be502. 解决方法 去官网(https://mobaxterm.mobatek.net…

136. 只出现一次的数字

136. 只出现一次的数字 题目&#xff1a; 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空…

【超详细】手搓一个微信日记本

&#x1f380; 文章作者&#xff1a;二土电子 &#x1f338; 关注公众号获取更多资料&#xff01; &#x1f438; 期待大家一起学习交流&#xff01; 这里对之前的微信记事本小程序进行了重新编写&#xff0c;增加了更加详细的步骤描述&#xff0c;将全部图片都改成了本地图…

VMware vShere download

VMware 前言 VMware vSphere 是 VMware 的虚拟化平台,可将数据中心转换为包括 CPU、存储和网络资源的聚合计算基础架构。vSphere 将这些基础架构作为一个统一的运行环境进行管理,并为您提供工具来管理加入该环境的数据中心。 vSphere 的两个核心组件是 ESXi 和 vCenter Ser…

css图片缩放属性object-fit说明

object-fit 属性可以设置以下值&#xff1a; 属性值说明例子fill填充容器&#xff0c;可能会改变图片的比例。object-fit: fill;contain保持图片的原始比例&#xff0c;确保图片完全包含在容器内。object-fit: contain;cover保持图片的原始比例&#xff0c;确保图片覆盖整个容…

OpenMLDB SQL 开发调试神器 - OpenMLDB SQL Emulator

今天为大家介绍一款来自 OpenMLDB 社区的优秀独立工具 - OpenMLDB SQL Simulator&#xff08;https://github.com/vagetablechicken/OpenMLDBSQLEmulator&#xff09; &#xff0c;可以让你更加高效方便的开发、调试 OpenMLDB SQL。 为了高效的实现时序特征计算&#xff0c;Op…

将对象转成URL参数

背景 有的时候前端跳转到其他平台的页面需要携带额外的参数&#xff0c;需要将对象转成用 & 连接的字符串拼接在路径后面。 实现方法