并查集
定义:并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。常常在使用中以森林来表示。
核心思想
- 以一颗有根树代表每个集合。
- 每个节点维护一个指向其父节点的链接。
- 对于每个集合根节点为该集合的代表。
- 例如: 集合{x,y,z}和{a,b,c,d}。

主要操作
- Find(X):查找元素X所在集合,可用于确定两个元素是否在相同的子集中。
- Union(x,y):将元素x,y所在的两个集合中合并为一个集合。
并查集实现
简单实现
1 | // Naive implementation of find |
上面的Union()和Find()实现,最坏的情况下,会产生一个很深的树,成一个链表,find()的时间复杂度是线性的O(n)。以下是一个最坏情况的示例:
1 | 假设有四个元素0,1,2,3 |
Union()优化:按秩合并
按秩合并,即合并时总是在更深的树根下附加更小深度的树。此时,最坏情况下,find()的时间复杂度为O(Logn)。以下为按秩合并示例:
1 | 最初每个元素为一个单元素子集 |
find()优化:路径压缩
路径压缩,即在执行find(x)时,“顺便”将x的父节点改为查找到的根节点,以后再调用find(x)就只需O(1)的时间且如果x是子树的根,那么子树的所有节点到根节点的路径都会被压缩。
1 | 假设在如下子集调用find(3) |
按秩合并和路径压缩两种优化下的并查集,find()的时间复杂度小于O(Logn)。
并查集应用——检测无向图中的环
原理:对于图的每个边,找到每个边的两个顶点集,如果两个顶点集相同,则找到一个环。
C语言实现
1 | #include <stdio.h> |
如果对你有帮助的话,Star✨下一吧!