Skip to content

Latest commit

 

History

History
80 lines (67 loc) · 1.88 KB

File metadata and controls

80 lines (67 loc) · 1.88 KB

##Union Find

###Basic Java Model 优化前合并与查找时间复杂度都是O(n) Compressed path优化后 都是O(1) union find不支持删除操作

###Implementation

	class UnionFind{
		/*
		用数组或者hashmap都可以
		 */
		HashMap<Integer, Integer> hashmap = new HashMap<Integer, Integer>();
		UnionFind(HashSet<Integer> hashSet){
			for(Integer now : hashSet) {
				hashmap.put(now, now);
			}
		}
        int find(int x){
	     /*
		当没找到自己是根节点的时候,就继续深度遍历进入曾祖父找,直到找到最后的根节点
		 */
        	int parent =  hashmap.get(x);
        	while(parent!=hashmap.get(parent)) {
        		parent = hashmap.get(parent);
        	}
        	return parent;
        }
        int compressed_find(int x){
        	int parent =  hashmap.get(x);
        	while(parent!=hashmap.get(parent)) {
        		parent = hashmap.get(parent);
        	}
        	int temp = -1;
        	int fa = hashmap.get(x);
        	while(fa!=hashmap.get(fa)) {
        		temp = hashmap.get(fa);
        		hashmap.put(fa, parent) ;
        		fa = temp;
        	}
        	return parent;

        }

        void union(int x, int y){
        	int root_x = find(x);
        	int root_y = find(y);
        	if(root_x != root_y) {
        		hashmap.put(root_x, root_y);
        	}
        }
	}

###题目参考

  • Find the Weak Connected Component in the Directed Graph

###课件参考

###Better Solution

just change the root of p to q, not every element to q

###Still two ways to better to improve

1: Weighted quick-union

2: Path Compression

####Summary