【并查集】基本思想与操作

1.并查集是什么?
并查集是一种数据结构,通过维护每个点所在的集合,可以处理一些不相交集合(Disjoint Sets)的合并及查询问题
2.并查集如何实现
我们可以将每个集合视作一棵树,用这棵树的根的编号代表这个集合,最开始所有点都属于不同的集合,即每个点为其所在的树的根。
在合并集合时,我们可以将其中一个集合的根的父亲设为另一个集合的根的父亲,找父亲操作我们可以通过从当前点往其父亲跳来实现(当没有父亲时,这个点即为本集合的根),找到两个点所在的集合,然后将其合并,合并可以视为让一个集合包含另一个集合。
具体操作如下图:
假如我们有一些点,第i秒加入t[j]为i的一条边
例如我们第一秒加入(1,2)(3,4),第二秒加入(2,4),第三秒加入(3,1)。
第零秒
这里写图片描述
第一秒
这里写图片描述
第二秒
这里写图片描述
第三秒
这里写图片描述
3.并查集有什么用
最基本的是可以查询两点是否联通,即两点的关系,这也是应用最广的
于是在用克鲁斯卡尔建最小生成树时,可以用并查集判断是否需要加入此边
也可以查询u到v的路径中的最小边权
4.并查集的其他操作
1.路径压缩
由于查找父亲,这个算法如果不用路径合并的话时间复杂度会非常大
如下图:
这里写图片描述
但如果我们每次查找根时,顺手将这个节点的父亲设为根,那么下次查询时复杂度是不是就变为o(1)了?
这里写图片描述
路径压缩后每个点到根的距离均为1,且仍然在同一个集合。
这样可以使复杂度大大减小。
2.按秩合并
如果我们路径压缩,会丢失一些信息,如两个点的最早联通时间,但如果我们不路径压缩,时间复杂度会很大,所以我们考虑按秩合并。
秩可以理解为每个集合的深度,即其到达最远的节点所需经过的最小层数。
秩的初始值为1,每次我们合并时将秩大的集合连向秩小的集合,这样每次合并两个集合,层数最多为两个集合的最大层数+1。
因为秩大的集合连向了秩小的集合,所以秩小的集合的秩有两种变化可能:1.保持不变。2.变为秩大的集合的秩+1。
查询一次的复杂度大概为logn。
5.总结
这次算法介绍大概是我打的最长的一个,其实总共也就两个,然而就这么短也花了我一个小时,
实现还是比较简单的,程序也很短,就不贴标了。
祝你好运

猜你喜欢

转载自blog.csdn.net/JZHu_Ming_Han/article/details/81782745
今日推荐