并查集的学习

并查集是一种树型的数据结构,并查集可以高效地进行如下操作:

1、查询元素p和元素q是否属于同一组

2、合并元素p和元素q所在地组

并查集的学习_第1张图片

 并查集结构:

是一种树型结构,这棵树地要求比较简单

1、每个元素都唯一对应一个节点

2、每一组数据中地多个元素都在同一棵树内

3、一个组中的数据对应的树和另外一个组中的数据对应的树之间没有任何联系

4、元素在树中没有子父级关系的硬性要求

并查集的学习_第2张图片

 并查集的查找思路:

在数组中寻找,根据下标找到对应的元素,该元素如若不等于下标,则为该下标的父节点。当下标值等于对应下标元素的值,便是找到所要查找元素分组的标识符,思路图如下所示

并查集的学习_第3张图片

 并查集的合并思路:

找到p,q的根节点,让p所在树的根节点的父节点为q的根节点即可:

并查集的学习_第4张图片

 并查集的路径压缩优化(以上方法可能会生成线性树,使得查找的最大时间复杂度为On),为了降低查找的时间复杂度,

提高find的效率,我们可以在合并的时候,将小树合并到大树中,最大程度降低树的深度。

 并查集的学习_第5张图片

 最终并查集的代码结构如下所示

   public class UF{
        //记录节点元素和该元素所在分组的标识
        private int[] eleAndGroup;
        //记录并查集中数据的分组个数
        private int count;
        //用来存储每一个根节点对应树中保存的节点的个数
        private int[]sz;
        //初始化并查集
        public UF(int N){
            this.count=N;
            this.eleAndGroup=new int[N];
            for (int i = 0; i < eleAndGroup.length; i++) {
                eleAndGroup[i]=i;
            }
            this.sz=new int[N];
            //默认情况下,sz每个索引处的值都是1
            for(int i=0;i

你可能感兴趣的:(学习,算法)