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分钟还没出来

浙公网安备 33010602011771号