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

文章目录

  • 总览
  • 逻辑结构-集合
    • 回顾树
  • 并查集
  • 回顾 树的存储:双亲表示法
  • 并查集的存储结构
  • 并查集得基本操作
  • 并查集得代码实现-初始化
  • 并查集得代码实现-并查
  • 时间复杂度分析
  • union操作的优化
  • 总结
  • 并查集的终极优化(压缩路径)
    • 对比

总览

数据结构和算法-并查集的实现及优化_第1张图片

逻辑结构-集合

数据结构和算法-并查集的实现及优化_第2张图片
将不同喜欢的水果的人划分为子集
两个元素要么属于同一个集合,要么不属于同一个集合
数据结构和算法-并查集的实现及优化_第3张图片

回顾树

可以用森林中的各个树表示
数据结构和算法-并查集的实现及优化_第4张图片

通过根节点判断是否属于同一个集合或属于哪个集合
数据结构和算法-并查集的实现及优化_第5张图片

并一个树的根节点连到另一颗树的根节点上既可以并
数据结构和算法-并查集的实现及优化_第6张图片
数据结构和算法-并查集的实现及优化_第7张图片

并查集

实现并和查功能的集合

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

双亲表示法:节点存在双亲节点的位置
能够很方便地找到根节点地位置
从而能够很方便实现并和查
数据结构和算法-并查集的实现及优化_第8张图片

并查集的存储结构

数据结构和算法-并查集的实现及优化_第9张图片

并查集得基本操作

数据结构和算法-并查集的实现及优化_第10张图片

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

先初始化表明各节点都是单独的一个子集
数据结构和算法-并查集的实现及优化_第11张图片

并查集得代码实现-并查

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

数据结构和算法-并查集的实现及优化_第12张图片

时间复杂度分析

主要是union操作时间复杂度和对应集合的树的高度有关
树的高度越低时间复杂度也低些
数据结构和算法-并查集的实现及优化_第13张图片

union操作的优化

让高度小的树合并到高度大的树的根节点的孩子节点(小树并到大树)
使得总的树的高度相比于原来高度大的树不会增加
根节点的内容为当前树的节点个数的负数
通过节点的内容正负判断是否为根节点
然后通过根节点的内容更小即判断为高度更高的树
数据结构和算法-并查集的实现及优化_第14张图片
说白了这种方法就是让合并的树每一层都是满的
所以n个节点的高度可以通过之前的满二叉树的方法计算出来
由于高度降低所以最终可以降低Find操作的时间复杂度
数据结构和算法-并查集的实现及优化_第15张图片

总结

数据结构和算法-并查集的实现及优化_第16张图片

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

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

数据结构和算法-并查集的实现及优化_第17张图片
在这里插入图片描述

对比

数据结构和算法-并查集的实现及优化_第18张图片
合并n个独立元素时,Union会首先得查找独立元素对应的根节点(时间复杂度和树的高度有关),然后再进行n-1次合并。所以就是总的时间复杂读就是合并的次数*查找的的时间复杂度
数据结构和算法-并查集的实现及优化_第19张图片

你可能感兴趣的:(王道数据结构和算法考研笔记,数据结构,算法)