数据结构和算法-并查集的实现及优化

本文介绍了并查集的数据结构,包括双亲表示法的存储、初始化过程、基本操作(并查)及其时间复杂度分析。重点讨论了并查集的优化策略,尤其是通过压缩路径来降低Find操作的时间复杂度。对比了合并n个元素时的性能提升。
摘要由CSDN通过智能技术生成

总览

在这里插入图片描述

逻辑结构-集合

在这里插入图片描述
将不同喜欢的水果的人划分为子集
两个元素要么属于同一个集合,要么不属于同一个集合
在这里插入图片描述

回顾树

可以用森林中的各个树表示
在这里插入图片描述

通过根节点判断是否属于同一个集合或属于哪个集合
在这里插入图片描述

并一个树的根节点连到另一颗树的根节点上既可以并
在这里插入图片描述
在这里插入图片描述

并查集

实现并和查功能的集合

回顾 树的存储:双亲表示法

双亲表示法:节点存在双亲节点的位置
能够很方便地找到根节点地位置
从而能够很方便实现并和查
在这里插入图片描述

并查集的存储结构

在这里插入图片描述

并查集得基本操作

在这里插入图片描述

并查集得代码实现-初始化

先初始化表明各节点都是单独的一个子集
在这里插入图片描述

并查集得代码实现-并查

并:先查找到两个集合的根,然后把根的父节点的索引值赋值给另一个根的的父节点的内容
查:通过节点的父节点往上遍历即可

在这里插入图片描述

时间复杂度分析

主要是union操作时间复杂度和对应集合的树的高度有关
树的高度越低时间复杂度也低些
在这里插入图片描述

union操作的优化

让高度小的树合并到高度大的树的根节点的孩子节点(小树并到大树)
使得总的树的高度相比于原来高度大的树不会增加
根节点的内容为当前树的节点个数的负数
通过节点的内容正负判断是否为根节点
然后通过根节点的内容更小即判断为高度更高的树
在这里插入图片描述
说白了这种方法就是让合并的树每一层都是满的
所以n个节点的高度可以通过之前的满二叉树的方法计算出来
由于高度降低所以最终可以降低Find操作的时间复杂度
在这里插入图片描述

总结

在这里插入图片描述

并查集的终极优化(压缩路径)

Find操作两次循环
第一次循环:找到根节点
第二次循环:再次遍历查找根节点,将遍历到的节点的内容都更新为第一次循环找到的根节点
通过这样,第二次Find时可以直接找到对应的根节点

在这里插入图片描述
在这里插入图片描述

对比

在这里插入图片描述
合并n个独立元素时,Union会首先得查找独立元素对应的根节点(时间复杂度和树的高度有关),然后再进行n-1次合并。所以就是总的时间复杂读就是合并的次数*查找的的时间复杂度
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看星猩的柴狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值