Week 1: Union-Find读书笔记[Normal Union Find]

Week 1: Union-Find

  实现segwick所说的Union quick find 按照数组保存每个数组中保存该集合的头index, 判断是否连接的时候复杂度为O(1), 但是合并集合的复杂度为O(n)

public class Week01 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        
        int N = StdIn.readInt();
        System.out.println(N);
        UnionFind uf = new UnionFind(N);
        long sTime=System.currentTimeMillis();
        while (!StdIn.isEmpty())
        {
            int p = StdIn.readInt();
            int q = StdIn.readInt();

            if (!uf.isConnected(p, q))
            {
                uf.union(p, q);
                //System.out.println(p + " " + q);
            }
        }
        long eTime=System.currentTimeMillis();
        
        System.out.println("[CostTime] : "+(eTime-sTime) + "ms"+ " [Unit Count] : " + uf.GetUnitCount());
    }

}

/**
 * 
 *  复杂度 M次操作 * N  
 *
 */

class UnionFind {
    
    UnionFind(int count) {
        Init(count);
    }
    
    void Init(int count) {
        this.count = count;
        this.unitcount = count;
        collection = new int[count];
        for(int i = 0; i < count; i++) {
            collection[i] = i;
        }
    }
    
    /*
     * 复杂度 为 O(1) 检测头检点是否相同
     */
    boolean isConnected(int a, int b) {
        return ( (collection[a] == collection[b]) || (a == b) );
    }
    
    /**
     * 复杂度为O(n) 需要循环修改array内的值 
     */
    void union(int a, int b) {
        /**
         * 错误的方式 【使用了collection[a] 可能变化的值来判断】
         * for(int i = 0; i < count; i++) {
         *   if( collection[a] == collection[i]) {
         *       collection[i] = collection[b];
         *   }
         *  }
         * 
         * 
         */
        int tmp = collection[a];
        for(int i = 0; i < count; i++) {
            if( tmp == collection[i]) {
                collection[i] = collection[b];
            }
        }
        
        this.unitcount--;
        return;
    }
    
    int GetUnitCount() {
        return this.unitcount;
    }
    private int[] collection;
    private int count;
    private int unitcount;
}


分别用小数据 中数据 大数据测试结果如下:

大数据等了20分钟还没出来

 

 

 

posted @ 2014-02-21 14:33  CodePUB  阅读(63)  评论(0)    收藏  举报