并查集解析
何为并查集??
在计算机科学中,并查集(Union-Find)是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。 并查集存在两个操作(1.union 联合 2.find 查找) 和一个需要解答的问题(1.isConnected 或 isSameSet 是否是相互连接,或者说是否在同一个集中)
标准定义
在一些应用问题中,需要将n个不同的元素划分成一组不相交的集合。开始时每个元素自成一个单元素集合,然后按照一定规律将归于同一组元素的集合合并,在此过程中需要反复查询某个元素归属于哪个集合的运算,适合于描述这类问题的抽象数据类型称为并查集(union-find set)。
个人理解
并查集是一种支持合并和查询的集合,这种集合是一种通常是通过树形结构来进行实现。
并查集的三种操作
(1)Union(R1, R2):把子集合R2并入集合R1中。要求这两个集合互不相交,否则不执行合并。
(2)Find(x):搜索单元素x所在的集合,并返回该集合的祖先。
(3)Set(x):构造函数,将并查集中x个元素初始化为x个只有一个单元素的子集合。
并查集的优化——路径压缩
效果示意图
原理:在进行Find()函数时,将每个访问过的结点的祖先更新为树根
算法的实现:
int Find(int x)//查找x的祖先 { if(Father[x]!=x) Father[x]=Find(Father[x]);//路径压缩 return Father[x]; }
经典例题
P1551 亲戚