【数据结构】[特殊字符] 并查集优化全解:从链式退化到近O(1)的性能飞跃 | 路径压缩与合并策略深度实战

并查集的优化

  • 导读
  • 一、合并优化
    • 1.1 基本原理
    • 1.2 按大小合并
    • 1.3 按秩合并
    • 1.4 两种合并的区别
      • **1.4.1 核心目标**
      • **1.4.2 数据存储**
      • **1.4.3 合并逻辑**
      • **1.4.4 树高控制**
      • **1.4.5 适用场景**
      • **1.4.6 路径压缩兼容性**
      • **1.4.7 极端案例对比**
      • **1.4.8 小结**
  • 二、查找优化
    • 2.1 路径压缩
    • 2.2 算法实现
  • 三、算法评估
    • 3.1**时间复杂度**
      • 3.1.1 **按大小合并(Union by Size)**
      • 3.1.2 **按秩合并(Union by Rank)**
      • 3.1.3 **路径压缩(Path Compression)**
    • 3.2 **空间复杂度**
      • 3.2.1 **按大小合并**
      • 3.2.2 **按秩合并**
      • 3.2.3 **路径压缩**
    • 3.3 **优化策略的协同作用**
      • 3.3.1 **按大小合并 + 路径压缩**
      • 3.3.2 **按秩合并 + 路径压缩**
    • 3.4 **极端场景示例**
      • 3.4.1 **按大小合并**
      • 3.4.2 **按秩合并**
    • 3.5 小结
  • 🚀 结语:并查集优化——效率与智慧的结晶
    • 🔍 **核心优化回顾**
    • ⏱️ **时间复杂度突破**
    • 🧩 **优化策略对比与选择**
    • 💡 **实战启示**
    • 🌟 **下篇预告**

并查集的优化

导读

大家好,很高兴又和大家见面啦!!!

在上一篇内容中我们正确认识了并查集,并通过数据元素与其双亲指针的映射关系实现了并查集的查找与合并的。

但是上一篇的算法实现中,算法的最坏时间复杂度可以达到 O ( N ) O(N) O(N),这并不能很好的满足高效处理动态连通性问题。

在今天的内容中,我们将通过路径优化与按秩合并两种优化方式对并查集实现进一步的优化,大大提高处理动态连通性的效率。

一、合并优化

在并查集中,影响其时间复杂度的操作在查找上,而树的高度h是影响查找时间复杂度的重要因素。那么我们要对并查集的算法进行优化,那就得从树高下手。

下面我们就来看一下如何通过优化不同子集的合并从而优化整个并查集的算法。

1.1 基本原理

当两个树高不同的子集进行合并时,会存在两种合并方案:

  • 小树合并到大树
  • 大树合并到小树

合并优化
不难发现,当大树将小树合并时并不会影响大树的树高,但是当小树将大树合并时,则会增加树高。

试想一下,如果我们要完成n棵树的合并,如果将n-1棵小树合并到大树上,这样我们就能保证在进行查找时,能够尽可能的降低查找时间复杂度。

但是当我们在进行合并时,是将大树合并到小树上,则会不断地增加树高,这样每一次合并,都会增加查找的时间复杂度。

因此为了尽可能优化并查集,那么我们在进行合并操作时,应该在每一次合并操作时,都保证是小树合并到大树上。

今天我们介绍两种优化方案——按大小合并、按秩合并。

1.2 按大小合并

按大小合并指的是根据树的大小,将小树合并到大树。

树的大小由树的结点数量决定,结点多的树为大树,结点少的树为小数。通过树的根结点的绝对值表示树的大小。

这里我们以大写字符为例,我们通过一个整型数组parent来存放每个元素的双亲位置信息:

按大小合并

该算法的实现比较简单,我们只需要在合并算法中加入一个对根结点大小的判断,并且在完成合并后,修改根结点的值:

//按大小合并优化
void Union_by_Size(DSU* s, int root1, int root2) {if (root1 != root2) {//根结点为负数,值越大,结点数量越少if (s->parent[root1] > s->parent[root2]) {s->parent[root2] += s->parent[root1];//修改大树根结点s->parent[root1] = root2;//修改小树根结点}else {s->parent[root1] += s->parent[root2];s->parent[root2] = root1;}}
}

通过按大小合并的方式优化,可以极大可能的降低合并后的树高,但是也不一定。

比如结点多但高度低的大树与结点少但高度高的小树进行合并,此时如果按照大小来进行合并,则会增加合并后树的高度。

那有没有不会影响高度的优化方式呢?这就是我们接下来要介绍的按秩合并;

1.3 按秩合并

所谓的秩(Rank)代表的是树合并前的最大高度。

按秩合并实际上就是根据树高进行合并,将矮树合并到高树中,从而确保在完成合并后的树高最小。

合并的规则如下:

  • 所有结点的初始高度为0,即根结点的高度为0
  • 将秩小的树合并到秩大的树下,秩保持不变
  • 将秩相同的两棵树进行合并,合并后,根结点的秩加1

在按秩合并中,我们需要维护两个数组:

  • parent数组——记录结点的双亲位置
  • rank数组——记录根结点的秩

对应的实现也很简单,如下所示:

//按秩合并
void Union_by_Rank(DSU* s, int root1, int root2) {if (root1 != root2) {if (s->rank[root1] > s->rank[root2]) {s->parent[root2] = root1;//低秩合并到高秩中}else {s->parent[root1] = root2;if (s->rank[root1] == s->rank[root2]) {s->rank[root2] 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[python]基于yolov12实现热力图可视化支持图像视频和摄像头检测

YOLOv12 Grad-CAM 可视化工具 本工具基于YOLOv12模型,结合Grad-CAM技术实现目标检测的可视化分析,支持图像、视频和实时摄像头处理。 注意 该项目使用的是yolov12-1.0模型进行测试通过,不是使用turbo模型,且由于yolov12-1.0由于…

进程Kill杀死后GPU显存没有释放仍然被占用,怎么杀死僵尸进程

参考链接: https://blog.csdn.net/qq_37591986/article/details/131118109 使用下面的命令: fuser -v /dev/nvidia0 | awk {print $0} | xargs kill -9一般来说他会杀掉整个用户的所有进程。

基于飞腾/龙芯+盛科CTC7132全国产交换机解决方案

产品介绍 盛科CTC7132,内置ARM-Cortex A53 主频1.2GHz;支持24个千兆电口,24个万兆光口(850nm多模),1个千兆管理网口,1个管理串口;支持1个百兆健康管理网口:用于设备端口状态、电压、…

Tesseract OCR技术初探(Python调用)

一、Tesseract OCR技术解析 1.1 核心架构与发展历程 Tesseract是由HP实验室于1985年研发的光学字符识别引擎,2005年由Google开源并持续维护至今。其核心技术经历了三个阶段演进: 传统模式(v3.x):基于特征匹配算法&a…

自动语音识别(ASR)技术详解

语音识别(Automatic Speech Recognition, ASR)是人工智能和自然语言处理领域的重要技术,旨在将人类的语音信号转换为对应的文本。近年来,深度学习的突破推动语音识别系统从实验室走入日常生活,为智能助手、实时翻译、医…

Cursor 汉化教程

# 问题 想把 cursor 改成中文 我这里是汉化过的 # 【第一种方法】安装插件 然后重启 # 【第二种方法】Ctrl Shift P 打开配置项 然后搜索输入 Configure Display Language 点一下 切换到 zh-cn 重启 cursor 即可 重启后就好了~

用 pytorch 从零开始创建大语言模型(三):编码注意力机制

从零开始创建大语言模型(Python/pytorch )(三):编码注意力机制 3 编码注意力机制3.1 建模长序列的问题3.2 使用注意力机制捕捉数据依赖关系3.3 通过自注意力关注输入的不同部分3.3.1 一个没有可训练权重的简化自注意力…

Linux之基础知识

目录 一、环境准备 1.1、常规登录 1.2、免密登录 二、Linux基本指令 2.1、ls命令 2.2、pwd命令 2.3、cd命令 2.4、touch命令 2.5、mkdir命令 2.6、rmdir和rm命令 2.7man命令 2.8、cp命令 2.9、mv命令 2.10、cat命令 2.11、echo命令 2.11.1、Ctrl r 快捷键 2…

Java学习------源码解析之StringBuilder

1. 介绍 String中还有两个常用的类,StringBuffer和StringBuilder。这两个类都是专门为频繁进行拼接字符串而准备的。最先出现的是StringBuffer,之后到jdk1.5的时候才有了StringBuilder。 2. StringBuilder解析 从这张继承结构图可以看出: S…

数据化管理(一)---什么是数据化管理

目录 一、什么是数据化管理1.1 “聪明”的销售人员1.2 数据化管理的概念1.3 数据化管理的意义1.4 数据化管理的四个层次1.4.1 业务指导管理1.4.2 营运指导管理1.4.3 经营策略管理1.4.4 战略规划管理 1.5 数据化管理流程图1.5.1 分析需求1.5.2 收集数据1.5.3 整理数据1.5.4 分析…

笔记本电脑更换主板后出现2203:System configuration is invalid,以及2201、2202系统错误的解决

笔记本电脑更换主板后启动出现2203:System configuration is invalid,以及2201、2202系统错误的解决 自用的一台ThinkpadT490笔记本电脑 ,由于主板故障,不得不更换主板,通过某宝购置主板后进行了更换。 具体拆卸笔记本可搜索网络视频教程。 注意: 在更换主板时,注意先拍…

微型导轨和普通导轨有哪些区别?

微型导轨和普通导轨都是常用的工业机械传动装置,目前,市场上有各种各样的导轨产品。那么微型导轨和普通导轨有哪些区别呢? 1、尺寸:微型导轨尺寸较小,滑座宽度最小可达 8MM,长度最小可达 11MM 左右&#xf…

GMP调度模型

Golang调度器的由来 1.协程提高CPU利用率 线程分为用户态和内核态;协程其实就是用户态的线程。 协程和线程的映射关系 N:1关系 N个协程绑定一个线程,优点就是协程在用户态线程即完成切换,不会陷入到内核态,这种切换非常轻量快速…

jetson orin nano super AI模型部署之路(三)stable diffusion部署

先看一下部署后的界面和生成的图片。 在jetson orin nano super上部署stable diffusion比较简单,有现成的docker image和代码可用。 docker image拉取 使用的docker image是dustynv/stable-diffusion-webui,对于jetson orin nano super的jetpack6.2来说…

react如何引用(按需加载)百度地图,并结合and组件化封装

1.技术选项: vitereactantdesign load-script 2.实现思路: 1.按需加载如何实现? 要实现按需加载就不能直接在项目的入口文件这种地方去通过script标签引入,这里使用load-script封装了一个加载百度地图的Bmap.js方法,实现动态的插入script脚本。 根…

Java虚拟机(JVM)详解

Java虚拟机(JVM)详解 JVM内存结构垃圾收集算法标记-清除 算法复制 算法标记 - 整理 算法分代收集算法 类加载类加载过程加载器类型双亲委派模型 Java对象如何判断存活引用计数法可达性分析法 方法分派模型静态分派动态分派 JVM内存结构 方法区&#xff1…

AI知识补全(八):多模态大模型是什么?

名人说:人生如逆旅,我亦是行人。 ——苏轼《临江仙送钱穆父》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:AI知识补全(七):AI Agent 智能…

从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换

从 Word 到 HTML:使用 Aspose.Words 轻松实现 Word 文档的高保真转换 前言一、环境准备二、核心代码实现1. 将 Word 转换为 HTML 文件流2. 优化超链接样式 三、测试效果四、总结 前言 在日常开发中,我们经常需要将 Word 文档转换为 HTML,用于…

观察者模式:解耦对象间的依赖关系

观察者模式:解耦对象间的依赖关系 JDK 中曾直接提供对观察者模式的支持,但因其设计局限性,现已被标记为“过时”(Deprecated)。不过,观察者模式的思想在 JDK 的事件处理、spring框架等仍有广泛应用。下面我…

人工智能之数学基础:矩阵的相似变换的本质是什么?

本文重点 矩阵的相似变换是线性代数中一个至关重要的概念,它揭示了矩阵之间的一种特殊关系。并提供了通过可逆矩阵将一个矩阵转化为另一个矩阵的方法,,同时保持矩阵的某些本质特征不变。但是,你有没有想过,矩阵相似变…