Loading

并查集

public class Based_on_rank_optimize {
    private int[] parent;
    private int[] rank;    //rank[i]表示以i为根的树层数
    private int count;
    
    public Based_on_rank_optimize(int n) {
        // TODO Auto-generated constructor stub
        this.parent = new int[n];
        this.count = n;
        this.rank = new int[n];
        
        for(int i = 0; i < n; i ++) {
            parent[i] = i;
            rank[i] = 1;        //有时候用0也是可以的
        }
    }
    
    int find(int p) {
        assert (p >= 0 && p < count);
//        while(p != parent[p]) {        //路径压缩,一般用这个
//            parent[p] = parent[parent[p]];
//            p = parent[p];
//        }
//        return p;                    //两种路径压缩
        
        if(p != parent[p])        //逻辑上更优,但由于递归开销大,实践更慢
            parent[p] = find(parent[p]);    
        return parent[p];
    }
    
    boolean isConnected(int p, int q) {
        return find(p) == find(q);
    }
    
    void unionElements(int p, int q) {
        int pRoot = find(p);
        int qRoot = find(q);
        
        if(pRoot == qRoot)
            return;
        
        if(rank[pRoot] > rank[qRoot]) {
            parent[qRoot] = pRoot;
        }
        else if(rank[pRoot] < rank[qRoot]){
            parent[pRoot] = qRoot;
        }
        else {
            parent[pRoot] = qRoot;
            rank[qRoot] += 1;
        }
        
    }
}

 

posted @ 2018-03-21 10:56  机智的小白  阅读(141)  评论(0)    收藏  举报