union-find算法改善(二)

使用上一篇的使用来实现union-find算法,即用一个辅助数组来记录分量的权,每次都让权小的分量合并到权大的分量上,这样可以有效的保障算法再任何情况下的执行效率,每次union()都把分量小的合并到分量大的分量上。这样我们构造出来的树结构的层数就会减小。
代码实现:

public class UF(){
    private int[] a;
    private int[] sz;
    private int count;
    //初始化,sz存储分量的权,刚开始每个分量只有一个触点,所有sz[i]=1
    public UF(int cap){
        count = cap;
        a = new int[cap];
        sz = new int[cap];
        for(int i=0;i<cap;i++){
            a[i] = i;
            sz[i]=1;
        }   
   }
   //找到分量的标记
   public int find(int p){
        while(p!=a[p]) p = a[p];
        return p;
    }
    //连接两个触点,每次遍历权小的分量
    public void union(int p,int q){
        int rootP = find(p);
        int rootQ = find(q);
        if(sz(rootP)<sz(rootQ)){
            a[rootP] = rootQ;
            sz[rootQ]+=sz[rootP];
        }else{
            a[rootQ]=rootP;
            sz[rootP]+=sz[rootQ];
        }
        count--;
    }
    //测试触点是否已连接
    public boolean connected(int p,int q){
        return find(p)==find(q);
    }
    //返回分量的数量
    public int count(){
        return count;   
    }

}

猜你喜欢

转载自blog.csdn.net/qq_37520037/article/details/81589088