美文网首页
quick-union

quick-union

作者: KeDaiBiaO1 | 来源:发表于2017-10-16 17:29 被阅读0次
    注意:

    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. 每次修改一位


        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--;
        }
    

    相关文章

      网友评论

          本文标题:quick-union

          本文链接:https://www.haomeiwen.com/subject/voqluxtx.html