quick-union

注意:

union() //union是在判断2个触点(sites)不是连通分量的时候 ,要执行merge操作
组合的时候有个地方需要注意:

获取到2个触点的顶层结点 pID、qID 把id[pID] = qID (改变的是顶层的结点)

比如下图:
p = 5 q = 9 时, id[] = {},
5和9往上找根触点, 5的根是1(用5↑ 表示),9的是8(用9↑ 表示)
需要把id[p=5↑] = id[9↑] (也就是8也就是find(q))。

总结:
  1. 顶层的触点都是值和索引相等
  2. 每次修改一位


    quick-union_第1张图片
    private int[] parent;
    private int count;
    public QuickUnionUF(int n){
        parent = new int[n];
        count = n;
        for (int i = 0; i < n; i++) {
            parent[i] = i;
        }
//      System.out.println();
    }
    public int count() {
        return count;
    }
    public int find(int p){
        validate(p);
        while(p != parent[p]){
            //如果p不等parent[p],则存在父节点(parent[parent[p]])
            //直到根节点  根节点可以想成一个指向自己的结点,也就是自环
            p = parent[p];
        }
        return p;
    }
    // validate that p is a valid index
    private void validate(int p) {
        int n = parent.length;
        if (p < 0 || p >= n) {
            throw new IllegalArgumentException("index " + p + " is not between 0 and " + (n-1));
        }
    }
    
    public boolean connected(int p, int q){
        return find(p) == find(q);
    }
    
    public void union(int p, int q){
        int rootP = find(p);
        int rootQ = find(q);
        if(rootP == rootQ){
            return;
        }
        parent[rootP] = rootQ;
        count--;
    }

你可能感兴趣的