并查集解析

何为并查集??

  在计算机科学中,并查集(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 亲戚