网站建设设计计划表人像摄影
news/
2025/9/23 17:20:57/
文章来源:
网站建设设计计划表,人像摄影,手机端网站怎么做的,wordpress一键拨号文章目录 并查集1.朴素版本2.路径压缩3.按秩合并4.启发式合并5.练习题 并查集
1.朴素版本
1. 并查集解决的是连通块的问题#xff0c;常见操作有#xff0c;判断两个元素是否在同一个连通块当中#xff0c;两个非同一连通块的元素合并到一个连通块当中。 并查集和堆的结构… 文章目录 并查集1.朴素版本2.路径压缩3.按秩合并4.启发式合并5.练习题 并查集
1.朴素版本
1. 并查集解决的是连通块的问题常见操作有判断两个元素是否在同一个连通块当中两个非同一连通块的元素合并到一个连通块当中。 并查集和堆的结构类似都是采用数组存储下一个节点的下标的方式来抽象成一棵树只不过堆的数组对应的是一棵二叉树而并查集的数组对应的是森林可以抽象成很多的树并且每棵树也不一定是二叉树任意形状均可。 初始化数组时数组存储内容均为自己的下标表示每个节点的父节点都是自己previous译为先前的在这里正好表示某一个元素的父节点元素下标是多少。 合并两个节点实际上是合并这两个节点分别对应的根节点这里可能会有人有疑问为什么不合并非根节点呢如果你合并非根节点让非根节点指向另一个非根节点那么2棵树直接变成三棵树了。并查集合并算法的性能瓶颈其实是在找根的操作上如果一棵树的高度是N那么找根的时间复杂度其实就是O(N)了这样的效率实际上是很低的所以后面会进行三种方式的优化。 统计并查集中树的个数其实也比较简单只需要统计根节点是自己的节点个数即可。 2.路径压缩
如果我们能够缩短查找根节点过程中的路径那么合并两棵树的效率就会很高如下图所示如果路径压缩到一层那么查找根的时间复杂度就接近于O(1)所以路径压缩这种方式效率是很高的。 下面的图其实主要想给大家展示路径压缩的好处但在我们的代码里面左边这种单分支情况的树一定是不会出现的因为每次任意两棵树合并时在查找根期间都会做路径压缩从节点个数为1开始进行任意树的合并一定是不会出现左边这种4个节点串起来的情况的所以下面的图仅仅是为了展示路径压缩的优点而已。 下面是递归版本的压缩路径 下面是循环版本的压缩路径 3.按秩合并
秩的英文是rankrank还有排名等意思但在并查集这里秩其实表示的是树的高度当两棵树合并时为了让合并后的效率更高我们通常选择将树高度小于等于另一棵树的树主动合并到较高的那棵树上去这样有一个好处树整体的高度可能不会改变或者是增加1这两种情况都是比较好的。 那么如何维护树的高度呢我们只需要一个rnk数组即可在合并的时候判断两棵树的高低将较小的树合并到较大树上同时维护rnk数组如果两棵树高度相等合并操作无所谓例如x合并到y上那么y的高度需要1x的高度不变。时间复杂度近似于O(logN)。 4.启发式合并
启发式合并与按秩合并较为相似只不过启发式合并是按照树中节点个数的多少来合并的在合并时尽量让节点个数较少的树合并到节点个数较多的树上这种优化方式的时间复杂度和按秩合并是近似的都是O(logN)。如何维护树的节点个数大小呢只需要维护一个sz数组即可。 这两种方式虽然没有路径压缩那么优秀但其实在oj里面从消耗时间上来看其实三种优化方式都是差不多的因为题目所给数据构成的树可能不是很高所以O(logN)渐进于O(1) 5.练习题
547.省份数量
该题给出了邻接矩阵我们只需要遍历上半部分将相连的城市合并到一个连通块当中最后统计并查集中连通块的总数即为省份的数量。 压缩路径按秩合并启发式合并在下面这道题中你都可以试试优化效果还是很明显的 990.等式方程的可满足性
为了让代码看起来优雅一些用了递归的写法但时间复杂度不太理想可能因为栈调用太深了栈的建立和销毁也耗费了大部分时间我用循环版的压缩路径试过3ms即可AC效果还是比较理想的
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/913294.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!