zoukankan      html  css  js  c++  java
  • 【algorithms IV】带权重的并查集算法

    问题

    普通的Union-find并查集算法没有加入权重, 可以构造特别的输入使得每次合并的时候高的树HighTree以低的树LowTree的根【root(LowTree)】为新的根, 造成树的不平衡,从而使得效率下降。

    用一个新的数组标记节点当前的高,可以用来在合并的时候减少时间。

    当然了,这种方法的空间复杂度会提高一倍,看实际情况使用了。

    public class WeightedQuickUnionUF {
        private int[] id; // parent link (site indexed)
        private int[] sz; // size of component for roots (site indexed)
        private int count; // number of components
    
        public WeightedQuickUnionUF(int N) {
            count = N;
            id = new int[N];
            for (int i = 0; i < N; i++)
                id[i] = i;
            sz = new int[N];
            for (int i = 0; i < N; i++)
                sz[i] = 1;
        }
    
        public int count() {
            return count;
        }
    
        public boolean connected(int p, int q) {
            return find(p) == find(q);
        }
    
        private int find(int p) { // Follow links to find a root.
            while (p != id[p])
                p = id[p];
            return p;
        }
    
        public void union(int p, int q) {
            int i = find(p);
            int j = find(q);
            if (i == j)
                return;
            // Make smaller root point to larger one.
            if (sz[i] < sz[j]) {
                id[i] = j;
                sz[j] += sz[i];
            } else {
                id[j] = i;
                sz[i] += sz[j];
            }
            count--;
        }
    }
  • 相关阅读:
    高性能JavaScript
    高性能CSS
    去掉超链接文字点击后的灰色框
    高性能HTML
    css整站规划
    css hack 和问题
    IE6支持min-width、max-width CSS样式属性
    WPF草稿
    正则表达式学习日记zz
    详解Adorner Layer(zz)
  • 原文地址:https://www.cnblogs.com/wangzming/p/7895983.html
Copyright © 2011-2022 走看看