百度百科
并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中。其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。
并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。
并查集
并查集是一种树形结构,保持了一组不相交的动态集合,每个集合通过一个代表来识别,代表即集合中的某个成员,通常选择根做这个代表。这样,每次只需要查找每个元素的代表,就能知道他们是否属于同一个集合。
主要操作
查找根节点
private static int findfather(int a)
{
//如果当前节点的父节点是自己,表明他是一个集合
if (a==father[a])
return a;
//如果当前节点的父节点不是自己,那么将递归寻找,并最终找到顶级节点,并且也是压缩路径,即尽力让每个结点直接与父节点相关联
father[a]=findfather(father[a]);
return father[a];
}
合并两个元素到同一个集合
private static void union(int a, int b) {
//找出元素a的父节点
a=findfather(a);
//找出元素b的父节点
b=findfather(b);
//如果两个人的父节点不相等,把其中的一个元素合并到另外的一个元素的集合中,即改变等待合并的元素的父节点为对方元素的父节点。
if (a!=b)
{
father[b]=a;
}
}
思想
就是给每个元素寻找一个标记,作为一种身份的象征,这样,我们可以通过这些身份的象征迅速的辨别到该元素是属于哪个集合的。