数据结构——二十三、并查集的终极优化(王道408)

文章目录

前言

本文介绍了并查集(Disjoint Set)的优化方法,重点分析了路径压缩技术。通过将查找路径上的所有节点直接挂载到根节点,使树高显著降低。文章详细阐述了压缩路径的实现原理和代码示例,并对比了原始版本、Union优化和Find优化三种方式的时间复杂度:从O(n²)优化到O(nα(n)),其中α(n)是增长极慢的函数。最后提供了可视化工具链接帮助理解算法过程。全文简明扼要地讲解了并查集的核心优化思路------尽可能降低树高,提升查询效率。
代码在文章开头,需要自取🧐

一.拓展:Find操作的优化(压缩路径)

1.查找路径的概念

  • 对于L这个结点,它从它本身找到根节点的路径叫做查找路径
  • 压缩路径的这种优化方式其实就是要使得这个查找路径变短

2.压缩路径的思路

  • 压缩路径------ Find 操作,先找到根节点,再将查找路径上所有结点都挂到根结点下

1.具体例子

  1. 把L的查找路径上的这几个蓝色节点,全部都把它们挂到A这个根节点的下面

  2. 那么下一次找这个结点的时候只需走一次就可以找到根结点了

3.压缩路径的代码实现

c 复制代码
//Find"查"操作优化,先找到根节点,再进行"压缩路径"
int Find(int S[],int x){
	int root=x;
	while(S[root]>=0) root=S[root]; //循环找到根
	while(x!=S[x]; //压缩路径
	int t = S[x];//t指向x的父节点
		S[x]=root; //x直接挂到根节点下
		x=t;
	}
	return root; //返回根节点编号
}

4.优化后的影响

  • 每次Find操作,先找根,再"压缩路径",可使树的高度不超过O(α(n))。α(n)是一个增长很缓慢的函数,对于常见的n值,通常α(n)≤4,因此优化后并查集的Find、Union操作时间开销都很低。

二.并查集的优化过程

核心思想:尽可能让树变矮

1.原始版本

  • 用数组、双亲表示法来描述元素之间的集合关系。根节点为-1,非根节点指向父节点下标。
  • F i n d ( i n t S [ ] , x ) Find (int S[],x) Find(intS[],x)------找到x所属集合 U n i o n ( i n t S [ ] , i n t x , i n t y ) Union(int S[],int x,int y) Union(intS[],intx,inty)------将x、y所属集合合并
  • 最坏时间复杂度:
    • Find 操作 = 最坏树高 = O(n)
    • 将n个独立元素通过多次Union合并为一个集合------ O ( n 2 ) O(n^{2}) O(n2)

2.Union优化

  • 用根节点的负值表示一棵树的结点总数
  • 每次 Union 操作让小树合并到大树根节点下面
  • 最坏时间复杂度:
    • Find操作=最坏树高=O(log₂n)
    • 将n个独立元素通过多次Union合并为一个集合------O(nlog₂n)

3.Find优化

  • "压缩路径"的策略,每次 Find操作先找到x所属根节点,再将查找路径上的所有结点都直接挂在根节点下面
  • 最坏时间复杂度:
    • Find操作= 最坏树高 = O ( α ( n ) ) O(\alpha(n)) O(α(n))
    • 将 n 个独立元素通过多次 Union 合并为一个集合------ O ( n α ( n ) ) O(n\alpha(n)) O(nα(n))

408快乐站(这个网站几乎涵盖了所有大纲要求掌握的算法)

点开链接玩一玩: 408快乐站

结语

这可不是我偷懒啊,王道这一节里面就只有这点内容😖
如果想看更多章节,请点击:一、数据结构专栏导航页

相关推荐
Algebraaaaa3 小时前
什么是前端、后端与全栈开发,Qt属于什么?
开发语言·前端·qt
全栈游侠4 小时前
04-优先级与延时链表
笔记
.YM.Z4 小时前
数据结构——链表(二)
数据结构·链表
im_AMBER4 小时前
React 01
前端·javascript·笔记·react.js·前端框架·web
稻草猫.4 小时前
文件 IO
java·笔记·后端·java-ee·idea
纵有疾風起4 小时前
C++模版:模板初阶及STL简介
开发语言·c++·经验分享·开源
QT 小鲜肉4 小时前
【个人成长笔记】Qt Creator快捷键终极指南:从入门到精通
开发语言·c++·笔记·qt·学习·学习方法
子豪-中国机器人4 小时前
《C++ STL 基础入门》教案
java·开发语言
消失的旧时光-19435 小时前
ScheduledExecutorService
android·java·开发语言